我正在编写一个 C++(特别是 MFC)类,它使用外部 .gif 图像文件,并在经过一些处理后生成另一个图像文件。如果初始图像能够以某种方式嵌入到代码中,那就太好了。我在 MSDN 中读到过有关使用多个 .rc 文件的内容,整个事情看起来相当复杂。
我想请教曾经经历过此问题的人如何处理这个问题。
编辑:抱歉我不清楚。我正在编写的类应该是独立的,所以我可以再次使用它。如果我将图像放入资源文件中,那么如果在新项目中使用该类,则该类将无法编译。
最佳答案
您不能将 MFC 资源嵌入到类或类似的 C++ 容器中。它们只能嵌入到 DLL 或 EXE 文件中 - 在生成的二进制文件的单独部分中。由于您希望您的类可重用,因此必须将其放入 DLL 中。因此,您必须使用 AFX_EXT_CLASS 标记您的类(class)。关键字。
有两种解决方案。
解决方案#1:
- 创建 MFC DLL 项目(
MFC 扩展 DLL
)。将其命名为MyLibrary
或其他名称。 - 将所有独立类放入此 DLL 中。
- 嵌入所有必要的资源。
- 让您的类从 DLL 的
HINSTANCE
加载资源,如下所述。
有多种方法可以检索 DLL 的 HINSTANCE
。如果你问我,最好的解决方案是在 DllMain
中获取它。如果您选择 MFC Extension DLL
配置,此操作会自动完成:
static AFX_EXTENSION_MODULE MyLibDLL = { NULL, NULL }; // Make this variable global!
// Then access the hInstance as follows:
LoadResource(MyLibDLL.hModule, ...)
解决方案#2:
将资源存储为字节缓冲区。或者更好,将其转换为 Base64并将其存储为 ASCII 字符串。但记住不要炸毁堆栈!保持资源较小或增加项目设置中的堆栈大小。示例:
const char *encodedResource = "SGVsbG8gd29ybGQh";
char *data = decode(encodedResource);
foo(data);
关于class - 将资源嵌入可重用 MFC 类的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11751209/