鼠标

来源:互联网 发布:轻淘客cms建站教程 编辑:程序博客网 时间:2024/04/28 18:24

鼠标函数:

LoadCursor(NULL,IDC_ARROW)

SetCursor(hCursor)

ShowCursor(bShow)

GetCursorPos(&pt):获得坐标是屏幕坐标。

SetCursorPos(x, y):(x, y)是屏幕坐标值。

GetSystemMetrics(SM_MOUSEPRESENT):鼠标可用返回TRUE,不可用返回FALSE,但Windows 98总返回TRUE。

GetSystemMetrics(SM_CMOUSEBUTTONS):返回鼠标的键数。鼠标不可用返回0(Windows 98返回2)。

GetSystemMetrics(SM_SWAPBUTTON):鼠标是否是左手习惯。一般来说程序不需要知道这个,因为操作系统屏蔽了这些,即使左手习惯点了右键,也产生的是左键的消息。但是在一些程序中如果要监控物理鼠标点击的是左键还是右键就要用到这个函数。鼠标的一些其他参数,如双击速度,可以从控制面板设置,也可以用SystemParametersInfo函数获取和设置

 

客户区鼠标消息:

Windows定义了21条鼠标消息,但有11条与客户区(Client Area)无关,一般程序会忽略它们。十条常用消息:WM_MOUSEMOVE、WM_LBUTTONDOWN、WM_LBUTTONUP、WM_LBUTTONDBLCLK、WM_MBUTTONDOWN、WM_MBUTTONUP、WM_MBUTTONDBLCLK、WM_RBUTTONDOWN、WM_RBUTTONUP、WM_RBUTTONDBLCLK。

对所有这些消息,lParam包含了鼠标的位置,低字是X坐标值,高字是Y坐标值。wParam表示鼠标键和Ctrl、Shift键的状态,位测试的宏定义有:MK_LBUTTON、MK_MBUTTON、MK_RBUTTON、MK_SHIFT、MK_CONTROL。比如,如果wParam & MK_SHIFT为真,收到鼠标消息时Shift键已经按下。不能在处理消息时用GetKeyState(VK_SHIFT)来获取Shift键的状态,因为GetKeyState获得的是消息处理时的按键状态而不是产生消息时的按键状态。

Windows并不会对鼠标移动任意一个像素点都产生WM_MOUSEMOVE消息,程序收到WM_MOUSEMOVE的数量取决于鼠标硬件和WM_MOUSEMOVE消息处理程序的处理速度。

如果用鼠标左键点击非活动(active)窗口,Windows会把该窗口变为活动的并传送WM_LBUTTONDOWN消息。但当前显示了模式对话框,系统不会把鼠标消息发给其他窗口。

如果窗口过程中要处理双击消息,必须在注册窗口时的窗口风格(style)中设置CS_DBLCLKS,如wndclass.style=CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS。如果注册窗口类型没有CS_DBLCLKS,双击产生的消息序列是:WM_LBUTTONDOWN、WM_LBUTTONUP、WM_LBUTTONDOWN、WM_LBUTTONUP。如果接收双击消息,产生的消息序列是:WM_LBUTTONDOWN、WM_LBUTTONUP、WM_LBUTTONDBLCLK、WM_LBUTTONUP。因而如果双击只是在单击的基础上附加操作会很容易,但如果双击的第一个WM_LBUTTONDOWN消息与单击处理行为不一样,那程序就很复杂了。

 

非客户区鼠标消息:

如果鼠标在客户区之外窗口之内点击或移动,就会产生非客户区(nonclient-area)消息。这些消息以NC为标志,如WM_NCMOUSEMOVE、WM_NCRBUTTONUP等。

非客户区消息的wParam与lParam参数的意义与客户区消息不同。wParam表示鼠标在非客户区的什么区域移动或点击,WINUSER.H中定义了测试宏,以HT(hit-test)开头。lParam也是鼠标的坐标,但用的是屏幕坐标表示。我们可以用ScreenToClient(hwnd, &pt)和ClientToScreen(hwnd, &pt)转换屏幕坐标和客户区坐标。

 

Hit-Test消息:

鼠标消息的最后一个消息——WM_NCHITTEST。它产生在所有客户区和非客户区鼠标消息之前,并转成客户区或非客户区消息。lParam参数是鼠标的屏幕坐标,wParam参数无用。Windows应用程序一般把它交由DefWindowProc处理,DefWindowProc根据坐标返回Hit-Test值,这些值可以是非客户区消息的wParam值,也可以是以下四个:HTCLIENT、HTNOWHERE、HTTRANSPARENT、HTERROR。如果返回的是是非客户区的值,系统再产生一个非客户区消息;如果返回HTCLIENT,则产生一个客户区消息。如果要捕获所有的鼠标消息,可以在自己的消息处理函数中这样处理:

 

以上代码可以屏蔽所有鼠标消息。

 

捕获鼠标:

鼠标不在窗口区域时,不会给窗口发送鼠标消息,但有时需要用到这些消息,我们只需要调用SetCapture(hwnd)。之后鼠标消息将都会以客户区消息发送给hwnd窗口,所有消息的lParam都是客户区坐标,即使鼠标在非客户区。取消捕获鼠标时,调用ReleaseCapture()。对于32位Windows系统,SetCapture还有些问题——如果设置了捕获鼠标,鼠标键没按下移动到别的窗口,那么收到鼠标消息的就是鼠标下的窗口而不是设置的捕获窗口,因而会造成一些混乱。为解决这个问题,我们不能一直设置捕获鼠标,只在按下鼠标键时捕获,释放鼠标键时取消。

 

鼠标滚轮:

滚轮点击与中键点击效果一样,产生中键消息。当滚轮滚动时,焦点窗口(不是鼠标下窗口)产生WM_MOUSEWHEEL消息。该消息lParam是鼠标的屏幕坐标,wParam也是一些标志位,表示鼠标键和Shift、Ctrl键的状态。它还有一个新的信息,是wParam的高字,叫做delta值,现在一般是120或-120,分别表示文档向上或向下移动三行。一个Delta移动多少行可以从用SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0,  &ulScollLines, 0)获得(当然可以不用理)。