第七章 鼠标part1

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

将子窗口用于命中测试的例子

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的横打

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值