對於這個函數我也是最近想研究控制項自繪才知道它真正怎麼用.以前只是見到過.嗯,廢話不多說.
我先說下我的問題:如何響應滑鼠離開某個表單(控制項)事件?
先大概講下步驟,然後再集中對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_bOver為TRUE.
我們在到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_GETMOUSEAOVERWIDTH,SPI_GETMOUSEHOVERAEIGHT和 SFI_GETMOOSEAOVERTIME值來取得矩形的大小和時間。