要知道什麼時候一個滑鼠指針進入一個視窗或是在它上面移動是非常簡單的,因為視窗會接收到WM_MOUSEMOVE消息.在Windows NT 4.0中初次亮相的::TrackMouseEvent函數使得确定什麼時刻滑鼠指針離開視窗或者是靜止懸于視窗上變得同樣的簡單.該函數在Windows 98中也是支援的.通過使用::TrackMouseEvent,一個應用程式能夠注冊為當滑鼠指針離開一個視窗時接收到WM_MOUSELEAVE消息,當滑鼠指針懸于視窗上時接收到WM_MOUSEHOVER消息.
::TrackMouseEvent僅僅接收一個參數:一個指向TRACKMOUSEEVENT結構體的指針.該結構體在Winuser.h中定義為:
typedef struct tagTRACKMOUSEEVENT {
DWORD cbSize;
DWORD dwFlags;
HWND hwndTrack;
DWORD dwHoverTime;
} TRACKMOUSEEVENT; |
// In the message map
ON_WM_MOUSEMOVE ()
ON_MESSAGE (WM_MOUSELEAVE, OnMouseLeave)
ON_MESSAGE (WM_MOUSEHOVER, OnMouseHover)
void CMainWindow::OnMouseMove (UINT nFlags, CPoint point)
{
if (!m_bMouseOver) {
TRACE (_T ("Mouse enter/n"));
m_bMouseOver = TRUE;
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof (tme);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.hwndTrack = m_hWnd;
tme.dwHoverTime = HOVER_DEFAULT;
::TrackMouseEvent (&tme);
}
}
LRESULT CMainWindow::OnMouseLeave (WPARAM wParam, LPARAM lParam)
{
TRACE (_T ("Mouse leave/n"));
m_bMouseOver = FALSE;
return 0;
}
LRESULT CMainWindow::OnMouseHover (WPARAM wParam, LPARAM lParam)
{
TRACE (_T ("Mouse hover (x=%d, y=%d)/n"),
LOWORD (lParam), HIWORD (lParam));
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof (tme);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.hwndTrack = m_hWnd;
tme.dwHoverTime = HOVER_DEFAULT;
::TrackMouseEvent (&tme);
return 0;
} |