CCoolFXStatic
一个派生自 CStatic 的类,它封装了 dswigger 提供的酷炫 FX 效果。
引言
这里的代码只是一个包装类,用于 dswigger 的 非常酷的视觉 FX, 让你能够轻松地在 MFC 项目中包含这些酷炫的视觉效果。 所以主要功劳归功于 dswigger(CFireRoutine
内存泄漏由 Adam °Wimsatt 修复)。 该类还使用了 Chris Maunder 的 CDIBSectionLite
类。
背景
几天前,我偶然发现了 dswigger 编写的这个令人惊叹的视觉效果,我印象深刻。 但是当我试图将它集成到我自己的小程序的“关于”框中时,我发现它并不容易——仍然需要执行一些手动步骤才能显示效果。 这不是很方便,我觉得这段代码太酷了,不方便重用,因此决定为它编写一个 MFC 类包装器,这样只需在您的项目中更改一行代码,您就可以将您的静态图片变成酷炫的 FX 图片。
使用代码
要使用 CCoolFXStatic
类,您可以按照以下步骤操作
- 从 CoolFXStatic_src.zip 中提取所有文件,并将它们复制到您的 MFC 项目目录中,并将它们添加到您的项目中。
- 在您想使用
CCoolFXStatic
和/或CRandomFXStatic
的源文件中添加以下包含语句。 - 对于您想应用酷炫 FX 效果的资源编辑器窗口中的图片控件,使用类向导为其声明一个控件类型变量,并将类从
CStatic
更改为CCoolFXStatic
或CRandomFXStatic
。 使用哪个类取决于您想看到的动画类型:CCoolFXStatic
默认显示水波效果,但您以后可以自定义动画和参数(见下文)。 如果您只想选择一个随机的吸睛效果,则CRandomFXStatic
是最佳选择。 - 您已完成,构建您的应用程序并查看正在运行的酷炫 FX。
#include "CoolFXStatic.h"
#include "RandomFXStatic.h" // when you want to use CRandomFXStatic also.
您还可以在运行时创建 CCoolFXStatic
(尽管我真的无法想到您需要执行运行时创建的条件 :); 演示代码中的以下代码片段展示了如何操作
m_stcCodeprojectRuntime.Create(_T(""), WS_CHILD | WS_VISIBLE, ctrlRect, this);
m_bmpCodeprojectRuntime.LoadBitmap(IDB_CODEPROJECT_HIGH_COLOR);
m_stcCodeprojectRuntime.SetBitmap(m_bmpCodeprojectRuntime);
您所要做的就是使用 Create()
函数创建控件,然后使用 SetBitmap()
函数设置位图。 SetBitmap()
函数在 CCoolFXStatic
中被重载,并将执行 FX 初始化。
您可以通过更改以下成员变量来自定义 CCoolFXStatic
中的水波动画
int mouseMoveBlobRadius;
int mouseMoveBlobHeight;
int mouseClickBlobRadius;
int mouseClickBlobHeight;
// The folloing parameter controls the number of "raindrops" (just some
// randomly generated blobs) of the water FX, the smaller it is
// ("1" is the smallest possible value), the more "raindrops" are likely
// to be generated.
int intervalsPerRaindrop;
SetFireAlpha()
和 SetPlasmaAlpha()
用于相应地更改火焰和等离子 FX 透明度。
CRandomFXStatic
是 CCoolFXStatic
的一个派生类,只是为了帮助您决定要展示哪个动画 :)
关注点
可能值得稍微提及一下,资源编辑器中创建的图片控件的 FX 初始化是在哪里完成的。 当我开始编码时,我使用类向导为资源编辑器中的图片控件生成了一个控件变量,并将类从 CStatic
更改为 CCoolFXStatic
,并尝试找到一个地方(Windows 消息,覆盖 CStatic
的虚拟方法),MFC 框架会在它加载了图片控件的位图之后调用我。 但几次尝试都失败了——我找不到执行 FX 初始化的合适位置。 然后,我做了更多的反复试验,发现了一个 MFC 框架将调用 CWnd
的 PreSubclassWindow()
虚拟方法的地方。 进一步的跟踪揭示了为什么这个地方适用于类向导生成的对话框控件变量:对于使用类向导生成的每个控件变量,都会添加一个 DDX_Control()
函数调用,并且该函数将调用控件变量的 SubclassWindow()
方法,而该方法又会调用 PreSubclassWindow()
方法。
历史
- 2009-07-14:初始帖子。