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.
- MFX_WHEELWNDSTYLE_ONEDIRECTION
- 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 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