SetCapture捕获鼠标 ,转换获取的坐标

本文探讨了使用SetCapture()函数捕获鼠标消息时,如何正确地转换鼠标坐标的问题。详细介绍了通过static_cast或C风格类型转换来解决坐标转换过程中出现的正负数问题,避免坐标值错误导致的显示问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  转载自:http://hi.baidu.com/flyin_thewind/item/5d501f271734be16087508a9

SetCapture()可以让指定的窗体捕获所有鼠标消息,但所有的坐标获取的地方 都需要转型

例如在 WM_MOUSEMOVE WM_XBUTTONDOWN(UP) 由 lParam 获取坐标 LONG x,y;

x = LOWORD(lParam);
y = HIWORD(lParam);
都需要改成
x = static_cast<short>(LOWORD(lParam));
y = static_cast<short>(HIWORD(lParam));

staic_cast 是 C++的转型操作符 直接用C的转型也可
x = (short)LOWORD(lParam);
y = (short)HIWORD(lParam);
原因
其实注意到 
#define LOWORD(l) ((WORD)((DWORD_PTR)(l) & 0xffff))
#define HIWORD(l) ((WORD)((DWORD_PTR)(l) >> 16))
注意 x y 都是一个LONG 所以它们认为左数第1位是符号位 其他都表示数值
而 LOWORD HIWORD 得到的32位数 前16位都是0
所以 x y 一直会是正数 不会出现负数 (已经和鼠标在窗口上方和右方矛盾) 而且当lParam 是表示负坐标时 x y会是很大的整数 6xxxx (所以会画到很下面很右面去)

short x,y;
POINT pt; 
x = LOWORD(lParam);
y = HIWORD(lParam);
pt.x = x;
pt.y = y;

也可以 short 会把 32位的数前16位抛弃 第17位作符号位 后面当作数值
不过要多用2个变量 专门用来获取坐标

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值