65.9K
CodeProject 正在变化。 阅读更多。
Home

无闪烁绘图

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.29/5 (15投票s)

2002年6月29日

1分钟阅读

viewsIcon

187468

双缓冲(无闪烁绘图)的步骤。

双缓冲的解释

如果在短时间内需要重复地向屏幕绘制,那么每次逐步地向DC绘制,都会反复更新窗口,导致屏幕闪烁。

为了避免这种情况,我们首先在内存中绘制到一个DC(参见CDC MemDCCBitmap MemBitmap声明),并将最终的绘制结果存储在一个内存位图中。在完成所有绘制后,我们通过快速的单个bitblt调用将位图从内存移动到屏幕上。因此,我们只需要向屏幕绘制一次,从而完全避免闪烁。这种原理被称为双缓冲

示例代码:

此示例假定您将绘制填充的矩形到屏幕上。它生成随机的绿色阴影来填充该矩形。

如果您使用的是文档/视图架构,请在您的视图类的OnDraw()函数中使用此代码;如果您使用的是基于对话框的应用程序,则可以将此代码添加到OnPaint函数中。

    CRect rcClient;		
    GetClientRect(rcClient);	// See Note 1

    CDC MemDC,*pDC;
    CBitmap MemBitmap;

    pDC = this->GetDC()         // Get Current DC
    MemDC.CreateCompatibleDC(pDC);
    MemBitmap.CreateCompatibleBitmap(pDC,rcClient.right,rcClient.bottom);

    CBitmap *pOldBitmap = MemDC.SelectObject(&MemBitmap);
    CBrush bkBrush(HS_FDIAGONAL,RGB(0,rand()%255,0));	// See Note 2
    MemDC.FillRect(rcClient,&bkBrush);

    pDC->BitBlt(0,0,rcClient.right,rcClient.bottom,&MemDC,0,0,SRCCOPY);	//See Note 3
    MemDC.SelectObject(pOldBitmap);

注意 1:获取边界矩形的坐标。
注意 2:创建一个具有随机绿色阴影的画笔。rand()%255 会随机生成 0 到 255 之间的值。
注意 3:使用快速的bitblt函数调用将位图从内存dc复制到pdc

我希望我已经解释清楚了。祝你好运。

© . All rights reserved.