双缓冲 DC 类






3.93/5 (12投票s)
2004年1月16日
1分钟阅读

74159

1723
具有双缓冲功能的 CDC 后代
引言
如果你曾经在窗口中自己绘制过东西,那么你一定知道闪烁的问题。解决这个问题的正确方法是使用双缓冲,通过创建离屏位图,在位图上绘制,然后将位图复制到窗口。这是一种相当简单的技术,但是你可以使用这个类来减少手动工作。
背景
技术非常简单。使用 CreateCompatibleDC()
函数创建内存 DC,然后创建所需大小的位图,并使用 SelectObject()
函数将其选择到内存 DC 中。在内存 DC 上绘制,并使用 BitBlt()
将结果复制到窗口 DC。关键是创建正确的位图。我使用 CreateBitmap()
函数来指定正确的 BPP 值。
Using the Code
要开始使用 CakBufferedDC
类,只需声明它的对象即可。请注意,这个类设计为仅在 WM_PAINT
消息处理程序(CWnd
的 OnPaint
方法)中使用。它将自动调用 BeginPaint()
和 EndPaint()
函数。
void CSomeWindow::OnPaint() { CakBufferedDC dc(this); // device context for painting // Do the stuff dc.FillRect(&dc.ClientRect(), &FancyBruch); dc.DrawText(_T("Hello world"), &dc.ClientRect(), DT_VCENTER|DT_SINGLELINE); }
当 CakBufferedDC
对象被销毁时,它将自动将你的绘制内容复制到窗口。只有需要更新的区域才会被复制。
由于 CakBufferedDC
是 CDC
的后代,你将能够使用 CDC
类中的所有方法(除了 Attach()
和 Detach()
,出于显而易见的原因),并将 CakBufferedDC
对象传递给期望 HDC
类型变量的 API 函数。如果你没有使用类似 MyPaintDC.m_hDC
这样的东西,你的代码将不会感觉到任何差异。
该类还为你提供了 ClientRect()
、WindowRect()
和 UpdateRect()
方法,它们分别返回窗口的客户区矩形、窗口的矩形以及需要更新的矩形。
历史
- 目前版本为 1.0。