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

缩放这块,主要就是处理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. VS2013快捷键

    这个好用,先放这两个 组合键“Ctrl+Enter”:在当前行的上面插入一个空行:  组合键“Ctrl+Shift+Enter”:在当前行的下面插入一个空行.

  2. JS 保存表单默认值 为空时自动填充默认值

    var inputArray = document.getElementsByTagName("input"); var strArray = []; ; i < input ...

  3. 解决报错:scandir() has been disabled for security reasons

    服务器环境: LNMP 在服务器部署代码时候.遇到了这个问题. 蛋疼啊! 2 解决办法:  打开phpinfo.php , 搜索: scandir 找到disabled_function,确认此函数未 ...

  4. 在fedora 18中将普通用户设置为sudo权限

    将一般的用户加入sudo组is not in the sudoers file. This incident will be reported 解决方法 在一般用户下执行sudo命令提示xxx is ...

  5. 巡风代码架构简介以及Flask的项目文件结构简介

    一.巡风: 巡风是一款什么东西,想必安全同行都不陌生吧.用它作为内网漏洞扫描管理架构是一种很好的选择,扫描快,开源,还可自己编写符合规则的POC直接放入相应目录来扩展.今天下午趁着有点时间捋了一下巡风 ...

  6. ELK平台介绍

    在搜索ELK资料的时候,发现这篇文章比较好,于是摘抄一小段: 以下内容来自:http://baidu.blog.51cto.com/71938/1676798 日志主要包括系统日志.应用程序日志和安全 ...

  7. [IIS] IIS Framework "aspnet_regiis.exe" 注册

    Error:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“

  8. interface Impl

    public interface ActionBarOperations { void initSthOne(); void initSthTwo(); } public class ActionBa ...

  9. Linux环境下安装Redis并完成测试(已验证)

    准备工作: 本人测试环境:Win7 xshell远程登录Linux Linux: ubuntu 软件包:redis-3..2.6.tar.gz (Linux下redis安装包) =========== ...

  10. aliyun oss 文件上传 java.net.SocketTimeoutException Read timed out 问题分析及解决

    upload ClientException Read timed out com.aliyun.openservices.ClientException: Read timed out        ...