假设我们要画一个坐标图,里面可能还需要画网络线、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 (, , width, height, &dcMem, , , SRCCOPY);
dc.BitBlit (........&dcValue.....);
}

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

04-25 22:30