• 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在使用的时候,还是容易出现一些小的问题。可能是因为它是新的框架,在和原来代码融合的时候存在一些问题。这一点也是在重构的过程中发现出来的。
  • 相关阅读:
    系统架构技能之设计模式组合模式
    系统架构师基础到企业应用架构单机软件架构
    设计模式系列装饰模式
    设计模式系列命令模式
    设计模式系列外观模式
    设计模式系列原型模式
    设计模式系列代理模式
    设计模式系列桥接模式
    设计模式系列适配器模式
    设计模式系列享元模式
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/6354345.html
Copyright © 2020-2023  润新知