使用API函數TrackMouseEvent時,編譯器提示"未定義的標識符"
並且,與該函數有關的內容,如TRACKMOUSEEVENT結構等,也都如此.
察看頭文件,此函數和其相關內容是定義在winuser.h中的.
我已經在開頭包含了windows.h .
這種情況可以有如下解決方案:
1.在stdafx.h 最開頭加一句 #define _WIN32_WINNT 0x0500
2.使用這個_TrackMouseEvent這個函數名稱。
附錄A:
關於鼠標離開事件的解決方案:
void CMyWnd::OnMouseMove(UINT nFlags, CPoint point)
{
if (!bTrackLeave)
{
// 鼠標第一次移入窗口時, 請求一個WM_MOUSELEAVE 消息
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE;
_TrackMouseEvent(&tme);
bTrackLeave = TRUE;
// 在這裏添加處理鼠標進入的代碼 :
………………………………
}
}
手工添加消息映射和消息處理函數
BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
//{{AFX_MSG_MAP(CMyWnd)
………………………
//}}AFX_MSG_MAP
ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
END_MESSAGE_MAP()
LPARAM CMyWnd::OnMouseLeave(WPARAM wp, LPARAM lp)
{
bTrackLeave = FALSE;
// 在這裏添加處理鼠標離開的代碼 :
…………………………………..
return 0;
}
**********************************************************************************
附錄B:
TrackMouseEvent函數
TrackMouseEvent函數在鼠標離開某一窗口或在某一窗口上停留超過某一特定時間長度時發送消息。其函數原型:
BOOL TrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack);
參數lpEventTrack是一個指向TRACKMOUSEEVENT結構體的指針。
函數執行成功的話返回非零值(true),否則返回零(false)。
該函數可以發送的消息包括:
WM_MOUSEHOVER
鼠標在窗口的某一客戶區上停留上一次調用TrackMouseEvent函數時所設定的時間長度時發送。在該消息產生之後將停止跟蹤,如果需要進一步跟蹤鼠標的停留事件,必須再次調用TrackMouseEvent函數。
WM_MOUSELEAVE
當鼠標離開前一次調用TrackMouseEvent函數所設定的窗口的客戶區時發送該消息。在產生該消息時,所有由TrackMouseEvent請求的跟蹤都將被取消。如果需要對鼠標的hover事件進行進一步的跟蹤,必須在鼠標重新進入窗口裏再次調用TrackMouseEvent函數
TRACKMOUSEEVENT結構體
TRACKMOUSEEVENT結構體在TrackMouseEvent函數中用到。
其定義如下:
typedef struct tagTRACKMOUSEEVENT {
DWORD cbSize;
DWORD dwFlags;
HWND hwndTrack;
DWORD dwHoverTime;
} TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT;
幾個成員的含義:
cbSize 定義TRACKMOUSEEVENT結構體的大小;
dwFlags 定義服務請求,可以是下列值的組合:
TME_CANCEL 取消前一次的跟蹤請求;使用該項時必須指定要取消跟蹤的類型,例如要取消hover跟蹤,就必須同時傳送TME_CANCEL和TME_HOVER(TME_CANCEL|TME_HOVER)。
TME_HOVER hover通知。可以發送WM_MOUSEHOVER消息。如果在hover跟蹤處於激活狀態時再次請求hover跟蹤的話,hover的定時器將被重置。
TME_LEAVE 鼠標離開。發送TME_MOUSELEAVE消息。當鼠標不在指定的窗口或區域上時,將立即產生一個leave通知,不再做任何跟蹤。
TME_QUERY 這一項不是作爲跟蹤請求的。選中這一項時,當結構體被傳送給TrackMouseEvent函數時,即產生當前跟蹤。唯一不同的是返回的消耗時間,是真實的消耗時間而不是HOVER_DEFAULT,即使之前TrackMouseEvent函數所請求的是HOVER_DEFAULT。
hwndTrack 待跟蹤窗口的句柄
dwHoverTime 定義hover事件的耗盡時間(如果在dwFlags中有定義TME_HOVER的話),單位毫秒。
可以使用HOVER_DEFAULT來使用系統默認的hover事件耗盡時間。
系統默認的hover事件耗盡時間爲菜單下拉時間,即400毫秒。可以調用SystemParameterInfo函數並使用SPI_GETMOUSEHOVERTIME來獲取默認的hover耗盡時間。
默認的hover矩形區與雙擊區一致。可以調用SystemParameterInfo並使用SPI_GETMOUSEHOVERWIDTH和SPI_GETMOUSEHOVERHEIGHT來獲取鼠標在上面停留可以產生WM_MOUSEHOVER的區域。
另外還有一個小問題。前面一直都說的是TrackMouseEvent函數,但實在上,在程序中,如果直接使用TrackMouseEvent(&tme);時,會出現諸如“'TrackMouseEvent' : undeclared identifier”
的錯誤。但如果你使用_TrackMouseEvent(&tme);就不會有錯誤了。爲什麼呢?
這兩個函數的區別,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函數聯合使用,即使在鼠標移出窗口區時也能夠響應