首页 > 其他 > 详细

GreenOpenPaint的实现(四)放大缩小处理滚动事件

时间:2017-01-28 17:25:48      阅读:298      评论:0      收藏:0      [点我收藏+]

放大缩小看似简单,实际上还是比较复杂的。所以专门拿出来说明。

缩放这块,主要就是处理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在使用的时候,还是容易出现一些小的问题。可能是因为它是新的框架,在和原来代码融合的时候存在一些问题。这一点也是在重构的过程中发现出来的。

GreenOpenPaint的实现(四)放大缩小处理滚动事件

原文:http://www.cnblogs.com/jsxyhelu/p/6354345.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!