Windows程序设计--鼠标

鼠标的基本操作有三种:
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;

你可能感兴趣的:(windows,Class,鼠标,设计,wm)