Mouse Over Special Efects

Environment: This was built using Visual C++ 6.0 SP 2.
I used 16-bit color bitmaps, so if your resolution is set to 256 colors, it will probably not look very pleasing.

This is an updated version to my original posting. I have taken the comments that I received and have come up with a better version of the code. My thanks to Anatoly Ivasyuk, Jacques, and Dave Montgomery for their comments.

I needed a way to change a bitmap when the mouse went over it, and also to detect if the user pressed the mouse button. What I came up with was the following quick and easy solution.


void CMouseTrackDlg::OnMouseMove(UINT nFlags, CPoint point) 
{	
	m_Picture.GetWindowRect(&rect);
	ClientToScreen(&point);

	if (rect.PtInRect(point))
	{ 		      
		m_Picture.SetBitmap(bitmap2);		
	} 	      
	else 
	{
		m_Picture.SetBitmap(bitmap1);
	}	

	CDialog::OnMouseMove(nFlags, point);
}
All I did here was check to see if the mouse had entered into the bitmap. If it had, a different bitmap is displayed.

void CMouseTrackDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{	
	m_Picture.GetWindowRect(&rect);
	ClientToScreen(&point);

	if(rect.PtInRect(point))
		AfxMessageBox("You pressed the Visual C++ bitmap", MB_OK);
		
	CDialog::OnLButtonUp(nFlags, point);
}
Here I just wanted to check if the user pressed the left mouse button while inside the bitmap.

Make sure to load the bitmaps:

BOOL CMouseTrackDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	
	bitmap1.LoadBitmap(IDB_BITMAP1);
	bitmap2.LoadBitmap(IDB_BITMAP2);
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}
And make sure to initially declare the bitmaps, in this case there are only two. In addition to the bitmaps, you can see I declared a CRect which is used in the code above.

private:
	CRect rect;
	CBitmap bitmap1;
	CBitmap bitmap2;
Finally:

void CMouseTrackDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
{
	CDialog::OnActivate(nState, pWndOther, bMinimized);
	
	if(nState == WA_INACTIVE)
		m_Picture.SetBitmap(bitmap1);	
}
Here I mapped the OnActivate message to the dialog (CMouseTrackDlg) and if the dialog has lost its focus, then the orginal bitmap is displayed.

Download demo project - 13 KB

Download source - 21.7 KB



Comments

  • This is not so good...

    Posted by turkinz on 05/08/2004 08:57am

    The common problem with this and similar examples is that if you move your mouse over the button, and then pretty fast move it off the button and window area, the button still remains highlighted (as if there was the mouse pointer over it, but it's not). Look at Internet Explorer web pages. It's impossible to catch that kind of bug, there. I think they used some kind of Timer-based checking.

    Reply
  • Doing this to more that one image

    Posted by Legacy on 01/20/2000 12:00am

    Originally posted by: Hades

    Is there a way to use this code on multiple images, so you can have two buttons that change?

    Reply
  • WM_MOUSELEAVE

    Posted by Legacy on 04/07/1999 12:00am

    Originally posted by: Jacques

    you can have a look at WM_MOUSELEAVE

    if you are under Win NT 4 or Win98


    WM_MOUSELEAVE
    The WM_MOUSELEAVE message is posted to a window when the cursor leaves the client area of the window specified in a prior call to TrackMouseEvent.

    WM_MOUSEHOVER
    lParam = 0;
    wParam = 0;

    Return Values
    If an application processes this message, it should return zero.

    Remarks
    All tracking requested by TrackMouseEvent is canceled when this message is generated. The application must call TrackMouseEvent when the mouse re-enters its window if it requires further tracking of mouse hover behavior.

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: October 29, 2014 @ 11:00 a.m. ET / 8:00 a.m. PT Are you interested in building a cognitive application using the power of IBM Watson? Need a platform that provides speed and ease for rapidly deploying this application? Join Chris Madison, Watson Solution Architect, as he walks through the process of building a Watson powered application on IBM Bluemix. Chris will talk about the new Watson Services just released on IBM bluemix, but more importantly he will do a step by step cognitive …

  • A majority of organizations are operating under the assumption that their network has already been compromised, or will be, according to a survey conducted by the SANS Institute. With many high profile breaches in 2013 occurring on endpoints, interest in improving endpoint security is top-of-mind for many information security professionals. The full results of the inaugural SANS Endpoint Security Survey are summarized in this white paper to help information security professionals track trends in endpoint …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds