计算机法真的很快,我2年前的电脑现在就已经不怎么行了,连一个杀毒软件都算大型。。。虽然 Charles Petzold说,鼠标不是必需的。不过现在看来,没有鼠标的电脑是没有办法想象的。可能一个程序不知此键盘没有什么人会抱怨,不过不支持鼠标就是天大的罪过了。毕竟,鼠标的出现让电脑易用性大幅度提高,而计算机的普及才是真正推动计算机发展的动力吧。。。。不然MONEY哪里来呀。。
所以,在事实上,检测鼠标是否存在的意义并不是很大,不过既然有这个函数,那就记录把:
fMouse = GetSystemMetrics (SM_MOUSEPRESENT) ; //检测鼠标是否存在
cButtons = GetSystemMetrics (SM_CMOUSEBUTTONS) ; //检测鼠标按键数
fSwap=GetSystemMetrics (SM_SWAPBUTTON) ; //检测是否反键除了检测外,还可以制定鼠标的图标,在建立窗口的时候可以指定:
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;显示区域鼠标消息
和其他的消息相同,鼠标消息也是从消息循环中取得的,它们的消息有:
|
键 |
按下 |
释放 |
按下(双键) |
|
左 |
WM_LBUTTONDOWN |
WM_LBUTTONUP |
WM_LBUTTONDBLCLK |
|
中 |
WM_MBUTTONDOWN |
WM_MBUTTONUP |
WM_MBUTTONDBLCLK |
|
右 |
WM_RBUTTONDOWN |
WM_RBUTTONUP |
WM_RBUTTONDBLCLK |
使用方法也和其他的相同,其中,鼠标的坐标由lParam传递
x = LOWORD (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键。
处理双键的时候,需要在窗口样式中指定支持:
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ;
既然知道了具体的怎么实现,那么就写一个例子吧,书上的例子除了用到了鼠标消息外还有其他的一些知识。我比较懒,就直接写了个单单关于鼠标消息的例子了:)
其他部分都是自动生成的,就贴出消息处理那部分好了,主要要提前定义变量就是了。
case WM_LBUTTONDOWN:
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;
本文介绍了在Windows环境下如何检测鼠标的物理特性如存在与否、按键数量及左右键互换情况,并详细阐述了如何通过消息循环接收并处理鼠标事件,包括鼠标点击、双击等,同时提供了具体的代码示例。

被折叠的 条评论
为什么被折叠?



