Visual Studio 2012 - 如何添加动画 GIF 作为资源以用于 Direct2d

Visual Studio 2012 - How to add animated GIF as Resource for usage with Direct2d

我写了一个 class 可以用 Direct2D 显示动画 GIF 文件。

现在我正在访问所需的 GIF 以通过它的文件路径显示:

WCHAR szFileName[MAX_PATH] = "C:\Users\xxx\Desktop\xxx.gif";

m_pIWICFactory->CreateDecoderFromFilename(  //My IWICImagingFactory
        szFileName,                         
        nullptr,           
        GENERIC_READ, 
        WICDecodeMetadataCacheOnLoad,
        &m_pDecoder);                       //My IWICBitmapDecoder

我需要更改这部分,以便从我的项目的资源中加载所需的 GIF。

我 did/tried 到目前为止:

1)
- 我右键单击我的项目,单击添加 "Resource"
- 在弹出窗口中,我选择了 "Import" 并且我将资源类型定义为 "GIF"

Which resulted in a non-buildable project cause of Error RC2135 in C++ project due to UTF-8 encoding of RC file
Additionally it "destroyed" my GIF file. Opening the GIF in Notepad showed that it got converted from GIF89a to BM6(.bmp) during this process

2)
- 我右键单击我的项目,单击添加 "Exsisting Item" 并选择我的 GIF
- 然后我尝试将 give 添加到 .rc 文件中,例如 IDR_MYGIF GIF ".\resources\xxx.gif"

Which results in "error RC2135: file not found: .\resources\xxx.gif "

所以基本上我需要知道如何将 GIF 正确添加到资源以及如何在 IWICBitmapDecoder

的代码中访问它

感谢您的帮助

我终于让它工作了...这是你必须做的:

1) 将您的资源添加到项目

Right Click on the Project - Add - Existing Item - Select your file

2) 编辑您的 resource.h 文件

Define a identifier for your resource, e.g.: #define IDR_GIF 107

3) 编辑您的 .rc 文件

IDR_GIF RCDATA "C:\Users\xxx\Desktop\xxx.gif"

4) 定义流指针

I created a private member in my class, e.g.: LPSTREAM pStream;

5) 包括 Shlwapi.dll

Add #include <Shlwapi.h>

6) link Shlwapi.lib

Project - "Your Project" Properties - Configuration Properties - Linker - Input - Additional Dependencies - Edit - Add Shlwapi.lib

7) 使用资源

HRSRC myResource = ::FindResource(NULL, MAKEINTRESOURCE(IDR_GIF), RT_RCDATA);
HGLOBAL myResourceData = ::LoadResource(NULL, myResource);
unsigned int myResourceSize = ::SizeofResource(NULL, myResource);

pStream = SHCreateMemStream((LPBYTE)LockResource(myResourceData), myResourceSize);

m_pIWICFactory->CreateDecoderFromStream(
        pStream,
        nullptr,
        WICDecodeMetadataCacheOnLoad,
        &m_pDecoder);