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

缩放这块,主要就是处理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的实现(四)放大缩小处理滚动事件的更多相关文章

  1. 【开源】专业K线绘制[K线主副图、趋势图、成交量、滚动、放大缩小、MACD、KDJ等)

    这是一个iOS项目雅黑深邃的K线的绘制. 实现功能包括K线主副图.趋势图.成交量.滚动.放大缩小.MACD.KDJ,长按显示辅助线等功能 预览图 最后的最后,这是项目的开源地址:https://git ...

  2. viewer && ImageFlow 图片滚动组件 图片点击放大 可以滚轮放大缩小 viewer

    ImageFlow https://finnrudolph.com/products/imageflow https://github.com/countzero/ImageFlow http://w ...

  3. HYStockChart, 股票图(包括K线图、趋势图、成交量、滚动、放大缩小等)

    HYStockChart, 股票图(包括K线图.趋势图.成交量.滚动.放大缩小等) https://www.helplib.com/GitHub/article_127980git 地址 http:/ ...

  4. ThreeJs 导入外部三维模型,并实现鼠标滚动放大缩小旋转效果

    let i = ; function init() { // create a scene, that will hold all our elements such as objects, came ...

  5. js点击图片查看大图,并可以拖动,且滚动滑轮放大缩小

    方法一:此方法在页面没有滚动条时无法缩放 JQuery function hideMax(){ $(".MAX_div").remove(); $("#Cover_Div ...

  6. C# GDI绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框

    最近工作需要,要做一个矩形框,并且 用鼠标左键拖动矩形框移动其位置.网上查了一些感觉他们做的挺复杂的.我自己研究一天,做了一个比较简单的,发表出来供大家参考一下.如觉得简单,可路过,谢谢.哈哈. 先大 ...

  7. Canvas实现图片放大缩小移动操作

    对于HTML5相信大家都不陌生,很早就出来了,但是貌似都没有真正的使用过.最近做项目时要实现这样一个需求:一个图片,大小不固定,要求能实现类似地图一样放大.缩小.移动功能.这里就很合适使用html5的 ...

  8. vue项目 一行js代码搞定点击图片放大缩小

    一行js代码搞定xue项目需要点击图片放大缩小,其实主要用的是用到了vue:class的动态切换,内容比较简单.一开始我把维护的需求想得太复杂了,和测试小姐姐聊了一下才反应过来. 两个月不到跟了四个项 ...

  9. jquery 实现点击图片居住放大缩小

    该功能是基于jquery实现的,所以 第一步则是引入jquery jquery下载地址:https://jquery.com/download/ 或者使用此时调试的版本(3版本) /*! jQuery ...

随机推荐

  1. GROW

    经理今天介绍了一下,GROW,就给他放上来了:   有一个辅导的方法 叫做 GROW (G:goal:R:reality:O:option:W:will)这个辅导方法是这样的,客观地给自己或者别人提问 ...

  2. Js跨域、父级窗口执行JS赋值、取值,更改元素

    网站域名: A:http://www.xxoo.com/a.html B:http://www.aabb.com/b.html B网站嵌套与A网站(A的a中的Iframe指向B中的b)b要让父级a页面 ...

  3. poj_2315 最小费用最大流

    题目大意 一个图上有N个顶点,从1到N标号,顶点之间存在一些无向边,边有长度,要求从顶点1走到顶点N,再从顶点N走回顶点1,其中不必要经过每个顶点,但是要求走的路径上的边只能经过一次.求出从1---& ...

  4. c++11实现l延迟调用(惰性求值)

    惰性求值 惰性求值一般用于函数式编程语言中,在使用延迟求值的时候,表达式不在它被绑定到变量之后就立即求值,而是在后面的某个时候求值.     可以利用c++11中的std::function, lam ...

  5. poj_3067 树状数组

    题目大意 左右两个竖排,左边竖排有N个点,从上到下依次标记为1,2,...N; 右边竖排有M个点,从上到下依次标记为1,2....M.现在从K条直线分别连接左边一个点和右边一个点,求这K条直线的交点个 ...

  6. Java三方---->excel框架之POI的使用一

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能.pdf框架之IText的使用,参见我的博客:Java ...

  7. Deploying Cloud Foundry on OpenStack Juno and XenServer (Part I)

    link http://rabbitstack.github.io/deploying-cloud-foundry-on-openstack-juno-and-xenserver-part-i/ Cl ...

  8. 腾讯云大数据套件Hermes-MR索引插件使用总结

    版权声明:本文由王亮原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/121 来源:腾云阁 https://www.qclou ...

  9. Centos7 安装zabbix3.0 服务端 详细

    参考: https://www.cnblogs.com/37yan/p/6879218.html http://blog.csdn.net/hao134838/article/details/5712 ...

  10. koan重装system

    author:headsen chen date: 2018-08-02   16:29:51 koan是kickstart-over-a-network的缩写,它是cobbler的客户端帮助程序,k ...