6.1使用鼠标
6.1.1鼠标时间和鼠标消息
根据用户操作鼠标时鼠标的位置,鼠标消息分为两类:客户区鼠标消息和非客户区鼠标消息。
1. 客户去鼠标消息
2. 当鼠标光标位于窗口的用户区时,将生成客户鼠标消息。鼠标消息和键盘消息有所不同,Windows只将键盘有消息发送给具有输入极点的窗口,但鼠标消息不受这种限制,只要鼠标通过某个窗口的客户区,该窗口便会收到WM_MOUSEMOVE消息。
6.1.2处理客户区鼠标消息
1.鼠标消息处理函数
MFC在CWnd类中提供了针对每一种鼠标消息的消息处理函数,通过VisualC++提供的映射机制,当发生鼠标时,系统系统即调用对应的消息处理函数,用户可以改写它们这样当发生鼠标消息时,系统即调用用户提供的消息处理函数。
3. 鼠标消息处理函数的参数
eg. OnMouseMove (UINT nFlags , CPoint point);
OnLButtonUP (UINT nFlags , CPoint point);
其两个鼠标消息处理函数的参数都是相同的:
(1) nFlags包含额外的鼠标键和键盘键的消息,以指出发生消息时某些鼠标键与键盘间的状态,可能的取值有以下几个:
MK_CONTROL:键盘上的Ctrl键被按下。
MK_LBUTTON:鼠标左键被按下。
MK_MBUTTON:鼠标中键被按下。
MK_RBUTTON:鼠标中右键被按下。
MK_SHIFT:键盘上的Sift键被按下。
If(nFlags & MK_SHIFT) //结果若为非零值则表示键被按下
(2) point参数包含鼠标指针的坐标位置,其类型为CPoint类。CPoint类是MFC预定义的用来描述点的类,其包含两个数据成员X和y,point.x内为鼠标指针的横坐标,point.y内位鼠标指针的从坐标。
6.1.3鼠标捕捉
为使所用鼠标消息均定向到某一窗口,而不管鼠标光标位于何处,就必须对鼠标加以捕捉,下面列出了与捕捉鼠标有光的两函数。
1. SetCapture()函数用于捕捉鼠标,其函数原型如下:
CWnd::SetCapture ();
2. ReleaseCapture()函数用于释放对鼠标的捕捉,其函数原型如下:
CWnd::ReleaseCapture ();
一旦窗口捕捉了鼠标,其他窗口无法得到鼠标消息,因此,当该窗口不再需要捕获所有的鼠标消息时,应及时调用ReleaseCapture ()函数释放鼠标,以便其他窗口可以正常接收消息。
6.2响应键盘
6.2.1键盘事件
1.与键盘有关的概念
(1)焦点
键盘由多个应用程序共享,但当在键盘上按下一个键时,只有一个窗口能接收到该键盘消息,能接收到键盘消息的窗口称为有“输入极点”的窗口。具有焦点的窗口可能是活动是活动窗口,也可能是活动窗口的子窗口。
当一个窗口获得输入焦点时,Windows向其发送一条WM_SETFOUCS消息而当其失去输入焦点时,Windows向其发送WM_KILLFOCUS消息。
(2)键盘扫描码与虚拟键代码
键盘上每一个有意义的键都对应着一个唯一的标识值,称为键盘扫描码,键盘扫描码与具体的键盘硬件有关,为了使应用程序不依赖于具体硬件,Windows系统中不使用虚拟键代码,它是由Windows系统根据键盘扫描码转换而成的一种标准的键标识符,对应用程序而言,它与具体设备无关。
2.键盘事件及对应的键盘消息
键盘消息与其他消息不一样,除按键本身能产生消息外,这些消息还被Windows转换成其他的消息再次发给拥有输入焦点的窗口。
键盘消息:
WM_KEYDOWN 非系统键按下
WM_CHAR 字符消息,由WM_KEYDOWN衍生
WM_DEADCHAR 死字符消息,由WM_KEYDOWN衍生
WM_KEYUP 非系统键释放
WM_SYSKEYDOWN 系统键按下
WM_SYSCHAR 系统字符消息,由WM_SYSKEYDOWN衍生
WM_SYSDEADCHAR 系统字符消息,有WM_SYSKEYDOWN衍生
WM_SYSKEYUP 系统键释放
(1) 系统键指Alt键与其他键的组合,这些键的功能是激活程序菜单或者系统菜单的选项,以及切换活动窗口等系统功能。
(2) 死字符是指本身不能显示但能修改其他字符显示的字符,主要出现在非英语键盘上怎么理解
6.2.2处理键盘事件
1.键盘事件处理函数
应用程序通常只需处理WM_KEYDOWN,WM_KEYUP和WM_CHAR消息,对这3个消息MFC在CWnd类中提供了相应的处理函数。
消息 | 处理函数 |
WM_KEYDOWN | Void OnKeyDown (UINT nchar , UINT nRepcnt, UINT nFlags) |
WM_CHAR | Void OnKeyDown (UINT nchar , UINT nRepcnt, UINT nFlags) |
WM_KEYUP | Void OnKeyDown (UINT nchar , UINT nRepcnt, UINT nFlags) |
OnKeyDown ()与OnKeyUp ()函数的参数。
nChar : 键的虚拟码
nRepchar : 重复计数,若应用程序的处理速度慢与用户按键的速度,Windows会把几个WM_KEYDOW或WM_KEYUP消息合并到单个消息中并相应增加重复计数。
nFlags : 提供一些特殊消息,按位使用各位含义
当发生键盘消息,Visual C++的映射机制将自动调用这些函数,用户可以改写这些函数,这样消息发生时将调用用户自己定义的函数。
OnChar :键码(ASCII码)
nRepcnt :按键重复次数,同OnKeyDown()与OnKeyUp()函数的这一参数一样
nFlags :提供一些特殊信息,按位使用(那些数字到底是什么含义?如位“0~15”含义“重复计数”)。
4.键盘事件的处理原则
WM_CHAR消息通常是最有用的消息,它的消息参数中包含可显示字符的ASCII码。能区分字母大小写,但不能处理非显示字符。
WM_KEYSOWN和WN_KEYUP的消息参数中包含键的虚拟码,它可处理非显示字符,但虚拟键不去分大小写字母,故处理字母比较麻烦。若确实需要这两个消息中处理字母的大小,需要使用API函数GetkeyState ()获得Shift键和CapsLock键的状态,才能判定是大写字母韩式小写字母。
通常需要处理可显示字符时响应WM_CHAR消息。