GDI+ 双缓冲辅助类






4.40/5 (13投票s)
2002年5月23日
2分钟阅读

148971

2162
一个模板化的助手类,用于执行 GDI+ 初始化/反初始化,并处理双缓冲/缓存
引言
(或者我为什么要写这个?)
我只是厌倦了每次想使用它时都必须做那些烦人的 GDI+ 初始化/反初始化和双缓冲操作。 真是令人头疼。 所以这个类基本上消除了所有这些工作。 你所要做的就是实现一个接受 Graphics
对象的 Draw
函数,而类会处理所有其他 GDI+ 相关的事情。
用法
好的。 要使用这个东西,你所要做的就是这样
- 从
CGdiPlusHelper
派生你的类,并且(除非你有某些奇怪的特殊需求),请保持tUseDoubleBuffering
模板参数不变。 双缓冲确实加快了绘图速度,并有助于消除闪烁。 - 不要实现
WM_PAINT
消息。 相反,实现一个具有以下原型的函数void Draw(Graphics* g, int nWidth, int nHeight);
这将是你的主要绘图函数。 你可以使用传入的
Graphics
对象来完成你所有的绘图。 CHAIN_MSG_MAP
CGdiPlusHelper
类,最好是尽可能靠近你的MSG_MAP
。 噢,如果你想强制窗口重绘,请调用SetDirty
,然后才调用Invalidate
。 否则,在双缓冲模式下,它将只重用与以前相同的缓存位图。
请注意,头文件将自动链接 GdiPlus.lib,包含 GdiPlus.h,并且
using namespace GdiPlus;
它。 也就是说,你只需包含此文件即可开始使用 GDI+。
要求
你需要安装 WTL7 和 Microsoft Platform SDK 以获取 WTL (虽然我 认为你只需要它来演示) 和 GDI+。
版本历史
- 2002年5月23日:原始文章提交
致谢
感谢 Alex Farber 和他出色的 文章,其中包含了所有我使用的 CachedBitmap
等内容。
我还在演示中松散地基于 Mazdak 的 文章中的绘图算法。
关于版权
(你早就知道它要来了...)
代码是完全、彻底、绝对免费的。 可以在私人或商业应用程序中使用它,修改它,把它放在一边,或者打印出来当作卫生纸使用。 天知道我已经无视了 CodeProject 的足够多的版权,才有胆量创造自己的版权。 :) 不过有一点 - 如果这段代码搞砸了你的电脑或让你的项目落后七个月,那不是我的错。 这都不是我的错。 甚至连那里的 "format c:" 也不是。 呃,开玩笑的。 :) 哦,是的,毋庸置疑,你不能声称这段代码是你的。 (也就是说,我不希望有人重新打印这段代码,并对它进行版权保护。 不确定这是否可行,但它会很糟糕。 糟糕透顶。)
附言:这可能是一件毫无意义的事情,但如果你要给这篇文章打差评,至少花点时间写一条评论,说明我如何改进它,或者你觉得它有哪些不足之处...