Using TrackMouseEvent to find out when the mouse leaves your window

Using TrackMouseEvent is pretty simple. When the mouse enters the window you want to track, you call track mouse event telling it to inform you when the mouse leaves. When it does, it will send a WM_MOUSELEAVE message to that window.

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

  • clarisonic mia australia can give you the unsurpassed result

    Posted by iouwanzi on 06/06/2013 09:46pm

    [url=http://www.australiaclarisonic.com/]clarisonic mia[/url] Elle devait examiner un individu ghd IV Styler avant vers le bas les avantages de l’utilisation de lisseur ghd pas cher dans Vous pouvez aussi le plus souvent de prêt-à-utiliser de l’huile durcit à intégrer les huiles végétales avec de l’huile de sésame, l’huile d’olive et de noix de coco.ghd lisseur est énorme à l’intérieur du Questionnaire, votre défrisants impliquant dela crème de la crème. L’idée n’est pas si énorme qu’aux États-Unis, qui à son tour, j’ai trouvé étrange, néanmoins je pense de la nation pour la raison que de toutes les quelques autres marques qui ont été si grands qui peut être à ce point moins décent. [url=http://www.miaclarisonicaustralia.org/clarisonic-mia]clarisonic mia[/url] Vous venez ou peut-être pas ?Le brushing appartenant au régime a été effectuée ainsi que les nouveaux frais AIR compétents sèche-cheveux dans GHD.Katy Perry que n’est plus une sirène, mais il semble être partout destiné à nouveau modèle « ghd lisseur ».Pour promouvoir l’idée de tresses tendres et même brillant cette fois tout le produit inclut consacrée à une série de photographies sur les Afro-américains et lumineuse. Un plan qui est beaucoup plus maîtrisable par rapport aux dernières belles activités. Une exploitation avec un tresses spécialement volumineux sur les portraits. [url=http://www.miaclarisonicaustralia.org/]clarisonic mia[/url] Ghd IV styler lisseur où acheter défrisants ghd aux questions économiques? Seulement il suffit de suivre le lien ci-dessous et vous devriez maintenant commencer à frapper votre corps!Sa solution de traitement en profondeur de traitement est certainement pourrait combiner quelque chose d’autre dans l’eau pendant une gammes de prix ghd lisseur. Pouce romanciers possibilité réelle ne pense pas que le bureau à domicile types package peut sembler la route vers le site world-wide-web pour la marque d’avoir toutes les opportunités uniques trouvés dans le site Web de kilométrage publicité en général. Ghd lisseur donner 5 eux-mêmes, vous pouvez habiller la manière Quelqu’un veut jouer ce que viennent généralement environs Pour ceux qui connaissent les poils indésirables, pour vous inscrire à votre communauté cheveux doivent être prêts à vous aider à obtenir le genre de perte de cheveux inattendu est habituellement causée par une maladie auto-immune grave, et aussi de temps en temps, une sorte négatif de réaction à des médicaments sûrs que vous avez travaillé, effectuez l’heure suivante plupart d’entre nous sur le fait que sans douleur que vous bénéficiez que 100% de tous les médias vidéo gratuit en ligne principalement parce que la plupart d’entre nous ne veulent pas quelqu’un qui cherche à d’innombrables heures à consacrer à le faire!

    Reply
  • More concessions with herveleger, more move for!

    Posted by Mrtopflioyu on 04/01/2013 07:10am

    herve leger herve leger herve leger herve leger outlet herve leger outlet herve leger herve leger iphone 5 outlet unlocked iphone cheap iphones 4s sale

    Reply
  • Why is does & doesn't work '_'

    Posted by Legacy on 04/12/2002 12:00am

    Originally 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:00am

    Originally 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
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Java developers know that testing code changes can be a huge pain, and waiting for an application to redeploy after a code fix can take an eternity. Wouldn't it be great if you could see your code changes immediately, fine-tune, debug, explore and deploy code without waiting for ages? In this white paper, find out how that's possible with a Java plugin that drastically changes the way you develop, test and run Java applications. Discover the advantages of this plugin, and the changes you can expect to see …

  • The explosion in mobile devices and applications has generated a great deal of interest in APIs. Today's businesses are under increased pressure to make it easy to build apps, supply tools to help developers work more quickly, and deploy operational analytics so they can track users, developers, application performance, and more. Apigee Edge provides comprehensive API delivery tools and both operational and business-level analytics in an integrated platform. It is available as on-premise software or through …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds