MFC绘图窗口闪烁解决方法or内存DC
来源:互联网 发布:nginx 跳转 url不变 编辑:程序博客网 时间:2024/05/17 04:55
内存DC
在使用vc开发图形相关的应用程序时,常常需要使用MFC的CDC类直接把图形画在窗口上。这通常是通过响应windows的WM_PAINT消息实现的。如果要画的图形比较复杂,或者比较大,那么画图过程可能会造成窗口的闪烁。当窗口调整大小时,这种闪烁由为明显。
解决窗口闪烁问题的有效办法就是使用内存DC,也称为缓冲DC。在内存中准备一个和窗口DC相同属性的DC,在这个内存DC上执行画图操作。完成画图以后,把画图输出的内容整体复制到目标窗口DC上。因为画图操作不在窗口DC上进行,所以在画图的过程中窗口可以保持原来的内容。当画好的内容被复制到窗口DC时,因为复制操作执行的非常快,所以用户感觉窗口仿佛被立刻被画好,从而消除了从旧画面到白板再到新画面的闪烁现象。
生成内存DC主要用到以下四个函数:
CreateCompatibleDC(CDC* pDC )。CDC类的成员函数,用于创建一个和pDC指向的DC兼容的内存DC。
CreateDiscardableBITmap( CDC* pDC, int nWidth, int nHeight)。CBitmap类的成员函数,用于按指定尺寸创建一个和pDC指向的DC兼容的位图。
SelectObject(CBitmap * pBitmap)。CDC类的成员函数,执行以后,所以在该DC上的图像输出都将被画到pBitmap指向的位图上。
BOOL BitBlt (int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop )。CDC类的成员函数,用于从源DC(pSrcDC)复制一个矩形的图象到当前DC中。
对于一个窗口,我们可以用下面的代码来创建内存DC,在内存DC上输出,并最终复制到窗口DC上。
}
当然,实际的情况下,我们需要考虑的更多,因为内存DC、位图的创建都可能会失败。为了简化代码,笔者定义了一个类CMemoryDC,包装了内存DC创建过程中的出错处理,内存DC的事后清理等操作,并自动复制内存DC的内容到目标DC上。
#include
public:
}
CMemoryDC::CMemoryDC(CDC
}
CMemoryDC::
...{
}
}
void
}
CDC*
}
CMemoryDC::operator
}
GetClientRect(Rect);
CPaintDC
}
- MFC绘图窗口闪烁解决方法or内存DC
- 关于内存DC绘图防止屏幕闪烁
- 使用内存DC防止窗口闪烁
- 【转】使用内存DC防止窗口闪烁
- 内存DC解决窗口闪烁问题
- DC绘图闪烁
- 关于内存DC绘图防止屏幕闪烁说明
- 关于内存DC绘图防止屏幕闪烁说明
- 关于内存DC绘图防止屏幕闪烁说明
- MIniGui 内存DC绘图
- MFC绘图时窗口闪烁问题的办法
- MFC绘图闪烁问题
- 关于内存DC绘图防止屏幕闪烁说明(亦即双缓存技术) .
- MFC绘图--使用不同DC
- MFC绘图--使用不同DC
- mfc的dc绘图总结
- MFC 透明内存DC
- mfc 内存dc
- 数据字典的范例
- iOS时间类型转换和各种数据类型进行转换
- Android多线程-------同步辅助类
- 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]
- Java Web 使用getPart()、getParts()上传文件
- MFC绘图窗口闪烁解决方法or内存DC
- 基于MT7688模块的开发笔记11——编写我的第一个程序并在MT7688中运行
- StringUtils常用的方法
- 统计代码行数命令
- nginx负载均衡
- Exercise(19):排列2
- ThreadLocal 为线程绑定对象
- 指针函数、函数指针、指针数组、数组指针
- Linux常见问题