Using TrackMouseEvent to find out when the mouse leaves your window
Posted
by Douglas Peterson
on August 6th, 1998
If you add this code to any of your existing view classes (or any CWnd derived class), you will see a drag rectangle that follows the mouse cursor around. If you move the mouse outside the window, it will disappear. If you move the mouse back into the window, it will reappear.
******************************************************************************** // TrackView.h changes // class CTrackView : public CView { // Add data members protected: CRect m_rectLast; //** Added line BOOL m_bMouseTracking; //** Added line // Add message handler prototype afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam); //** Added line }; **************************************************************************************** // TrackView.cpp changes // // Add message handler BEGIN_MESSAGE_MAP(CTrackView, CView) ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave) //** Added line END_MESSAGE_MAP() CTrackView::CTrackView() { m_bMouseTracking = FALSE; //** Added line } ///////////////////////////////////////////////////////////////////////////// // CTrackView message handlers //** Added function LRESULT CTrackView::OnMouseLeave(WPARAM wParam, LPARAM lParam) { // Draw last rect, but no new one (erase old rect) CClientDC dc(this); dc.DrawDragRect(CRect(0,0,0,0), CSize(0,0), m_rectLast, CSize(2,2)); m_rectLast = CRect(0,0,0,0); m_bMouseTracking = FALSE; return TRUE; } void CTrackView::OnMouseMove(UINT nFlags, CPoint point) { // Calc new rectangle CRect rectNew(point.x-20, point.y-20, point.x+20, point.y+20); CClientDC dc(this); // WM_MOUSEMOVE + !m_bMouseTracking becomes the equivalent of // WM_MOUSEENTER of which there is no such thing. if (!m_bMouseTracking) { TRACKMOUSEEVENT tme; tme.cbSize = sizeof(TRACKMOUSEEVENT); tme.dwFlags = TME_LEAVE; tme.hwndTrack = this->m_hWnd; if (::_TrackMouseEvent(&tme)) { m_bMouseTracking = TRUE; // Draw new rect, but no last rect as we are starting anew dc.DrawDragRect(rectNew, CSize(2,2), NULL, CSize(0,0)); } } else { // Draw new rect and erase old rect dc.DrawDragRect(rectNew, CSize(2,2), m_rectLast, CSize(2,2)); } // Remember where we drew this rectangle m_rectLast = rectNew; CView::OnMouseMove(nFlags, point); } ****************************************************************************************
Here's a helper class I use to make it a little simpler:
class CTrackMouseEvent : public tagTRACKMOUSEEVENT { public: CTrackMouseEvent(CWnd* pWnd, DWORD dwFlags = TME_LEAVE, DWORD dwHoverTime = HOVER_DEFAULT) { ASSERT_VALID(pWnd); ASSERT(::IsWindow(pWnd->m_hWnd)); this->cbSize = sizeof(TRACKMOUSEEVENT); this->dwFlags = dwFlags; this->hwndTrack = pWnd->m_hWnd; this->dwHoverTime = dwHoverTime; } BOOL Track() { return _TrackMouseEvent(this); } };
You can start tracking like this:
if (!m_bMouseTracking) m_bMouseTracking = CTrackMouseEvent(this).Track();

Comments
More concessions with herveleger, more move for!
Posted by Mrtopflioyu on 04/01/2013 07:10amherve leger herve leger herve leger herve leger outlet herve leger outlet herve leger herve leger iphone 5 outlet unlocked iphone cheap iphones 4s sale
ReplyWhy is does & doesn't work '_'
Posted by Legacy on 04/12/2002 12:00amOriginally posted by: James White
This is just a guess, but I would think the reason it does work on some systems and doesn't on others is the _ you prefix the TrackMouseEvent function with. I read somewhere that the _TrackMouseEvent is an IE implemented funciton where TrackMouseEvent is part of the Win32 API (post 95). That could explain why some people see it work and some don't.
Reply
Easier way to track mouse out event
Posted by Legacy on 01/16/2002 12:00amOriginally posted by: Z Mohamed Mustafa
Easier way to track mouse out event
To track the mouse leave event I have used the following method hope it helps.
Step 1:
Add the following members in your window class in which you want to track the mouse out event.
BOOL bTracking;
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
//default mouse move handler.
afx_msg void OnMouseLeave();
//user defined mouse leave handler
Step 2:
Initialize bTracking = false; in the constructor.
Step 3:
Add the code snippet in your handlers
void YourWndClass::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here
// and/or call default
if(!bTracking)
// Do not track if already tracking
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.dwFlags = TME_LEAVE;
tme.hwndTrack = m_hWnd;
tme.dwHoverTime = HOVER_DEFAULT;
::_TrackMouseEvent(&tme);
bTracking = true;
}
// Your extra coding on mouse move goes here....
BaseClass::OnMouseMove(nFlags, point);
}
void YourWndClass::OnMouseLeave()
{
// after MouseLeave no tracking is done.
// When the mouse leaves the window this function
// is fired.
// Your extra coding on mouse leave goes here....
bTracking = false;
}
Reply