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

双缓冲 DC 类

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.93/5 (12投票s)

2004年1月16日

1分钟阅读

viewsIcon

74159

downloadIcon

1723

具有双缓冲功能的 CDC 后代

引言

如果你曾经在窗口中自己绘制过东西,那么你一定知道闪烁的问题。解决这个问题的正确方法是使用双缓冲,通过创建离屏位图,在位图上绘制,然后将位图复制到窗口。这是一种相当简单的技术,但是你可以使用这个类来减少手动工作。

背景

技术非常简单。使用 CreateCompatibleDC() 函数创建内存 DC,然后创建所需大小的位图,并使用 SelectObject() 函数将其选择到内存 DC 中。在内存 DC 上绘制,并使用 BitBlt() 将结果复制到窗口 DC。关键是创建正确的位图。我使用 CreateBitmap() 函数来指定正确的 BPP 值。

Using the Code

要开始使用 CakBufferedDC 类,只需声明它的对象即可。请注意,这个类设计为仅在 WM_PAINT 消息处理程序(CWndOnPaint 方法)中使用。它将自动调用 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 对象被销毁时,它将自动将你的绘制内容复制到窗口。只有需要更新的区域才会被复制。

由于 CakBufferedDCCDC 的后代,你将能够使用 CDC 类中的所有方法(除了 Attach()Detach(),出于显而易见的原因),并将 CakBufferedDC 对象传递给期望 HDC 类型变量的 API 函数。如果你没有使用类似 MyPaintDC.m_hDC 这样的东西,你的代码将不会感觉到任何差异。

该类还为你提供了 ClientRect()WindowRect()UpdateRect() 方法,它们分别返回窗口的客户区矩形、窗口的矩形以及需要更新的矩形。

历史

  • 目前版本为 1.0。
© . All rights reserved.