在使用vc开发图形相关的应用程序时,常常需要使用MFC的CDC类直接把图形画在窗口上。这通常是通过响应windows的WM_PAINT消息实现的。如果要画的图形比较复杂,或者比较大,那么画图过程可能会造成窗口的闪烁。当窗口调整大小时,这种闪烁由为明显。
解决窗口闪烁问题的有效办法就是使用内存DC,也称为缓冲DC。在内存中准备一个和窗口DC相同属性的DC,在这个内存DC上执行画图操作。完成画图以后,把画图输出的内容整体复制到目标窗口DC上。因为画图操作不在窗口DC上进行,所以在画图的过程中窗口可以保持原来的内容。当画好的内容被复制到窗口DC时,因为复制操作执行的非常快,所以用户感觉窗口仿佛被立刻被画好,从而消除了从旧画面到白板再到新画面的闪烁现象。
win32方式创建内存dc:
CRect rcClient;
GetClientRect(&rcClient);
CDC *pDC =
&dc;
CDC
dcMem;
dcMem.CreateCompatibleDC(pDC);
CBitmap
bmpMem;
bmpMem.CreateCompatibleBitmap(pDC,rcClient.Width(),rcClient.Height());
CBitmap
*pBmpOld = dcMem.SelectObject(&bmpMem);
// 使用dcMem进行绘图操作
pDC->BitBlt(m_3DModelRect.left,m_3DModelRect.top,m_3DModelRect.Width(),m_3DModelRect.Height(),
&dcMem,
m_3DModelRect.left,
m_3DModelRect.top,SRCCOPY);
dcMem.SelectObject(pBmpOld);
bmpMem.DeleteObject();
dcMem.DeleteDC();
MFC将上述操作封装成CMemDC类;
CMemDC cDC(dc, m_3DModelRect); //
内存dc的创建及销毁由构造与析构完成,内含错误检测机制;
CDC *pDC =
&cDC.GetDC();