鼠标的基本操作有三种:
1.单击 按下鼠标按钮,然后松开
单击又分为左单击(WM_LBUTTONDOWN)和右单击(WM_RBUTTON)
2.双击 连续两次快速按下鼠标按钮并松开
双击只有左键双击的消息,要接收这个消息要在窗口类中添加CS_DBLCLKS风格.当双击后第二个WM_LBUTTONDOWN会简单的被WM_LBUTTONDBLCLK消息替换
3.拖动 保持按下按钮,并移动鼠标.
相当于持续不断的产生WM_LBUTTONDOWN消息.
lParam包含了鼠标的位置信息,低位表示x坐标,高位表示y坐标都是相对于窗口客户区左上角的相对坐标.
x=LOWORD(lParam);
y=HIWORD(lParam);
参数wParam表示鼠标按钮、Shitf键和Ctrl键的状态。
用wParam和鼠标键做位与就能知道有没有按下其它键.
鼠标键:
MK_LBUTTON 按下左键
MK_MBUTTON 按下中建
MK_RBUTTON 按下右键
MK_SHIFT 按下Shift键
MK_CONTROL 按下Ctrl键
例如:
case WM_LBUTTONDOWN:
if (wParam&MK_SHIFT)
{
MessageBox(nullptr, L"按下了SHIFT键和左键", L"", MB_OK);
}
还有一个鼠标移动消息(WM_MOUSEMOVE),你可以在里面判断鼠标移动的时候是否按下了左键(wParam&MK_LBUTTONDOWN),这样你就可以干很多事,比如用按下左键移动来画线松开就重置等等。
关于鼠标双击,就往类里添加双击风格再往窗口过程放入case WM_LBUTTONDBLCLK消息即可,当两次击键间隔比较短的时候就会触发这个消息,触发这个消息前它还会执行WM_LBUTTONDOWN这个消息。
例如:
case WM_LBUTTONDBLCLK:
MessageBox(nullptr, L"双击了鼠标左键", L"", MB_OK);
return 0;
case WM_LBUTTONDOWN:
MessageBox(nullptr, L"按下左键", L"", MB_OK);
非客户区鼠标消息:
它和客户区鼠标消息的wParam和lParam参数有些不一样。
非客户区的wParam参数表示非客户区鼠标移动或单击的位置,它的值被设定成一个以HT为首的标识符,其中HT表示“击中测试(hit-test)”参数lParam的低位包含x坐标,高位y坐标,都是屏幕坐标。可以用ScreenToClient和ClientTpScreen函数来相互转换坐标.
其消息为:
WM_NCLBUTTONDOWN 左键按下
WM_NCMBUTTONDOWN 中键按下
WM_NCRBUTTONDOWN 右键键按下
WM_NCLBUTTONDBLCLK 双击左键
例如:
case WM_NCLBUTTONDOWN:
MessageBox(nullptr, L"在非客户区内按下了左键", L"", MB_OK);
return 0;
case WM_NCLBUTTONDBLCLK:
MessageBox(nullptr, L"在非客户区内双击了左键", L"", MB_OK);
return 0;
这里的非客户区只能捕捉像窗口标题栏之类的。如果想捕捉窗口外的鼠标信息需要如下两个函数:
HWND SetCapture(
HWND hWnd //窗口句柄
);
BOOL ReleaseCapture(void);
一般在WM_LBUTTONDOWN中调用SetCapture在WM_LBUTTONUP或者WM_CHAR中调用ReleaseCapture
鼠标滚轮:
消息为:WM_MOUSEWHEEL
参数lParam包含鼠标的位置信息(屏幕坐标),wParam低位包含一系列标志,用于指明鼠标按钮、Shift键和Ctrl键的状态.新的信息出现在参数wParam的高位,这是一个“增量”(delta)数值,当前可能等于120或-120.数值120或-120表示向上滚动或下滚动3行.
该函数查询或设置系统级参数
BOOL SystemParametersInfo(
UINT uiAction, //该参数指定要查询或设置的系统级参数
UINT uiParam, //与查询或设置的系统参数有关
PVOID pvParam, //与查询或设置的系统参数有关
UINT fWinIni//如果设置系统参数,则它用来指定是否更新用户配置文件(Profile)
);
其中调用SPI_GETWHEELSCROLLLINES参数,它表示每个增量数值能够滚动多少行,其增量数值用WHEEL_DELTA来标识,它等于120.默认情况下SystemParametersInfo返回3,所以每滚动一行的增量是40.
例如:
case WM_SETTINGCHANGE:
//SPI_GETWHEELSCROLLLINES:用于Windows NT 4.0及以后版本、
//Windows 98。当前轨迹球转动时,获取滚动的行数。参数pvParam
//必须指向UINT类型变量以接收行数。缺省值是3。
if (!SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &ulScrollLines, 0))
{
dwError = GetLastError();
break;
}
// 增量数值用WHEEL_DELTA来标识,它等于120
if (ulScrollLines)//每滚动一行的增量是40
iDeltaPerLine = WHEEL_DELTA / ulScrollLines;
else
iDeltaPerLine = 0;
return 0;
//鼠标滚轮消息
case WM_MOUSEWHEEL:
//如果增量等于0就是没有滚动就退出
if (iDeltaPerLine == 0)
break;
iAccumDelta += (short)HIWORD(wParam); // 120 or -120
while (iAccumDelta >= iDeltaPerLine)
{
SendMessage(hwnd, WM_VSCROLL, SB_LINEUP, 0);
iAccumDelta -= iDeltaPerLine;
}
while (iAccumDelta <= -iDeltaPerLine)
{
SendMessage(hwnd, WM_VSCROLL, SB_LINEDOWN, 0);
iAccumDelta += iDeltaPerLine;
}
return 0;