Introduction
Many applications that display images or documents show rulers on both sides of the view to indicate your position within the page and allow a more accurate positioning of the cursor. Implementing rulers can be difficult, since we must reserve a space for them inside the view (this gets more difficult on a CScrollView
-derived class). Another solution is to use "fixed" splitters (meaning they cannot be resized). The example below demonstrates how to build such rulers.
The Code
The code implementing the ruler splitter window and views used for the rulers themselves can be found in ruler.h and ruler.cpp. Below is a sample of how to use them.
Inside the frame window (which can be either a CFrameWnd
or CMDIChildWnd
-derived class):
class
CMainFrame : public
CFrameWnd
{
[...]
protected
:
DECLARE_FX_RULER(CMainFrame)
The next step is to create the splitter itself and the views. The code below matches a SDI application that accommodates the code above inside a splitter pane, but you can easily adjust it to fit your needs. In the OnCreateClient
member of the CMainFrame
class, add code to create the splitter inside the right pane:
IMPLEMENT_FX_RULER_SPLITTER(<className>,
<parentSplitter>, 0, 1, pContext->m_pNewViewClass);
What you have to do next is send notifications to the rulers to let them know about the scroll position change or zoom change. The rulers can also display the mouse position as the cursor moves; this is done also by sending notifications to the rulers with just a few lines of code like:
GetDocument()->UpdateAllViews(this,
VW_VSCROLL, (CObject*)(GetScrollPosition().y));
Available hint types are (hint parameters are passed as INT
s using a cast to CObject*
):
VW_HSCROLL | View is scrolled horizontally |
VW_VSCROLL | View is scrolled vertically |
VW_HPOSITION | Cursor position changed on the x axis |
VW_VPOSITION | Cursor position changed on the y axis |
The code is quite easy to follow and change to meet your needs, but if you need assistance, please leave a note in the comments section below. Also please send me bugs or updates, to keep this solution up-to-date. For more details on the sample application, contact me via the comments section below.
License
This article has no explicit license attached to it, but may contain usage terms in the article text or the download files themselves. If in doubt, please contact the author via the discussion board below.
A list of licenses authors might use can be found here.