MFC控件编程之鼠标跟键盘消息

MFC(Microsoft Foundation Classes)是Microsoft Visual C++的一个类库,用于Windows GUI程序开发。在MFC编程中,控件编程是一个重要的部分,涉及到用户界面的交互。

鼠标消息

在MFC中,处理鼠标消息需要重载控件的OnMouseMove、OnLButtonDown、OnLButtonUp、OnRButtonDown、OnRButtonUp、OnMButtonDown和OnMButtonUp等函数。

OnMouseMove函数:

在OnMouseMove函数中,可以获取鼠标的位置和状态,可以实现鼠标移动时的一些效果。下面是一个示例代码:

void CMyView::OnMouseMove(UINT nFlags, CPoint point)

{

// 当左键按下时,拖拽窗口

if (nFlags & MK_LBUTTON)

{

CRect rect;

GetWindowRect(rect);

ScreenToClient(rect);

rect.OffsetRect(point - m_ptLastMousePos);

MoveWindow(rect);

}

m_ptLastMousePos = point;

}

上面的代码实现了鼠标左键拖拽窗口的功能,GetWindowRect获取控件的位置信息,ScreenToClient转换为客户区坐标系,OffsetRect移动控件的位置。

OnLButtonDown函数:

在OnLButtonDown函数中,可以处理鼠标左键按下的事件,可以实现一些按键事件。下面是一个示例代码:

void CMyView::OnLButtonDown(UINT nFlags, CPoint point)

{

// 在当前位置添加一个矩形

CRect rect(point.x - 10, point.y - 10, point.x + 10, point.y + 10);

m_RectList.AddTail(rect);

Invalidate();

}

上面的代码实现了在当前鼠标位置添加一个矩形的功能,AddTail添加一个矩形到链表中,Invalidate刷新控件。

OnLButtonUp、OnRButtonDown、OnRButtonUp、OnMButtonDown和OnMButtonUp函数:

这些函数的用法和OnLButtonDown函数类似,可以根据需要处理鼠标事件。

键盘消息

在MFC中,处理键盘消息需要重载控件的OnKeyDown、OnKeyUp和OnChar等函数。

OnKeyDown和OnKeyUp函数:

在OnKeyDown和OnKeyUp函数中,可以处理键盘按下和松开的事件,可以实现一些按键事件。下面是一个示例代码:

void CMyView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

{

// 判断键盘按键是否为ESC键,关闭窗口

if (nChar == VK_ESCAPE)

{

SendMessage(WM_CLOSE);

}

}

上面的代码实现了按下ESC键关闭窗口的功能,SendMessage发送消息关闭窗口。

OnChar函数:

在OnChar函数中,可以处理字符输入事件,可以实现一些字符输入相关的操作。下面是一个示例代码:

void CMyView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

// 绘制输入字符

CString strChar;

strChar.Format(_T("%c"), nChar);

m_strText += strChar;

Invalidate();

}

上面的代码实现了在控件中绘制输入的字符的功能,Format格式化字符,m_strText存储访问过的字符,Invalidate刷新控件。

案例说明

下面的案例说明了如何在MFC控件中处理鼠标和键盘消息,实现一些基本的交互功能。

步骤1:创建一个MFC工程

首先,打开Visual Studio,选择创建一个新的MFC应用程序。在MFC应用程序向导中,选择“生成一个SDI应用程序”,选择一个适合的项目名称和位置。

步骤2:添加一个显示文本的控件

在MFC应用程序中,在CMainFrame类中添加一个显示文本的控件。打开MainFrame.h文件,在类定义中添加一个CEdit类指针:

class CMainFrame : public CFrameWnd

{

...

CEdit *m_pEdit;

...

};

在MainFrame.cpp文件中,在类的构造函数中创建控件,并设置控件的位置和属性:

CMainFrame::CMainFrame()

{

...

m_pEdit = new CEdit();

m_pEdit->Create(WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY,

CRect(10, 10, 200, 100), this, IDC_EDIT);

...

}

上面的代码创建了一个多行只读的编辑框,设置其位置在(10,10)到(200,100)。

步骤3:处理鼠标消息

在CMainFrame类中添加重载函数OnMouseMove、OnLButtonDown、OnLButtonUp、OnRButtonDown、OnRButtonUp、OnMButtonDown和OnMButtonUp。

在OnMouseMove函数中,实现拖拽窗口的功能:

void CMainFrame::OnMouseMove(UINT nFlags, CPoint point)

{

// 当左键按下时,拖拽窗口

if (nFlags & MK_LBUTTON)

{

CRect rect;

GetWindowRect(rect);

ScreenToClient(rect);

rect.OffsetRect(point - m_ptLastMousePos);

MoveWindow(rect);

}

m_ptLastMousePos = point;

}

在OnLButtonDown函数中,实现在当前位置添加一个矩形的功能:

void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)

{

// 在当前位置添加一个矩形

CRect rect(point.x - 10, point.y - 10, point.x + 10, point.y + 10);

m_RectList.AddTail(rect);

Invalidate();

}

在OnLButtonUp、OnRButtonDown、OnRButtonUp、OnMButtonDown和OnMButtonUp函数中,根据需要处理鼠标事件。

步骤4:处理键盘消息

在CMainFrame类中添加重载函数OnKeyDown、OnKeyUp和OnChar。

在OnKeyDown函数中,实现按下ESC键关闭窗口的功能:

void CMainFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

{

// 判断键盘按键是否为ESC键,关闭窗口

if (nChar == VK_ESCAPE)

{

SendMessage(WM_CLOSE);

}

}

在OnChar函数中,实现在控件中绘制输入的字符的功能:

void CMainFrame::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

// 绘制输入字符

CString strChar;

strChar.Format(_T("%c"), nChar);

m_strText += strChar;

Invalidate();

}

步骤5:绘制图形和文本

在CMainFrame类中添加重载函数OnPaint,在函数中实现绘制图形和文本的功能:

void CMainFrame::OnPaint()

{

CFrameWnd::OnPaint();

CPaintDC dc(this);

// 绘制矩形

POSITION pos = m_RectList.GetHeadPosition();

while (pos != NULL)

{

CRect rect = m_RectList.GetNext(pos);

dc.Rectangle(rect);

}

// 绘制文本

dc.TextOutW(10, 110, m_strText);

}

上面的代码通过循环绘制链表中的矩形,TextOutW绘制文本。

步骤6:运行程序

编译程序后,运行程序,可以通过鼠标拖拽窗口、添加矩形,键盘输入字符等操作与程序进行交互。

结论

本文介绍了在MFC控件编程中如何处理鼠标和键盘消息,以及一个简单的案例。掌握这些知识可以实现更加丰富的用户界面交互。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(20) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部