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);

  • 相关阅读:
    mysql将一个表的数据 重复复制多份到表中
    PHP中将指定文本内容导入到word中
    系统安全-SElinux
    通过身份证号码提取年龄,性别
    MySQL-获取某天的数据
    mysql-介绍、MySQL部署、数据类型、存储引擎
    监控系统-ELK
    监控系统-Grafana
    监控系统-zabbix
    监控系统-openfalcon
  • 原文地址:https://www.cnblogs.com/lin1270/p/3155938.html
Copyright © 2011-2022 走看看