第五章 鼠标
学习了主要的鼠标消息及控制,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