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在使用的时候,还是容易出现一些小的问题。可能是因为它是新的框架,在和原来代码融合的时候存在一些问题。这一点也是在重构的过程中发现出来的。
  • 相关阅读:
    docker安装 与 基本配置
    linux 挂载windows ntfs 分区 -- centos 安装ntfs-3g
    Linux find 用法示例
    linux之sed用法
    js -ajax 学习
    搭建SSH框架整合Struts2和Spring时,使用@Autowired注解无法自动注入
    Hibernate学习之属性级别注解
    Hibernate学习之类级别注解
    org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
    Hibernate学习之二级缓存
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/6354345.html
Copyright © 2011-2022 走看看