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

来源:互联网 发布:折八百淘宝商城女装 编辑:程序博客网 时间:2024/05/18 17:26

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