7.1鼠标基础:
GetSystemMetrics函数来确认鼠标是否存在fMouse = GetSystemMetrics(SM_MOUSEPRESENT)
确定所安装鼠标其上按键的个数cButtons = GetSystemMetrics(SM_CMOUSEBUTTONS);
使用SystemParametersInfo函数可以设定或获得设定鼠标的参数。
一些简单的定义:
IDC_CROSS光标(在本章后面的BLOKOUT程序中有用到)的热点在十字交叉线的中心。IDC_WAIT光标是一个沙漏,通常用于指示程序正在执行。
在定义窗口类别结构时指定特定窗口的内定光标wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
7.2显示区域鼠标消息:
对于所有这些消息来说,其lParam值均含有鼠标的位置,可以用LOWORD和HIWORD宏来提取这些值
x = LOWORD(lParam);
y = HIWORD(lParam);
wParam的值指示鼠标按键以及Shift和Ctrl键的状态。您可以使用表头文件WINUSER.H中定义的位屏蔽来测试wParam。MK前缀代表「鼠标按键」。
窗口消息处理程序可以「拦截鼠标」并且连续地接收鼠标消息,即使此时鼠标在该窗口显示区域之外。
如果正在显示一个系统模态消息框或者系统模态对话框,那么其它程序就不能接收鼠标消息。
简单的鼠标处理:
处理Shift键:
wParam和MK_LBUTTON进行位与(AND)运算,来确定是否按下了左键,同理,wParam和MK_CONTROL进行位与(AND)运算,来确定是否按下了Ctrl键。
Windows函数GetKeyState可以使用虚拟键码VK_LBUTTON、VK_RBUTTON、VK_MBUTTON、VK_SHIFT和VK_CONTROL来传回鼠标按键与Shift键的状态。
双击鼠标按键:
如果希望您的窗口消息处理程序能够收到双按键的鼠标消息,那么在呼叫RegisterClass初始化窗口类别结构时,必须在窗口风格中包含CS_DBLCLKS标识符wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ;这样设定之后,可以收到WM_LBUTTONDBLCLK消息。
7.3非显示区域鼠标消息
非显示区域鼠标消息类似于系统键盘消息WM_SYSKEYDOWN、WM_SYSKEYUP和WM_SYSCHAR。非显示区域鼠标消息几乎完全与显示区域鼠标消息相对应。消息中含有字母「NC」以表示是非显示区域消息。wParam参数指明移动或者按鼠标按键的非显示区域。
将屏幕坐标转换为显示区域坐标或者反之
ScreenToClient(hwnd, &pt);
ClientToScreen(hwnd, &pt);
非显示区域命中测试
命中测试消息:WM_NCHITTEST代表「非显示区域命中测试」。Windows应用程序通常把这个消息传送给DefWindowProc,然后Windows用WM_NCHITTEST消息产生与鼠标位置相关的所有其它鼠标消息。
从消息产生消息:Windows用WM_NCHITTEST消息产生所有其它鼠标消息,这种由消息引出其它消息的想法在Windows中是很普遍的。
7.4程序中的命中测试
正如DefWindowProc在处理WM_NCHITTEST消息时做一些命中测试一样,窗口消息处理程序经常必须在显示区域中进行一些命中测试。
命中测试中会使用x和y坐标值,它们由传到窗口消息处理程序的鼠标消息的lParam参数给出。
使用键盘仿真鼠标:
Windows为这个光标保存了一个「显示计数」。如果安装了鼠标,显示计数会被初始化为0。否则,显示计数会被初始化为-1。
增加显示计数ShowCursor(TRUE)//如果您想显示鼠标光标,而不管鼠标存在与否
减少显示计数ShowCursor(FALSE);
获得光标的位置:GetCursorPos (&pt);pt是POINT结构
设定光标位置:SetCursorPos(x, y);//x和y都是屏幕坐标,而不是显示区域坐标
当然,呼叫ScreenToClient和ClientToScreen就能做到屏幕坐标与客户坐标的相互转换
CHECKER1
将子窗口用于命中测试的例子