T-Rex 动画






4.71/5 (16投票s)
独立的 EXE 动画。
引言
这是一个独立的 EXE 组合动画,使用程序化代码和低级 SDK 编程 FLAT API 编写,以消除任何外部依赖。
背景
虽然我可以使用扩展的分层样式,但我选择使用 Windows Vista 中引入的桌面合成功能。
启用桌面合成后,各个窗口不再像以前版本的 Windows 中那样直接绘制到屏幕或主显示设备上。
相反,它们的绘制被重定向到视频内存中的离屏表面,然后将这些表面渲染成桌面图像并在显示器上呈现。
在 Windows 8 中,桌面窗口管理器 (DWM) 始终处于开启状态,并且不能被最终用户和应用程序禁用。 就像在 Windows 7 中一样,DWM 用于合成桌面。
在 Windows Vista 和 Windows 7 中,桌面合成仅在启用 AERO Glass 主题时才启用。
GDIPLUS 平面 API 用于循环模式显示 PNG 图像的每一帧,并且霸王龙的咆哮使用标准 WAV 音频重新混音,以完全匹配动画持续时间。
所有内容都嵌入为资源,以生成单个最终 EXE 文件。
使用代码
用 C++ 编写的源代码不言自明,并设计为在 64 位模式下工作 (VS2010+)。
Load_TREX 是负责加载嵌入式资源的主要函数
LONG_PTR Load_TREX () {
LONG_PTR nRet = 0;
HRSRC hResource = FindResource(gP.instance, MAKEINTRESOURCE(TREX), RT_RCDATA);
if (hResource) {
long imageSize = SizeofResource(gP.instance, hResource);
if (imageSize) {
LPVOID pResourceData = LockResource(LoadResource(gP.instance, hResource));
if (pResourceData) {
HGLOBAL MemBuffer = GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD, imageSize);
if (MemBuffer) {
LPVOID pBuffer = GlobalLock(MemBuffer);
if (pBuffer) {
CopyMemory(pBuffer, pResourceData, imageSize);
LPSTREAM pStream = NULL;
if (CreateStreamOnHGlobal(MemBuffer, FALSE, &pStream) == 0) {
LONG_PTR hImage = 0;
if (GdipCreateBitmapFromStream(pStream, hImage) == 0) {
nRet = hImage;
}
//IUnknown_Release(pStream);
ReleaseObject((PFUNKNOWN*) pStream);
}
}
GlobalUnlock(MemBuffer);
}
GlobalFree(MemBuffer);
}
}
}
return nRet;
}
关注点
动画本身是从子线程执行的,而不是使用计时器(但计时器代码也已提供)。 使用线程的主要优点是在处理多核时,以及需要在主进程运行时使用动画时。
这里有一个基于相同 DWM 合成概念的更复杂的演示
https://codeproject.org.cn/Articles/705243/HUD-window-bit-DWM-composition
如何使用动画
使用 拖放 将霸王龙移动到桌面的任何位置。
要关闭动画,请按 Escape 键或 ALT-F4 键组合。
对于那些无法编译代码的人,这里是下载 EXE 的链接
这里是另一个动画(用 PowerBASIC 编写),但它基于相同的概念
下载 Cheetah.zip
如果你喜欢它们,我还有一些其他的 :)