GreenOpenPaint的实现(四)放大缩小处理滚动事件
放大缩小看似简单,实际上还是比较复杂的。所以专门拿出来说明。
缩放这块,主要就是处理m_pDoc->m_scalefactor
void CGreenOpenPaintView::OnButtonZoomin()
{
m_pDoc->ScaleFactorZoomIn();
OnUpdate(NULL, 0, NULL);
UpdateRulersInfo(RW_RESIZE, NULL);
}
void CGreenOpenPaintView::OnUpdateButtonZoomin(CCmdUI *pCmdUI)
{
pCmdUI->Enable((m_pDoc->m_fScaleFactor < ZOOM_MAX)?TRUE:FALSE);
}
void CGreenOpenPaintView::OnButtonZoomout()
{
m_pDoc->ScaleFactorZoomOut();
OnUpdate(NULL, 0, NULL);
UpdateRulersInfo(RW_RESIZE, NULL);
}
void CGreenOpenPaintView::OnUpdateButtonZoomout(CCmdUI *pCmdUI)
{
pCmdUI->Enable((m_pDoc->m_fScaleFactor > ZOOM_MIN)?TRUE:FALSE);
}
void CGreenOpenPaintView::OnButtonViewAll()
{
//获得和比例最接近的值.只比较宽度
CRect clientRect;
GetClientRect(clientRect);
float fzoom = 0;
//如果是小图片,直接全部显示
if (m_pDoc->m_image.Width() < clientRect.Width())
{
m_pDoc->m_fScaleFactor = ZOOM_NORMAL;
}else{
fzoom = clientRect.Width()/ m_pDoc->m_image.Width() ;
if (fzoom<=ZOOM_MIN)
{
m_pDoc->m_fScaleFactor = ZOOM_MIN;
}
else if (fzoom <= ZOOM_MIN*2)
{
m_pDoc->m_fScaleFactor = ZOOM_MIN*2;
}
else if (fzoom <= ZOOM_MIN*4)
{
m_pDoc->m_fScaleFactor = ZOOM_MIN;
}
else
{
m_pDoc->m_fScaleFactor = ZOOM_NORMAL;
}
}
OnUpdate(NULL, 0, NULL);
UpdateRulersInfo(RW_RESIZE, NULL);
}
void CGreenOpenPaintView::OnButtonNormal()
{
m_pDoc->m_fScaleFactor = ZOOM_NORMAL;
OnUpdate(NULL, 0, NULL);
UpdateRulersInfo(RW_RESIZE, NULL);
}
现在就可以正常缩放了。
处理mousewheel事件,这样就可以处理滚动和在按住ctrl下的缩放了
BOOL CGreenOpenPaintView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
if (nFlags == MK_CONTROL) //控制放大缩小
{
if (zDelta > 0)
{
OnButtonZoomin();
}
else
{
OnButtonZoomout();
}
}
else
{
int iPos = GetScrollPos(SB_VERT);
if (zDelta > 0)
{
SetScrollPos(SB_VERT,iPos-150,TRUE);
}
else
{
SetScrollPos(SB_VERT,iPos+150,TRUE);
}
UpdateRulersInfo(RW_VSCROLL, GetScrollPosition());
Invalidate(FALSE);
}
return CScrollView::OnMouseWheel(nFlags, zDelta, pt);
}
RIBBON在使用的时候,还是容易出现一些小的问题。可能是因为它是新的框架,在和原来代码融合的时候存在一些问题。这一点也是在重构的过程中发现出来的。