Windows编程学习笔记(七)

第五章 鼠标

学习了主要的鼠标消息及控制,lParam wParam 字段的了解。

/**********************************************************/

Windows程序可以使用语句 wndclass.hCursor = LoadCursor(NULL,IDC_ARROW)来载入光标。

Windows只把键盘消息发送给具有输入焦点的窗口,而鼠标则是只要跨越窗口或者在某窗口中按下鼠标键,那么那个窗口处理消息程序就会受到鼠标消息,

/**************************************************************/

显示区域鼠标消息

   当鼠标移过窗口的显示区域时,窗口消息处理函数会收到WM_MOUSEMOVE消息,当鼠标在显示区域按下或释放一个鼠标按键时,窗口消息处理程序会收到WM_LBUTTONDOWN WM_RBUTTONDOWN WM_LBUTTONUP WM_RBUTTONUP WM_LBUTTONDBLCLK WM_RBUTTONDBLCLK。

   对所有的这些消息,其中lParam含有鼠标的位置,低字组为x,高字组为y,可以这样提取xy值:

x = LOWORD(lParam);

y = HIWORD(lParam);

   而wParam的值指示鼠标按键以及Shitf Ctrl按键的状态,可以是用头文件中WINUSER.H中定义的屏蔽位来测试wParam,MK代表鼠标按键:

·MK_LBUTTON 左键

·MK_RBUTTON 右键

·MK_SHIFT 按下shift键

·MK_CONTROL 按下ctrl键

例如,如果收到了WM_LBUTTONDOWN消息,而且值

wparam & MK_SHIFT

是TRUE(非0),您就知道当左键按下时也按下了Shift键。

这样我们就可一编写一个简单的画图程序:当鼠标左键按下并拖动时,会在屏幕上沿鼠标轨迹绘出痕迹,每次检查鼠标若拖动且按左键,那么MoveToEx上一个xy坐标,LineTo现在的坐标,当鼠标左键释放时,复位以便重新划线,以下是部分代码:

       case WM_MOUSEMOVE:

              if(wParam & MK_LBUTTON )

              {

                     if(pre_lp == -1)

                            pre_lp = lParam;

                     hdc = GetDC(hWnd);

                     SelectObject(hdc,GetStockObject(BLACK_PEN));

                     MoveToEx(hdc,LOWORD(pre_lp),HIWORD(pre_lp),NULL);

                     LineTo(hdc,LOWORD(lParam),HIWORD(lParam));

                     pre_lp = lParam;

                     ReleaseDC(hWnd,hdc);

              }

              break;

       case WM_LBUTTONUP:

              pre_lp = -1;

              break;

/************************************************************/

非显示区域消息

同显示区域消息一样,只不过是鼠标的坐标(0,0)点为屏幕左上角的(0,0)点,非显示区域鼠标消息几乎完全与显示区域鼠标消息相对应。消息中含有字母「NC」以表示是非显示区域消息。如果鼠标在窗口的非显示区域中移动,那么窗口消息处理程序会接收到WM_NCMOUSEMOVE消息。

/*************************************************************/

命中测试

    最后一个消息是WM_NCHITTEST, 此消息优先于所有其它的显示区域和非显示区域鼠标消息。lParam参数含有鼠标位置的x和y屏幕坐标,wParam参数没有用。

Windows应用程序通常把这个消息传送给DefWindowProc,然后Windows用WM_NCHITTEST消息产生与鼠标位置相关的所有其它鼠标消息。对于非显示区域鼠标消息,在处理WM_NCHITTEST时,从DefWindowProc传回的值将成为鼠标消息中的wParam参数,这个值可以是任意非显示区域鼠标消息的wParam值再加上以下内容:HTCLIENT HTNOWHERE HTTRANSPARENT HTERROR

原文地址:https://www.cnblogs.com/lvpengms/p/1662809.html