Visual Studio 6Visual C++ 7.0Windows 2000Visual C++ 6.0Windows XPMFCIntermediateDevVisual StudioWindowsC++
Implementing Rulers inside of Splitter Panes - 2
Using fixed panes to add rulers to your view
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!