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