Intellimouse panning 2 (A universal Auto-Panning solution)

This article improves on the code submitted by Umut Alev, Auto-Panning Windows.
This article also uses some code submitted by Lutz Kretzschmar, Intellimouse panning.
This article integrates some code submitted by Russel Freeman, Auto-Panning Windows 2.

How it looks like

Improvements made to original version

  • Modified behavior and look to match IE4.
  • Added continous subpixel scrolling adapted from Lutz.
  • Modified the speed calculation to use a faster acceleration when more than 42 pixel away from start region.
  • Added support for lots of Controls and Views
  • Added style flags to customize behavior
    • MFX_WHEELWNDSTYLE_ONEDIRECTION
      No diagonal panning.
    • MFX_WHEELWNDSTYLE_UPDOWNONLY/MFX_WHEELWNDSTYLE_LEFTRIGHTONLY
      Limit panning to either UP/DOWN or LEFT/RIGHT.
    • MFX_WHEELWNDSTYLE_NOSUBPIXELSCROLLING
      No continous subpixel scrolling.
  • Moved the Resources to a RecourceTemplate for a better handling.
  • Nearly every parameter is customizable through "CAutoPanParameters"-classes.
    • Provide a own Origin-Bitmap
    • Use your own Cursors
    • Directly scroll the window with your own functions
    • Or just replace the width of one scrolling-step...
  • Of course the code does compile without any Level 4 warning.

Currently supportet Views and Controls

  • CEditView
  • CFormView
  • CListView (all modes)
  • CRichEditView
  • CScrollView
  • CTreeView
  • ComboBox (different look&feel)
  • Edit
  • ListBox
  • ListCtrl (all modes)
  • SpinButton (different look&feel)
  • TreeCtrl

Using in a View - with macros


	void CAutoPanView::OnMButtonDown(UINT nFlags, CPoint point) 
	{
		CWheelWnd_OnMButtonDown(CScrollView);
	}
 

Using in a View - without macros


	void CAutoPanView::OnMButtonDown(UINT nFlags, CPoint point) 
	{
		BOOL bCtl = GetKeyState(VK_CONTROL) & 0x8000;
		if(!bCtl && nFlags == MK_MBUTTON)
		{
			MfxTrackAutoPan(this);
		}
		else
		{
			CScrollView::OnMButtonDown(nFlags, point);
		}
	}
 

Using in a CDialog - with macros


	void CAutopanDialog::OnMButtonDown(UINT nFlags, CPoint point) 
	{
		CWheelWnd_OnMButtonDown(CDialog);
	}

	BOOL CAutopanDialog::PreTranslateMessage(MSG* pMsg) 
	{
		CWheelWnd_PreTranslateMessage(CDialog);
	}
 

Using in a CDialog - without macros


	void CAutopanDialog::OnMButtonDown(UINT nFlags, CPoint point) 
	{
		BOOL bCtl = GetKeyState(VK_CONTROL) & 0x8000;
		if(!bCtl && nFlags == MK_MBUTTON)
		{
			CWnd* pWnd = WindowFromPoint(point);
			if (pWnd) MfxTrackAutoPan(pWnd);
			else CDialog::OnMButtonDown(nFlags, point);
		}
		else
		{
			CDialog::OnMButtonDown(nFlags, point);
		}
	}

	BOOL CAutopanDialog::PreTranslateMessage(MSG* pMsg) 
	{
		if (pMsg && pMsg->message==WM_MBUTTONDOWN)
		{
			OnMButtonDown(pMsg->wParam, CPoint(pMsg->pt));
			return TRUE;
		}
		else
		{
	 		return CDialog::PreTranslateMessage(pMsg);
		}
	}
 

Download source - 12KB

Download the three source files mfxWhlPan.h, mfxWhlPan.c and mfxWhlPan.inl and the new cursors in this ZIP file. You must download either Umats demo project - 38KB and replace the two files and the cursors - or use my extended demo project - 84KB. To have a quick look the executable - 63KB is also availible.

Last updated: 6 July 1998



Comments

  • Intellimouse panning 2 (A universal Auto-Panning solution)

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

    Originally posted by: Michael Herstine

    Great code - just one small problem. If you use CAutoPanParametersMessage, it uses the SB_THUMBPOSITION parameter with the WM_HSCROLL/WM_VSCROLL messages. Unfortunately, CScrollView doesn't check for this; it checks for SB_THUMBTRACK (which causes a fall-through in their case statement, and no scrolling). I don't know if this is an oversight or intentional on the part of MFC, but changing lines 21 & 22 of mfxWhlPan.inl from:

    pParentWnd->SendMessage(WM_HSCROLL, MAKELONG(SB_THUMBPOSITION, nScrollToX), NULL);
    pParentWnd->SendMessage(WM_VSCROLL, MAKELONG(SB_THUMBPOSITION, nScrollToY), NULL);

    to

    pParentWnd->SendMessage(WM_HSCROLL, MAKELONG(SB_THUMBTRACK, nScrollToX), NULL);
    pParentWnd->SendMessage(WM_VSCROLL, MAKELONG(SB_THUMBTRACK, nScrollToY), NULL);

    will get things to work. Again, a really nice solution.

    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 …

  • Protecting business operations means shifting the priorities around availability from disaster recovery to business continuity. Enterprises are shifting their focus from recovery from a disaster to preventing the disaster in the first place. With this change in mindset, disaster recovery is no longer the first line of defense; the organizations with a smarter business continuity practice are less impacted when disasters strike. This SmartSelect will provide insight to help guide your enterprise toward better …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds