计算机法真的很快,我2年前的电脑现在就已经不怎么行了,连一个杀毒软件都算大型。。。虽然 Charles Petzold说,鼠标不是必需的。不过现在看来,没有鼠标的电脑是没有办法想象的。可能一个程序不知此键盘没有什么人会抱怨,不过不支持鼠标就是天大的罪过了。毕竟,鼠标的出现让电脑易用性大幅度提高,而计算机的普及才是真正推动计算机发展的动力吧。。。。不然MONEY哪里来呀。。
所以,在事实上,检测鼠标是否存在的意义并不是很大,不过既然有这个函数,那就记录把:
cButtons = GetSystemMetrics (SM_CMOUSEBUTTONS) ; // 检测鼠标按键数
fSwap = GetSystemMetrics (SM_SWAPBUTTON) ; // 检测是否反键
除了检测外,还可以制定鼠标的图标,在建立窗口的时候可以指定:
显示区域鼠标消息
和其他的消息相同,鼠标消息也是从消息循环中取得的,它们的消息有:
键 | 按下 | 释放 | 按下(双键) |
左 | WM_LBUTTONDOWN | WM_LBUTTONUP | WM_LBUTTONDBLCLK |
中 | WM_MBUTTONDOWN | WM_MBUTTONUP | WM_MBUTTONDBLCLK |
右 | WM_RBUTTONDOWN | WM_RBUTTONUP | WM_RBUTTONDBLCLK |
使用方法也和其他的相同,其中,鼠标的坐标由lParam传递
y = HIWORD (lParam) ;
同时,可以通过位与(这个。。。我没学好,忘记叫什么了)的方式获得是否在点击的同时按下了SHIFT等按键:
MK_LBUTTON | 按下左键 |
MK_MBUTTON | 按下中键 |
MK_RBUTTON | 按下右键 |
MK_SHIFT | 按下Shift键 |
MK_CONTROL | 按下Ctrl键 |
例如,如果收到了WM_LBUTTONDOWN消息,而且值
wparam & MK_SHIFT
是TRUE(非0),您就知道当左键按下时也按下了Shift键。
处理双键的时候,需要在窗口样式中指定支持:
既然知道了具体的怎么实现,那么就写一个例子吧,书上的例子除了用到了鼠标消息外还有其他的一些知识。我比较懒,就直接写了个单单关于鼠标消息的例子了:)
其他部分都是自动生成的,就贴出消息处理那部分好了,主要要提前定义变量就是了。
x = LOWORD(lParam);
y = HIWORD(lParam);
count ++ ;
InvalidateRect(hWnd,NULL, 0 );
break ;
case WM_PAINT:
hdc = BeginPaint(hWnd, & ps);
// TODO: 在此添加任意绘图代码...
MoveToEx(hdc,p.x,p.y,NULL);
if (count == 1 )MoveToEx(hdc,x,y, 0 );
LineTo(hdc,x,y);
p.x = x;
p.y = y;
EndPaint(hWnd, & ps);
break ;