鼠标是有一个或多个键的定位设备。可以通过GetSystemMetrics(SM_MOUSEPRESENT)来得到鼠标是否存在,也可以通过SM_CMOUSEBUTTONS它来得到鼠标上键的个数。可以通过SM_SWAPBUTTON来确定用户是否将鼠标切换到左手。还可以获得其他的鼠标设置,比方说双击速度,通过SystemParametersInfo来获得。
鼠标光标的位图
Windows支持几种预定义的鼠标光标。最常见的是IDC_ARROW的斜箭头。热点在箭头的顶端。IDC_CROSS光标热点在十字中心。IDC_WAIT光标,通常用于指示程序正在运行。定义窗口类时指定特定窗口默认光标。
客户区鼠标消息
Windows只要鼠标跨越窗口或者在某窗口中按下鼠标键,那么就会收到鼠标消息。无视输入焦点。Windows为鼠标定义了21种消息,不过其中11种与客户区无关。
当鼠标在窗口上滑过,窗口过程收到WM_MOUSEMOVE消息。当在窗口客户区中按下或释放时,收到按下、释放或双击的消息。
所有这些消息的lParam均包含鼠标位置:低位为x,高位为y。wParam指示鼠标键及Shift和Ctrl键的状态。通过WINUSER.H的位屏蔽来测试wParam。
双击鼠标键
如果希望窗口过程能收到双击键的鼠标消息,那么在调用RegisterClass时,必须包含CS_DBLCLKS标识符。
如果未包含CS_DBLCLKS,而在用户在短时间内双击了鼠标键,那么窗口过程接收到两个WM_LBUTTONDOWN,窗口过程可能在这些消息之前还收到了其他消息。如果想实现自己的双击逻辑,可以使用GetMessageTime获取WM_LBUTTONDOWN消息之间的相对时间。
如果窗口风格中包含了CS_DBLCLKS,那么双击鼠标右键时,Windows简单的将第二个WM_LBUTTONDOWN换成了WM_LBUTTONDBLCLK。
非客户区鼠标消息
如果在客户区移动或按下鼠标,将产生10个消息,如果鼠标在窗口的客户区之外但还在窗口之内,Windows就给窗口过程发送“非客户区”鼠标消息。
通常不必处理“非客户区”消息。直接将它发送给DefWindowProc,从而使Windows执行系统功能。
非客户区鼠标消息wParam和lParam参数和客户区消息的wParam和lParam有一些差别。wParam参数指明移动或单击鼠标键的非客户区位置。lParam保换低字节x坐标和高字节y坐标,但他们使屏幕坐标。可以用:ScreenToClient和ClientToScreen来将坐标进行转换。
命中测试消息
最后一个消息是WM_NCHITTEST,它表示“非客户区命中测试”。此消息优先于其他客户区鼠标消息,lParam含有鼠标的位置,wParam没有使用。
Windows通常将这个消息传送给DefWindowsProc,然后Windows用WM_NCHITTEST消息产生基于鼠标位置的所有其他鼠标消息。
捕获鼠标
当鼠标在窗口中按下后移动到窗口外释放时,窗口是不会的到这个释放的鼠标消息。要解决这类问题需要使用鼠标捕获来解决。
SetCapture来捕获鼠标,ReleaseCapture用来释放鼠标。
鼠标轮
现在的鼠标有一个小轮,可以用食指来转动它,这会产生一个特殊的消息,WM_MOUSEWHEEL。使用鼠标轮的窗口通过响应此消息来实现功能。这个消息的lParam表示鼠标的位置,wParam低字包含原有的鼠标标示。新的信息保存在wParam的高字。它可以是120或-120。表示向上或向下3行,更好的鼠标可以表示40或-40,表示向上或向下一行。