PageCounter Object for ScrollViews

Environment: The demo project was created with VC++ 6.0 SP1

When scrolling in a document that consists of quite a lot pages it might be helpful for the user to get an information which page of the document would be displayed if he/she >would release to slider of the scrollbar at a certain position.
Microsoft Word has such a feature. It's a tooltip-like window that displays the page number that corresponds to the current position of the slider during scrolling.

I implemented a class named CScrollViewPageCounter that displays such a page number in a window that looks like a tooltip-window. If you have a look at the source code you'll find out that it was quite easy to implement. The code itself is self-explanatory...

HOW TO USE

To use the ScrollViewPageCounter-Object you have to perform the following steps:

1. Add the files ScrollViewPageCounter.h and ScrollViewPageCounter.cpp to your project.

2. Add a new member m_pScrollViewPageCounter to your scroll view class.

 
CScrollViewPageCounter*
m_pScrollViewPageCounter;
Of course your have to include the corresponding header file here as well:

 #include "ScrollViewPageCounter.h"

3. Create the page counter object in CYourScrollView::OnInitialUpdate()

 
BOOL CYourScrollView::PreCreateWindow(CREATESTRUCT& cs)
{
 CScrollView::OnInitialUpdate();

 // Instantiate the counter object
 m_pScrollViewPageCounter = new CScrollViewPageCounter( this );
 }

4. Add a command handler for the message WM_VSCROLL:

 void CYourScrollView::OnVScroll(UINT SBCode, UINT nPos, CScrollBar* pScrollBar) 
{
 if ( nSBCode == SB_THUMBTRACK )
 {
  // calculate page number (insert your algorithm here)
 UINT uiPageNumber = (UINT) (nPos / 10) + 1;

  // display page number 
  m_pScrollViewPageCounter->DisplayPageNumber( uiPageNumber );
 }

 // when scrolling is finished we have to hide the page counter
 if ( nSBCode == SB_ENDSCROLL )
 m_pScrollViewPageCounter->Reset();
 
 CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}
That's it.
Now compile and enjoy...

Download demo project - 33 KB

Download source - 3 KB

Date Last Updated: April 16, 1999



Comments

  • nPos only goes up to 32K

    Posted by wadigzon on 03/04/2004 10:00pm

    you've gotta use something like these in order to handle positions beyond 32K at ::OnVScroll(...) function.
    
    SCROLLINFO si;
    ZeroMemory(&si, sizeof(SCROLLINFO));
    si.cbSize = sizeof(SCROLLINFO);
    // Call GetScrollInfo to get current tracking 
    // position in si.nTrackPos
    if (!GetScrollInfo(SB_VERT, &si) )
    {
     return ; // GetScrollInfo failed
    }
    
    // this is the Page number
    UINT uiPageNumber = (UINT)(si.nTrackPos/10)+1;

    Reply
  • Thank you.

    Posted by Legacy on 12/08/2003 12:00am

    Originally posted by: NANA

    Great. This is exactly I was looking for. I had to integrate this to CListCtrl and it works great. Thank you.

    Reply
  • It looks nicer like this:

    Posted by Legacy on 06/21/1999 12:00am

    Originally posted by: Bruno Vais

    I think it looks nicer if the yellow thing moves aside the mouse. So delete the "s_bFirstCallDuringScrolling" member.
    Also, during scrolling the main view loses focus (of course). To avoid showing that dumb grey caption, at the end of your "DisplayPageNumber" function call
    "AfxGetMainWnd()->SendMessage(WM_NCACTIVATE,TRUE,0);".

    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 …

  • Packaged application development teams frequently operate with limited testing environments due to time and labor constraints. By virtualizing the entire application stack, packaged application development teams can deliver business results faster, at higher quality, and with lower risk.

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds