关于TrackMouseEvent用法总结

对于这个函数我也是最近想研究控件自绘才知道它真正怎么用.以前只是见到过.,废话不多说.

我先说下我的问题:如何响应鼠标离开某个窗体(控件)事件?

先大概讲下步骤,然后再集中对TrackMouseEvent进行详解:

为按钮添加以下几个函数:

● OnMuseMove:这个函数时MFC内部已经做好了的事件:主要响应鼠标移动事件.但是这个事件有一个严重的问题:它只能识别鼠标是否在其上移动.

● OnMouseLeave():这个是自定义函数(但是要在消息映射里面与WM_MOUSELEAVE对应

OnMouseMove需要加上的代码段如下:

if ( m_bOver == FALSE )

{

m_bOver = TRUE;

TRACKMOUSEEVENT tme;

tme.cbSize = sizeof( TRACKMOUSEEVENT );

tme.dwFlags = TME_LEAVE;

tme.hwndTrack = m_hWnd;

tme.dwHoverTime = 0;

::TrackMouseEvent( &tme );

}

此时当鼠标移入的时候,m_bOverTRUE.

我们在到OnMouseLeave函数里面把m_bOver设回FLASE.

此时我们可以通过m_bOver来获取鼠标的状态(是否在所属控件内.).现在运行程序会报错对不对.加上一下代码就可以了:

extern "C" WINUSERAPI BOOL WINAPI TrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack); 

typedef struct tagTRACKMOUSEEVENT {

DWORD cbSize; //TRACKMOUSEEVENT结构的大小

DWORD dwFlags;//定义服务请求

    HWND hwndTrack; //待跟踪窗口的句柄

    DWORD dwHoverTime;//定义hover事件耗尽时间

} TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT;

结构详解:

● dwFlags:取值如下:TME_CANCEL取消前一次的跟踪请求;使用该项时必须指定要取消跟踪的类型.(如果想要取消hover跟踪,则应传入TME_CANCEL和TME_HOVER.可以发送WM_MOUSEHOVER消息,如果在hover跟踪处于激活状态时再次请求hover跟踪的话,hover的定时器将被重置.

TME_LEAVE鼠标离开.发送TME_MOUSELEAVE消息.当鼠标不在指定的窗口或者区域上时,将立即产生一个leave通知,不在做任何跟踪

TME_QUERY这一项不是作为跟踪请求的.选中这一项时,当结构体被传送给TrackMouseEvent函数时,即产生当前跟踪.唯一不同的是返回的消耗时间,是真实的消耗时间,而不是HOVER_DEFAULT,即使之前TrackMouseEvent函数锁请求的是HOVER_DEFAULT.

● dwHoverTime:单位为毫秒.可以使用HOVER_DEFAULT来使用系统默认的hover事件耗尽时间.

默认是菜单下拉时间,即400毫秒.可以调用SystemParameterInfo函数并使用SPI_GETMOUSEHOVERTIME来获取系统默认的hover耗尽时间.默认的hover矩形区与双击区一致.也可以使用SPI_GETMOUSEHOVERWIDTH(HEIGHT)来获取鼠标在上面停留可以产生的区域.

另外要注意的是:

这两个函数的区别,TrackMouseEvent函数的头文件是winuser.h,对应的库文件为user32.lib,而 _TrackMouseEvent函数则在commctrl.h里定义,而由COMCTRL32.DLL导出。  

 使用 TrackMouseEvent函数必须用extern "C"导入此函数。如下:   extern "C" WINUSERAPI BOOL WINAPI TrackMouseEvent (LPTRACKMOUSEEVENT lpEventTrack); NOTE:由上面说到的TrackMouseEvent函数的特点,通常都在OnMouseMove函数里添加该函数。另外,可以与 SetCapture函数联合使用,即使在鼠标移出窗口区时也能够响应。

TrackMouseEvent函数的几点说明:

此函数能寄送如下消息:

WM_MOUSEHOVER:在上次调用TrackMouseEvent指定的时间里,鼠标盘旋在窗口的客户区。当此消息产生时,盘旋跟踪停止。如果需要进一步的鼠标盘旋跟踪,应用程序应当再次调用TrackMouseEvent。   

WM_MOUSELEAVE:鼠标离开上次调用TrackMouseEvent时指定的窗口客户区。当此消息产生时,所有由TrackMouseEvent要求的跟踪都被取消。当鼠标再次进入窗口,并且要求进一步的鼠标盘旋跟踪时,应用程序必须调用TrackMouseEvent。   

该处使用自定义消息发送形式

ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)  ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover) 才能使用   

注意:WM_MOUSELEAVE响应函数为 

void OnMouseLeave(WPARAM wp,LPARAM lp),有些地方说,若写成 void OnMouseLeave(),Release下运行会出现错误.

备注:当鼠标指针在指定时间内停留在指定矩形内,就被认为是处于盘旋状态。调用函数   SystemParameterslnfo并使用SPI_GETMOUSEAOVERWIDTHSPI_GETMOUSEHOVERAEIGHT和   SFI_GETMOOSEAOVERTIME值来取得矩形的大小和时间。 

你可能感兴趣的:(user,query,mfc)