无闪烁绘图






4.29/5 (15投票s)
2002年6月29日
1分钟阅读

187468
双缓冲(
双缓冲的解释
如果在短时间内需要重复地向屏幕绘制,那么每次逐步地向DC
绘制,都会反复更新窗口,导致屏幕闪烁。
为了避免这种情况,我们首先在内存中绘制到一个DC
(参见CDC MemDC
和CBitmap 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
。
我希望我已经解释清楚了。祝你好运。