zoukankan      html  css  js  c++  java
  • 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在使用的时候,还是容易出现一些小的问题。可能是因为它是新的框架,在和原来代码融合的时候存在一些问题。这一点也是在重构的过程中发现出来的。
  • 相关阅读:
    暂时收藏了
    SQL基础教程(第2版)第8章 SQL高级处理:8-1 窗口函数
    SQL基础教程(第2版)第7章 集合运算:练习题
    SQL基础教程(第2版)第7章 集合运算:7-2 联结(以列为单位对表进行联结)
    SQL基础教程(第2版)第7章 集合运算:7-1 表的加减法
    SQL基础教程(第2版)第6章 函数、谓词、CASE表达式:练习题
    SQL基础教程(第2版)第6章 函数、谓词、CASE表达式:6-3 CASE表达式
    SQL基础教程(第2版)第6章 函数、谓词、CASE表达式:6-2 谓词
    iOS 数据格式
    Podfile grammar
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/6354345.html
Copyright © 2011-2022 走看看