第7章鼠标和键盘本章主要内容鼠标的客户区消息和非客户区消息的处理鼠标消息的捕获处理键盘消息7.1处理鼠标消息根据产生鼠标消息时鼠标光标所处的位置,鼠标消息分为两类:客户区鼠标消息非客户区鼠标消息鼠标输入1)鼠标消息在Windows中处理鼠标操作基本上有下列3种:单击(Click)表示按一下鼠标的左键或右键,然后释放。双击(DoubleClick)表示快速连续按两下鼠标左键。拖动(Drag)指按住鼠标的按键后,移动鼠标。所有这些鼠标操作,都会产生相应的消息。鼠标移动时产生WM_MOUSEMOVE消息;鼠标右键按下时产生WM_RBUTTONDOWN消息;鼠标左键按下时产生WM_LBUTT-ONDOWN消息;鼠标左键双击时产生WM_LBOTTONDBLCLK消息;鼠标右键释放时产生WM_RBUTTONUP消息;鼠标左键释放时产生WM_LBUTTONUP消息等等。所有鼠标消息的处理函数都有很相似的原型,它们都有两个参数。以处理鼠标左键按下消息的函数OnLButtonDown()为例来进行说明。此函数的原型如下:afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);参数point是鼠标事件发生时鼠标光标所在的位置,它是相对于窗口左上角的水平X坐标和垂直的Y坐标而言的。参数nFlags指明鼠标按钮的状态以及鼠标事件发生时键盘上某些键的状态,每一状态都可以由nFlags的一位来表示。可以从表中所列的位屏蔽中得到每一位。其中,MK_CONTROL,MK_LBUTTON,MK_MBUTTON,MK_RBUTTON和MK_SHIFT都是预定义的宏。7.1处理鼠标消息MFC中,鼠标消息响应函数的原型一般为:afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);掩码产生鼠标消息时光标在窗口客户区的位置7.1处理鼠标消息7.1处理鼠标消息如果鼠标处在应用程序窗口之外,还希望可以接受鼠标消息的话,则必须调用捕获鼠标消息函数:CWnd*SetCapture();完成了所应该做的工作之后,应用程序应该及时释放鼠标:BOOLReleaseCapture();7.1处理鼠标消息7.2处理键盘消息Windows对每个按键定义了与设备无关的编码,这种编码就叫做虚拟码。有了这个虚拟码,Windows程序员就可以不必理睬扫描码,而使用虚拟码来编写程序了虚拟码扫描码键盘输入1)键盘消息当键盘的某个键被按下,将产生WM_CHAR消息,这个消息带有字符代码值、重复次数、先前状态码3个参数。WM_CHAR消息的处理函数为OnChar(),此函数的原型为:afx_msgvoidOnChar(UINTnChar,UINTnRepCnt,UINTnFlags);其中,参数nChar是所按键的字符代码值;nRepCnt表示重复的次数,它表示用户按键时重复击键的次数;最后一个参数nFlags表示扫描码、先前键状态和键转换状态等,其含义如表所示。7.2处理键盘消息7.3应用程序窗口的焦点在某个具体时刻只有一个窗口才能接收到键盘消息,这样的窗口叫做具有输入焦点的窗口。当应用程序的窗口获得输入焦点时,会发出WM_SETFOCUS消息;而当窗口失去输入焦点时,会发出WM_KILLFOCUS消息。