首页 > 其他 > 详细

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

时间:2014-01-21 18:57:38      阅读:473      评论:0      收藏:0      [点我收藏+]

在使用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,解决界面闪烁

原文:http://www.cnblogs.com/chengq/p/3527800.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!