c++鼠标操作详解

来源:互联网 发布:福士苍汰 知乎 编辑:程序博客网 时间:2024/06/05 09:26

鼠标作为一种定位输入设备在Windows中得到了广泛的应用,通过鼠标的单击、双击功能和拖动功能,用户可以很容易地操作基于Windows图形界面的应用程序。Windows中通过光标来指示当前鼠标的位置,在Windows操作系统中预定义了几种光标,并在Windows.h头文件中加以定义,这些系统预定义的光标如表6-4所示。

用户也可以通过图形编辑器自定义光标形式,将其保存为扩展名为.cur的文件中,采用自定义光标时,需要在资源文件中定义光标资源,其形式为:

    光标名 CURSOR 光标文件(.cur)

然后应用程序通过调用LoadCursor加载光标资源,其形式为:

    LoadCursor(hThisInst,lpszCursorname)

其中,hThisInst为应用程序当前实例句柄,lpszCursouname为当前光标,应用程序加载光标资源常在定义窗口类时进行,例如,下面的语句为窗口类wndclass

 

WNDCLASS     wndclass;

wndclass.hCursor=LoadCursor (hThislnst, IDC_WAIT);

 

此外,还可在应用程序中调用LoadCursor函数改变光标形式。

 

表6-4 系统预定义的光标

代表预定义光标的常量

光标属性描述

IDC_ARROW

箭头光标

IDC_CROSS

十字光标

IDC_IDEAM

I形文本光标

IDC_ICON

空图标

IDC_SIZE

右下有小方形的方形图标

IDC_SIZENESW

带有指向东北方和西南方箭头的光标

IDC_SIZENS

带有指向北方和南方箭头的光标

IDC_SIZENWSE

带有指向西北方和东南方箭头的光标

ISC_SIZEWE

带有指向东方和西方箭头的光标

IDC_UPARROW

垂直箭头光标

IDC_WAIT

计时光标(也称沙漏光标)

 

所谓鼠标的单击操作,实际上是指用户按下鼠标按钮并松开的这一全过程。此过程可以用来选择对象;所谓鼠标的双击操作,实际上是指用户在很短的时间内(根据不同计算机的设置不同而不同,操作系统的缺省时间为0.5秒)进行两次单击鼠标的操作,此动作可以激活所选项的缺省操作;所谓鼠标的拖动操作,实际上是指用户按下鼠标按钮并在不松开鼠标按钮的情况下移动鼠标,此动作一般可以用来选择菜单和移动有关内容。

Windows操作系统通过鼠标设备驱动程序接收鼠标输入。鼠标驱动程序在启动Windows时装入,Windows操作系统通过鼠标驱动程序能检测出鼠标是否存在。如果鼠标已经存在,则设备驱动程序将注意到Windows的任何鼠标事件。每当在窗口内有鼠标事件发生时,窗口就接收到一个鼠标事件(以消息的形式发送给应用程序的窗口)。注意,能接收鼠标事件的窗口并不一定要求是活动窗口或者是具有输入焦点的窗口。

当作应用程序的用户区内产生一个鼠标事件时,就将产生一个用户区鼠标消息。表6-5中列出了所有的用户区鼠标消息。

表6-5   用户区鼠标消息

消息

含义

WM_LBUTTONDOWN

用户区内按下鼠标左键

WM_LBUTTONUP

用户区内松开下鼠标左键

WM_LBUTTONDBLCLK

用户区内双击鼠标左键

WM_MBUTTONDOWN

用户区内按下鼠标中键

WM_MBUTTONUP

用户区内松开鼠标中键

WM_MBUTTONDBLCLK

用户区内双击鼠标中键

WM_RBUTTONDOWN

用户区内按下鼠标右键

WM_RBUTTONUP

用户区内松开鼠标右键

WM_RBUTTONDBLCLK

用户区内双击鼠标右键

WM_MOUSEMOVE

鼠标在用户区内移动

在鼠标消息中,参数lParam包含了鼠标位置,lParam字的低位包含了鼠标位置的x坐标值,lParam字的高位包含了鼠标位置的y坐标。lParam所表示的坐标是相当于窗口的左上角为原点的坐标值;参数wParam内包含了一个指示各种虚键状态的值。wParam参数是表6-6中所列值的组合。

 

表6-6 wParam的值

含义

MK_CONTROL

按下键按上的Ctrl键

MK_LBUTTON

按下了鼠标左键,等同与WM_LBUTTONDOWN

MK_MBUTTON

按下了鼠标中键,等同与WM_MBUTTONDOWN

MK_RBUTTON

按下了鼠标右键,等同与WM_RBUTTONDOWN

MK_SHIFT

按下键盘上的Shift键

 

通过用户区消息的lParam和wParam参数,程序员就可以确定鼠标的位置和鼠标键的状态。

对于鼠标消息的处理,一般又分为两种,一种是要对Shift和Ctrl键进行监测,另一种则不监测

(1)监测Shift键和Ctrl键的一般用如下代码

case WM_LBUTTONDOWN:   //按下鼠标左键

   if((wParam&MK_CONTROL)&&(wParam&MK_SHIFT))

    …                           //Shift和Ctrl键都被按下

   break;

case WM_LBUTTONUP:     //释放鼠标左键

   …

   break;

   …

 

(2)不监测Shift键和Ctrl键的一般用如下代码

case WM_LBUTTONDOWN:   //按下鼠标左键

   …                           

   break;

case WM_LBUTTONUP:     //释放鼠标左键

   …

   break;

   …

 

前面已经谈到,对于鼠标双击,一般设定的双击时间间隔为0.5秒,这是Windows系统默认的时间间隔,当然,应用程序也可以调用能够SetDoubleClickTime()函数来重新设定此值,此外,若要使窗口函数能接收鼠标双击产生的消息,则在注册窗口类时必须注明该窗口类具有CS_DBLCLKS属性,定义方式如下:

wndclass.style=CS_HEADRAW|CS_VERDRAW|CS_DBLCLKS;

若窗口不包含上述属性的定义,那么及时进行了双击操作,该窗口也只能接收到两条WM_BUTTONDOWN消息或两条WN_BUTTONUP消息。

每当在一个窗口的用户区以外的地方(例如在窗口的菜单、滚动条、工具条和标题条等处)产生了一个鼠标事件,就将产生一个非用户区鼠标消息,对于非用户区鼠标消息,往往不由应用程序进行具体处理,而是送往函数DefWindowProc进行处理。

通常情况下,只有当鼠标光标位于某一窗口的用户区或非用户区时,该窗口的窗口函数才能接收到鼠标消息,但是由于鼠标移动的随机性,难以保证光标始终不离开某一个窗口,如果要使某一个窗口能不间断地捕获鼠标消息,就必须对鼠标加以捕获,从而使Windows发送的所有鼠标消息均定向到某一个窗口,而不管鼠标的光标处于何处。

调用SetCapture()函数即可实现对鼠标的捕捉,如SetCapture(hWnd);就可以向句柄为hWnd的窗口发送所有的鼠标消息,一旦从窗口捕获了鼠标,系统的键盘功能就暂时失效,其它窗口也无法得到鼠标消息,因此,当该窗口不再需要捕获所有的鼠标消息时,应及时调用ReleaseCapture()函数加以释放鼠标,以便其它窗口可以正常地接收鼠标信息。

0 0
原创粉丝点击