鼠标和键盘在窗口中的使用(理解消息机制)

上一次写了个简单的绘图窗口

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 条评论)
   
验证码:

相关文章

推荐文章

'); })();