创建内存dc,解决界面闪烁

在使用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();          

创建内存dc,解决界面闪烁

上一篇:3.4 C与汇编程序的相互调用


下一篇:HDU 2046 骨牌铺方格