65.9K
CodeProject 正在变化。 阅读更多。
Home

GDI+ 双缓冲辅助类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.40/5 (13投票s)

2002年5月23日

2分钟阅读

viewsIcon

148971

downloadIcon

2162

一个模板化的助手类,用于执行 GDI+ 初始化/反初始化,并处理双缓冲/缓存

引言

(或者我为什么要写这个?)

我只是厌倦了每次想使用它时都必须做那些烦人的 GDI+ 初始化/反初始化和双缓冲操作。 真是令人头疼。 所以这个类基本上消除了所有这些工作。 你所要做的就是实现一个接受 Graphics 对象的 Draw 函数,而类会处理所有其他 GDI+ 相关的事情。

用法

好的。 要使用这个东西,你所要做的就是这样

  1. CGdiPlusHelper 派生你的类,并且(除非你有某些奇怪的特殊需求),请保持 tUseDoubleBuffering 模板参数不变。 双缓冲确实加快了绘图速度,并有助于消除闪烁。
  2. 不要实现 WM_PAINT 消息。 相反,实现一个具有以下原型的函数
    void Draw(Graphics* g, int nWidth, int nHeight);

    这将是你的主要绘图函数。 你可以使用传入的 Graphics 对象来完成你所有的绘图。

  3. CHAIN_MSG_MAP CGdiPlusHelper 类,最好是尽可能靠近你的 MSG_MAP。 噢,如果你想强制窗口重绘,请调用 SetDirty,然后才调用 Invalidate。 否则,在双缓冲模式下,它将只重用与以前相同的缓存位图。

请注意,头文件将自动链接 GdiPlus.lib,包含 GdiPlus.h,并且

using namespace GdiPlus;

它。 也就是说,你只需包含此文件即可开始使用 GDI+。

要求

你需要安装 WTL7Microsoft Platform SDK 以获取 WTL (虽然我 认为你只需要它来演示) 和 GDI+。

版本历史

  • 2002年5月23日:原始文章提交

致谢

感谢 Alex Farber 和他出色的 文章,其中包含了所有我使用的 CachedBitmap 等内容。

我还在演示中松散地基于 Mazdak 的 文章中的绘图算法。

关于版权

(你早就知道它要来了...)

代码是完全、彻底、绝对免费的。 可以在私人或商业应用程序中使用它,修改它,把它放在一边,或者打印出来当作卫生纸使用。 天知道我已经无视了 CodeProject 的足够多的版权,才有胆量创造自己的版权。 :) 不过有一点 - 如果这段代码搞砸了你的电脑或让你的项目落后七个月,那不是我的错。 这都不是我的错。 甚至连那里的 "format c:" 也不是。 呃,开玩笑的。 :) 哦,是的,毋庸置疑,你不能声称这段代码是你的。 (也就是说,我不希望有人重新打印这段代码,并对它进行版权保护。 不确定这是否可行,但它会很糟糕。 糟糕透顶。)

附言:这可能是一件毫无意义的事情,但如果你要给这篇文章打差评,至少花点时间写一条评论,说明我如何改进它,或者你觉得它有哪些不足之处...

© . All rights reserved.