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

  转载自: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个变量 专门用来获取坐标

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值