zoukankan      html  css  js  c++  java
  • 提升GDI画图的效率

    假设我们要画一个坐标图,里面可能还需要画网络线、XY各个单位的值、曲线或直线等,可能的函数代码如下:

    void OnPaint ()
    {
        CPaintDC dc (this);
        DrawXY (&dc);
        DrawValues (&dc);
    }

    当然,里面一般要使用双缓冲,以减少闪烁。

    画XY的时候,我们知道,我们要进行for 循环,以来画格子或是单位如

    |

    |

    |___________________________________>

    0      1        2        3      4      5      6

    0~6都是需要用for画出来的。

    如果这样的话,每一次OnPaint 都会for,但是,一般情况下,这个图是不会变的(除非改变了窗口大小,或是放大、缩小等),所以我们完成可以先画出来,然后再把它 COPY到 dc里就行了,所以代码可能改成如下:

    CDC dcMem;
    
    void OnPaint ()
    {
        CPaintDC dc (this);
        if (dcMem.m_hDC == NULL)
       {
             DrawXY (&dc);
       }
    
       CDC dcValue;
       dcValue.CreateCompatibleDC (&dc);
       //....
       DrawValue (&dcValue);   
    
       dc.BitBlt (0, 0, width, height, &dcMem, 0, 0, SRCCOPY);
       dc.BitBlit (........&dcValue.....);
    }

    我们使用外部已保存好的 dcMem,如果是第一次,dcMem.m_hDC == NULL, 就创建,那么下一次,我们就不能创建了,可以直接复制 BitBlt (.... SRCCOPY);

  • 相关阅读:
    spring boot-11.全局捕获异常
    spring boot-10.国际化
    spring boot-9.对springMVC的支持
    spring boot-8.静态资源映射
    spring boot-7.日志系统
    spring boot-6.profile 多环境支持
    spring boot-4.配置文件
    spring boot-3.原理探究
    【C/C++】产生随机数
    【C/C++】获取当前系统时间
  • 原文地址:https://www.cnblogs.com/lin1270/p/3155938.html
Copyright © 2011-2022 走看看