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: December 11, 2014 @ 1:00 p.m. ET / 10:00 a.m. PT Market pressures to move more quickly and develop innovative applications are forcing organizations to rethink how they develop and release applications. The combination of public clouds and physical back-end infrastructures are a means to get applications out faster. However, these hybrid solutions complicate DevOps adoption, with application delivery pipelines that span across complex hybrid cloud and non-cloud environments. Check out this …

  • VMware vCloud® Government Service provided by Carpathia® is an enterprise-class hybrid cloud service that delivers the tried and tested VMware capabilities widely used by government organizations today, with the added security and compliance assurance of FedRAMP authorization. The hybrid cloud is becoming more and more prevalent – in fact, nearly three-fourths of large enterprises expect to have hybrid deployments by 2015, according to a recent Gartner analyst report. Learn about the benefits of …

Most Popular Programming Stories

More for Developers

RSS Feeds