标尺对于图像处理程序,特别是需要精确测量的程序来说意义很大。这里进行了专门的研究。
基于现在已经引入的类和定义的变量,主要讲一讲如何调用。
1、添加放大缩小
void CGreenOpenPaintDoc::ScaleFactorZoomIn(void)
{
if (m_fScaleFactor < ZOOM_MAX)
{
m_fScaleFactor = m_fScaleFactor*2;
}
}
void CGreenOpenPaintDoc::ScaleFactorZoomOut(void)
{
if (m_fScaleFactor > ZOOM_MIN)
{
m_fScaleFactor = m_fScaleFactor /2;
}
}
2、在view中添加添加warpper
void CGreenOpenPaintView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
SetScrollSizes(MM_TEXT,
CSize(int(m_pDoc->m_image.Width()*m_pDoc->m_fScaleFactor),
int(m_pDoc->m_image.Height()*m_pDoc->m_fScaleFactor)));
UpdateRulersInfo(RW_POSITION, GetScrollPosition());
Invalidate();
}
void CGreenOpenPaintView::UpdateRulersInfo(int nMessage, CPoint ScrollPos, CPoint Pos)
{
if (!m_pParent)
return;
CSize m_ImageSize = CSize(m_pDoc->m_image.Width(),m_pDoc->m_image.Height());
stRULER_INFO pRulerInfo;
pRulerInfo.uMessage = nMessage;
pRulerInfo.ScrollPos = ScrollPos;
pRulerInfo.Pos = Pos;
pRulerInfo.DocSize = m_ImageSize;
pRulerInfo.fZoomFactor = m_pDoc ->m_fScaleFactor;
m_pParent->UpdateRulersInfo(pRulerInfo);
}
3、mainframe中添加 warpper
void CMainFrame::UpdateRulersInfo(stRULER_INFO stRulerInfo)
{
m_Rulers.UpdateRulersInfo(stRulerInfo);
}
void CMainFrame::ShowRulers(bool bShow)
{
m_Rulers.ShowRulers(bShow);
}
注意要把m_ruler添入
private:
CRulerSplitterWnd m_Rulers;
4、重写mainframe 的 oncreateclient事件
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,CCreateContext* pContext)
{
if (!m_Rulers.CreateRulers(this, pContext)) {
TRACE("rulers创建失败\n");
return CFrameWnd::OnCreateClient(lpcs, pContext);
}
return TRUE;
}
这个时候标尺出现,只不过由于没有指示量纲,所以没有画刻度
p.s 注意这个时候,一定要在view创建的时候进行scroll尺度的初始化,否则会assert错误
CGreenOpenPaintView :: CGreenOpenPaintView ()
: m_pParent(NULL)
, m_pDoc(NULL)
{
// TODO: 在此处添加构造代码
CSize sizeTotal;
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);
}
当导入图片的时候,出现真实标尺。这里是按照厘米这个量纲进行计算的。