在可重用的MFC类中嵌入资源的正确方法是什么?

时间:2012-08-01 01:03:28

标签: class mfc resource-files

我正在编写一个C ++(特别是MFC)类,它使用外部.gif图像文件,并在经过一些处理后生成另一个图像文件。如果初始图像可以以某种方式嵌入代码中,那将是很好的。我在MSDN中读过有关使用多个.rc文件的内容,整个过程看起来很复杂。

我想知道在如何处理这个问题之前经历过这个问题的人。

编辑:抱歉,我不清楚。我写的课应该是独立的,所以我可以再次使用它。如果我将图像放在资源文件中,那么如果在新项目中使用该类,则不会编译。

6 个答案:

答案 0 :(得分:1)

在解决方案资源管理器中,转到资源视图,右键单击并单击Add Resource,然后单击Import并添加gif文件。现在,您可以使用Resource ID访问代码中的gif文件。

答案 1 :(得分:1)

您不能在类或类似的C ++容器中嵌入MFC资源。它们只能嵌入到DLL或EXE文件中 - 在生成的二进制文件的单独部分中。由于您希望您的类可以重用,因此必须将其放在DLL中。因此,您必须使用AFX_EXT_CLASS关键字标记您的课程。

有两种解决方案。

解决方案#1:

  • 创建MFC DLL项目(MFC Extension 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);

答案 2 :(得分:0)

仅将文件添加到资源不会将文件嵌入到它只链接到文件的实际资源文件中。如果您打开.rc文件,您会看到它的内容如下:

IDB_GIF_MYIMAGE     GIF     "artwork\\mygif.gif"

在编译期间,资源将包含在EXE中,您可以使用资源ID IDB_GIF_MYIMAGE来引用该资源。您可以在其他项目中引用相同的文件,而无需复制文件。

答案 3 :(得分:0)

要在不使用资源文件的情况下将图像(或任何其他类型的二进制数据)嵌入到类中,请使用bin2c实用程序,例如,您可以从此处下载它:http://www.opensource.apple.com/source/libpcap/libpcap-16/libpcap/msdos/bin2c.c。在文件上运行它将生成基本上是静态数组,其中文件的字节作为该数组的成员。将此数组填充到.h文件中(或将其放入类的标题中,或使其成为静态成员...)然后您将在内存中使用该文件,而无需使用LoadResource()及其兄弟

如果你想在CImage :: Load()中使用它,你必须编写自己的派生自IStream的类,并以某种方式实现一些方法,以便它们从内存中“读取”。我不知道让CImage从gif文件的内存表示中解码图像的任何方法。

答案 4 :(得分:0)

我认为最好的解决方案就是记录要使用该类,您还必须将某个.gif文件导入项目,并为其提供一定的预期标识符(例如IDB_MYCLASS_MYGIF)。然后,您可以使用预处理器来检测资源是否已正确添加,例如:

#ifndef IDB_MYCLASS_MYGIF
    #error Make sure you import mygif.gif to the project.  See docs for more info.
#endif

这将阻止类编译,直到用户正确导入图像。或者,如果没有提供默认图像,您可以使用#ifdefs回退到不使用默认图像的代码。

答案 5 :(得分:0)

查看http://www.codeproject.com/Articles/5371/ToDoList-6-5-4-Feature-Release-An-effective-and-fl中提供的CRuntimeDialog类。它提供了一种从构成资源定义的字符串创建对话框的方法。