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

posted @ 2013-06-26 08:43  夜雨無聲  阅读(396)  评论(0编辑  收藏  举报