上一次写了个简单的绘图窗口
https://www.toutiao.com/i6711113293437600263/
仅仅做出了简单绘图。
Windows窗口讲究与用户互动,而鼠标和键盘则是互动的媒介,也就是说窗口捕获鼠标和键盘的操作利于窗口互动。
所以今天的任务就是研究MFC窗口如果利用鼠标和键盘互动。
查阅微软开发文档,鼠标输入有很多消息;对我们来说,常用的有
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_MBUTTONDOWN
WM_MBUTTONUP
WM_MBUTTONDBLCLK
WM_RBUTTONDOWN
WM_RBUTTONUP
WM_RBUTTONDBLCLK
WM_MOUSEMOVE
在CWnd类中,针对上述鼠标消息对应的保护方法有:
CWnd::OnLButtonDblClk 当用户双击鼠标左键时调用。
CWnd::OnLButtonDown 当用户按下鼠标左键时调用。
CWnd::OnLButtonUp 当用户释放鼠标左键时调用。
CWnd::OnMButtonDblClk 当用户双击鼠标中键时调用。
CWnd::OnMButtonDown 当用户按下鼠标中键时调用。
CWnd::OnMButtonUp 当用户释放鼠标中键时调用。
CWnd::OnRButtonDblClk 当用户双击鼠标右键时调用。
CWnd::OnRButtonDown 当用户按下鼠标右键时调用。
CWnd::OnRButtonUp 当用户释放鼠标右键时调用。
CWnd::OnMouseMove 当鼠标光标移动时调用。
同样的,针对键盘:
WM_SETFOCUS CWnd::OnSetFocus 在 CWnd 获取输入焦点之后调用
WM_KILLFOCUS CWnd::OnKillFocus 恰好在 CWnd 失去输入焦点之前调用。
WM_KEYUP CWnd::OnKeyUp 当释放非系统键时调用。
WM_KEYDOWN CWnd::OnKeyDown 当按下非系统键时调用。
WM_CHAR CWnd::OnChar 当击键转换为非系统字符时调用。
WM_SYSKEYUP CWnd::OnSysKeyUp 当用户释放在按住 ALT 键的同时按下的键时调用。
WM_SYSKEYDOWN CWnd::OnSysKeyDown 当用户按住 ALT 键,然后按下另一个键时调用。
鼠标和键盘最大的区别就在于键盘每次输入的按键不一样,所以处理键盘消息时,通常以焦点来获取。
为此,这次我们将实现鼠标和键盘的互动,为简化代码,加深理解。利用前两次学会的代码来编写此次代码:
我们将点击鼠标左键显示一个字符串“您点击了鼠标左键”
点击鼠标右键显示点击了鼠标右键
按下键盘显示按下的案件内容。
开始吧。。。。。。。。。。。。。。。。。。。。。。。。。
增加窗口的左键按下方法并增加映射 afx_msg void OnLButtonDown(
UINT nFlags,
CPoint point);
编写代码如下:
void MyWnd::OnLButtonDown(UINT nFlags,CPoint point)
{
CClientDC dc(this);
CString s;
s.Format("nFlags的值是:%d 位于点的位置是(%d,%d)", nFlags, point.x, point.y);
dc.TextOutA(10, 10, s);
}
编译运行,鼠标点击后成功获得了鼠标位置。
按上述方法增加代码:最后代码如下:
#include <afxwin.h>
class MyWnd :public CFrameWnd
{
public:
MyWnd()
{
Create(NULL, "窗口");
}
protected:
afx_msg void OnPaint()
{
}
afx_msg void OnLButtonDown(
UINT nFlags,
CPoint point);
afx_msg void OnSetFocus(CWnd* pOldWnd);
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg void OnKeyUp(
UINT nChar,
UINT nRepCnt,
UINT nFlags);
afx_msg void OnKeyDown(
UINT nChar,
UINT nRepCnt,
UINT nFlags);
DECLARE_MESSAGE_MAP()
};
class MyApp:public CWinApp
{
public:
BOOL InitInstance()
{
m_pMainWnd = new MyWnd();
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
};
BEGIN_MESSAGE_MAP(MyWnd, CFrameWnd)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_WM_SETFOCUS()
ON_WM_KILLFOCUS()
ON_WM_KEYDOWN()
ON_WM_KEYUP()
END_MESSAGE_MAP()
MyApp app;
void MyWnd::OnLButtonDown(UINT nFlags,CPoint point)
{
CClientDC dc(this);
CString s;
s.Format("nFlags的值是:%d 位于点的位置是(%d,%d)", nFlags, point.x, point.y);
dc.TextOutA(10, 30, s);
}
void MyWnd::OnSetFocus(CWnd* pOldWnd)
{
CClientDC dc(this);
CString s;
s.Format("我获得焦点!" );
dc.TextOutA(10, 10, s);
}
void MyWnd::OnKillFocus(CWnd* pNewWnd)
{
CClientDC dc(this);
CString s;
s.Format("我失去焦点!");
dc.TextOutA(10, 10, s);
}
void MyWnd::OnKeyUp(
UINT nChar,
UINT nRepCnt,
UINT nFlags)
{
CClientDC dc(this);
CString s;
s.Format("您松开了%c键,nRepCnt为%d,nFlags为%d", nChar, nRepCnt, nFlags);
dc.TextOutA(10, 70, s);
}
void MyWnd::OnKeyDown(
UINT nChar,
UINT nRepCnt,
UINT nFlags)
{
CClientDC dc(this);
CString s;
s.Format("您按下了%c键,nRepCnt为%d,nFlags为%d",nChar,nRepCnt,nFlags);
dc.TextOutA(10, 50, s);
}
编译运行!

以后,我们可以在Windows窗体中使用鼠标和键盘互动了。
| 留言与评论(共有 0 条评论) |