鼠标在系统中显示为一个斜向的箭头,发生鼠标动作时系统产生相应的事件消息,应用程序接收到消息后作出恰当的回应,从而完成命令操作;
1、鼠标动作包括单击、双击、移动等,系统已经定义好了它们的标识符,分别如下:
1)单击:鼠标的单击动作是指按键轻巧地按下去又抬起来,包括按下和抬起两个动作,
有左键和右键之分,左键按下的标识符是WM_LBUTTONDOWN,右键是WM_RBUTTONDOWN,
而抬起则是把后面的单词DOWN改成成UP即可,当鼠标单击时系统就会发送这两个消息给应用程序,而应用程序的消息处理过程MainWndProc里头加入一段这两个消息的处理代码;
2)双击:双击一般指鼠标左键,迅速的两次单击,系统默认是0.5秒内,否则就是两次单击,
双击时系统发送一个WM_LBUTTONDBLCLK消息给应用程序,然后应用程序的MainWndProc里头加上一段代码来处理这个消息;
3)移动:在没有按键的情况下,移动鼠标,这时屏幕上的箭头鼠标指针也发生移动,
这时系统将发送一个WM_MOUSEMOVE消息,应用程序也可以加上一段代码来响应这个鼠标事件,如果应用程序中没有这一段代码,这个消息将由系统处理代为处理;
4)鼠标的其他情况还包括拖动、同时按住组合键、进入、穿越、离开程序的窗口,这些动作也有相应的处理程序代码;
2、鼠标消息 鼠标消息是一种结构类型,它在指明鼠标动作的同时还携带一些附加信息,其中的lParam参数中携带了鼠标的位置信息,另一个参数wParam则判断是否有键盘上的组合键按下;
下面我们通过一个程序来看看鼠标的使用方法:
1)新建一个名为Mouse的Win32 Application工程,再新建一个名为Mouse的C/C++头文件和一个名为Mouse的C++源程序,
输入程序的框架代码,框架代码经常用到,每次提前抄到本子上,或者打印下来,复制粘贴有时出现莫名其妙的“unexpected end”错误,还是输进去的 可靠些
(绿色部分是注释,必须以双斜杠“//”开头),有的一行太长会自动折到下一行:
头文件Mouse.h的内容是:
//申明函数原型
LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);
BOOL InitApplication(HINSTANCE);
BOOL InitInstance(HINSTANCE,int);
源程序Mouse.cpp的内容是:
#include <windows.h>
#include <string.h>
#include "Mouse.h"
HINSTANCE hInst;
HWND hWndMain;
int APIENTRY WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;//定义一个消息结构msg
if(!InitApplication(hInstance))
return (FALSE);
if(!InitInstance(hInstance,nCmdShow))
return (FALSE);
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}
BOOL InitApplication(HINSTANCE hInstance)
{
WNDCLASS wcMouse;
wcMouse.style=0;
wcMouse.lpfnWndProc=(WNDPROC)MainWndProc;
wcMouse.cbClsExtra=0;
wcMouse.cbWndExtra=0;
wcMouse.hInstance=hInstance;
wcMouse.hInstance=hInstance;
wcMouse.hIcon =LoadIcon(hInstance,IDI_APPLICATION);
wcMouse.hCursor=LoadCursor(NULL,IDC_ARROW);
wcMouse.hbrBackground=(HBRUSH)(14);
wcMouse.lpszMenuName=NULL;
wcMouse.lpszClassName="MouseWClass";
return (RegisterClass(&wcMouse));
}
BOOL InitInstance(
HINSTANCE hInstance, int nCmdShow)
{
hInst=hInstance;
hWndMain=CreateWindow(
"MouseWClass","使用鼠标",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
ShowWindow(hWndMain,nCmdShow);
UpdateWindow(hWndMain);
return (TRUE);
}
再接着加入消息处理过程,这是本节关键知识,代码如下:
LRESULT APIENTRY MainWndProc(
HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
char szTitle[50];//存放标题字符串
switch(message)
{
case WM_LBUTTONDOWN:
SetWindowText(hWndMain,"按下鼠标");//替换标题栏显示
MessageBox(hWnd,"你按下的是鼠标左键!","提示",MB_OK|MB_ICONINFORMATION);
break;
case WM_RBUTTONDOWN:
SetWindowText(hWndMain,"按下鼠标");
MessageBox(hWnd,"你按下的是鼠标右键!","提示",MB_OK|MB_ICONINFORMATION);
break;
case WM_MOUSEMOVE:
wsprintf(szTitle,"%s(%d,%d)","鼠标位置",
LOWORD(lParam),HIWORD(lParam)); //将鼠标位置存入一个字符串数组szTitle中
SetWindowText(hWndMain,szTitle);//字符串显示到标题栏上
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd,message,wParam,lParam));
}
return 0;
}
保存一下文件,单击编译条上的“构建”按钮,构建程序,如果出现了错误,就在仔细检查一下,
通过后再单击“执行”按钮,运行一下自己的程序,分别单击左右按键和移动鼠标,看看程序的响应效果;
本节学习了鼠标操作的编程知识,如果你成功地完成了练习,请继续学习下一课内容;