您的位置:首页 > 其它

Windows程序设计--鼠标

2015-12-19 19:28 239 查看
鼠标的基本操作有三种:

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: