1. 鼠标
1)鼠标信息分为两类:客户区消息和非客户区消息
注:鼠标消息总是被发送到光标所在的窗口,比如:用户在A窗口按下鼠标左键,在B窗口释放鼠标左键,那么在A窗口会收到消息WM_LBUTTONDOWN,而在B窗口会收到WM_LBUTTONUP。
2)滚轮
在鼠标滚轮滚动时,系统会不停发送WM_MOUSEWHEEL给接收窗口,窗口会调用类CScrollView中默认的消息处理函数。
3)鼠标捕获
鼠标捕获就是窗口接收到鼠标按键按下消息后,在鼠标按键释放之前仍然可以接收鼠标消息,直到鼠标按键释放或者撤销鼠标捕获。鼠标捕获解决了窗口需要接收的鼠标消息在窗口外的问题。
MFC使用SetCapture来捕获鼠标,用ReleaseCapture撤销鼠标捕获
4)光标
鼠标在屏幕上的显示。每个窗口都对应一个WNDCLASS结构:
typedef struct tagWNDCLASSW {
UINT style;
WNDPROC lpfnWndProc;
int cbCl***tra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCWSTR lpszMenuName;
LPCWSTR lpszClassName;
} WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;
里面定义了窗口类的基本属性,其中字段HCURSOR hCursor保存了光标的句柄,该光标就是在窗口客户区上显示的样式。
鼠标移动的处理过程:用户移动的鼠标->Windows系统通过重绘光标背景将光标从旧的位置清除->系统对光标所在窗口发送命中测试码WM_SETCURSOR消息->窗口调用消息响应函数::OnSetCursor判断光标所在区域,实现光标在新的位置呈现
2. 键盘
用户按下或释放某个按键一下,就会产生一个中断,该中断激活键盘驱动程序KEYBOARD.DRV来对键盘中断进行处理,KEYBOARD.DRV程序会根据用户的不同操作进行编码,然后调用Windows用户模块USER.EXE生成键盘消息,并将该消息发送到消息队列中等候处理。
1)键盘消息,按下/释放
WM_KEYDOWNW---WM_KEYUP
WM_SYSKEYDOWNW---WM_SYSKEYUP
击键消息分为系统击键消息和非系统击键消息。系统击键消息是指由Alt键和其他键组合而产生的按键消息以及操作按键F10产生消息。系统消息将交由Windows的函数DefWindowProc处理。如果用户要处理,应该在处理完这些消息后,再将其发送给函数DefWindowProc,以使Windows系统能够正常工作。
除了系统击键消息以外的所有键盘消息都是非系统击键消息,用于应用程序窗口
键盘字符消息:WM_CHAR/WM_SYSCHAR
击键消息的处理函数:afx_msg void OnMsgName(UINT nChar, UINT nRepCnt, UINT nFlags)
MsgName可以是KEYDOWN, KEYUP,其中nChar,按键的虚拟键代码,nRepCnt按键重复的次数,nFlags包含按键扫描码和多个标志。
2)焦点
鼠标消息-->向光标所在的窗口发送消息
键盘消息-->向具有“输入焦点”的窗口发送消息
通常情况下,具备输入焦点的窗口是活动应用程序的主窗口,也可能属于主窗口的子窗口或者对话框的编辑控件
WM_SETFOCUS/WM_KILLFOCUS使得窗口获得或失去输入焦点
阅读(3087) | 评论(0) | 转发(0) |