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在使用的时候,还是容易出现一些小的问题。可能是因为它是新的框架,在和原来代码融合的时候存在一些问题。这一点也是在重构的过程中发现出来的。
  • 相关阅读:
    [手把手]VMware 16 pro 装 Windows11专业版并激活
    [HTML] 做个空壳网页练手(菜鸡的自我信息完善
    从零玩HTML的一天
    [总结]C++ 之 向量vector
    [递归专题打卡]2021 6.30-7.2
    初学Socket笔记
    对java是编译型语言还是解释型语言的讨论
    PHP CURL POST 请求设置 Content-Type (指定Content-Type)
    webpack 报错 [webpack-cli] Unable to load '@webpack-cli/serve' command
    Vue cli 创建项目模板 / npm run build 打包后资源引用问题
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/6354345.html
Copyright © 2011-2022 走看看