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

  • 相关阅读:
    GUID
    ORA-04044: 此处不允许过程, 函数, 程序包或类型和
    去掉word文档两边的空白
    Mysql数据库服务启动
    计算两个日期之间的天数
    SpringMVC——接收请求参数和页面传参
    ajax中get和post区别
    如何实现两个页面之间进行传值
    面试题
    MySQL数据库优化
  • 原文地址:https://www.cnblogs.com/lin1270/p/3155938.html
Copyright © 2011-2022 走看看