65.9K
CodeProject is changing. Read more.
Home

Implementing Rulers inside of Splitter Panes - 2

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.59/5 (13 votes)

Dec 19, 2002

CPOL
viewsIcon

110276

downloadIcon

3435

Using fixed panes to add rulers to your view

Sample Image - Mdi.gif

Introduction

Implementing Rulers inside of Splitter Panes - 2, is based on Stefan Ungureanu's work. This article provides an example to implementation in an MDI and SDI application.

I have changed the way to create the ruler, add function to Show/Hide the ruler and reformat some part of code.

Implementation

MDI way

#include "Ruler.h"
class CChildFrame : public CMDIChildWnd
{
    ...
    private: CRulerSplitterWnd m_Rulers; //Ruler object
    public: void ShowRulers(BOOL bShow);//Toggle the ruler
    void UpdateRulersInfo(stRULER_INFO stRulerInfo);//Update the ruler
    ...
};
//Create the ruler
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { if (!m_Rulers.CreateRulers(this, pContext)) { TRACE("Error creation of rulers\n"); return CMDIChildWnd::OnCreateClient(lpcs, pContext); } return TRUE; } //Toggle the ruler void CChildFrame::ShowRulers(BOOL bShow) { m_Rulers.ShowRulers(bShow);
} //Update the ruler
void CChildFrame::UpdateRulersInfo(stRULER_INFO stRulerInfo) { m_Rulers.UpdateRulersInfo(stRulerInfo); }

SDI way

#include "Ruler.h"
class CMainFrame : public CFrameWnd
{
    ....

All the rest is the same as MDI implementation.

Interaction

In your view (In this case CScrollView), catch >OnMouseMove, OnVScroll and OnHScroll messages to interact with the ruler.

//Update mouse position on the ruler
void CDemoView::OnMouseMove(UINT nFlags, CPoint point) { UpdateRulersInfo(RW_POSITION, GetScrollPosition(), point); ... //Update vertical scroll range and position of the ruler void CDemoView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { UpdateRulersInfo(RW_VSCROLL, GetScrollPosition()); ... //Update horizontal scroll range and position of the ruler void CDemoView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { UpdateRulersInfo(RW_HSCROLL, GetScrollPosition());

and finally

void CDemoView::UpdateRulersInfo(int nMessage, CPoint ScrollPos, CPoint Pos)
{
    stRULER_INFO pRulerInfo;
    pRulerInfo.uMessage = nMessage;
    pRulerInfo.ScrollPos = ScrollPos;
    pRulerInfo.Pos = Pos;
    pRulerInfo.DocSize = m_ImageSize;
    pRulerInfo.fZoomFactor = m_fZoomFactor;
    
    //CMainFrame in SDI
    ((CMainFrame*)GetParentFrame())->UpdateRulersInfo(pRulerInfo);
    //CChildFrame in MDI
    ((CChildFrame*)GetParentFrame())->UpdateRulersInfo(pRulerInfo);
}

Any way, take a look in the demo!

That's it!

Enjoy!