自从接触Visual C++ 2008的CLR以来,就一直想将程序中经常用到的图片、声音等文件做成资源文件。可是因为以前编写的小程序对这方面要求不太高,就一直没有深入研究。
现在终于要用到这方面知识了,就仔细地研究了一番,终于把这个问题给解决了。
现在就把这个过程描述一下。
首先在Visual Studio 2008下新建一个C++ -> CLR -> Windows窗体应用程序。就暂时把名称定为“test”吧。
这是IDE将自动根据模板生成一个项目,项目中包含的文件如图所示。
在test工程下面有三个文件夹。为例添加和应用资源文件,我首先关注的就是第三个文件夹“资源文件”。
以前只是改过程序的图标,也就是把app.ico文件替换掉。这很简单。
按照以前的思维,我把所需要的图片、声音等资源文件一股脑都添加到“资源文件”这个文件夹里。
可现在问题出现了:我怎么才能把那些文件用在程序里呢?
在MSDN中查到了一个叫System::Resources::ResourceManager 的类,通过这个类可以将一个resources文件里的资源文件应用到程序中去。(下面将介绍这个类如何使用)
然而资源文件夹对应的是哪个resources文件缺不知道。
在…test/test/Debug文件夹下有一个叫做test.Form1.resources的文件,于是就只能用这个资源文件了。
可是无论采用什么样的方法调用test.Form1.resources里的资源文件都没有成功,返回值总是null。
看来资源文件还是没有添加到test.Form1.resources里啊。
继续探索……
资源文件里有个叫app.rc的文件,这时新建工程时自动生成的文件,将这个文件打开后,就显示出了资源视图。下图显示的是IDE自动创建的app.rc文件。在这里还可以向app.rc中添加文件,并可以在解决方案资源管理器的app.rc文件上点右键,选择查看代码,对代码进行编辑。然而资源视图和代码不能同时打开。我们可以通过这两种方法对添加进来的资源文件进行编辑。
这个app.rc文件虽然会编辑了,可是这里面的资源依然用不到程序里面。痛苦啊!
还是继续探索……
一不小心发现解决方案资源管理器下面的Form1.h下有一个名字为Form1.resX的文件。从文件名看,似乎这个文件也与资源有关。于是双击打开了这个文件。
让我喜出望外的是这里也发现了“添加资源”的按钮。心动不如行动,马上又在这里添加了所需要的文件。
下面是添加图像文件后的样子。文件下面的名字可以通过属性窗口来修改。
添加完所需文件后,在解决方案资源管理器中右键点击Form1.resX文件,选择编译。这样会发现…test/test/Debug文件夹下的test.Form1.resources被改变了。看来有戏啊!
于是又编写代码看一看是否真的成功了。
实践证明:成功了!
编程要点:
在Form1.h中添加
using namespace System::Resources;
在按钮onclick事件中添加代码
System::Resources::ResourceManager^ rm = gcnew ResourceManager("test.Form1",System::Reflection::Assembly::GetExecutingAssembly());
//声明指向ResourceManager类的指针rm,并将其初始化为资源文件为“test.Form1.resources”。
pictureBox1->Image = (Image^)(rm->GetObject("tiger1"));
//用ResourceManager的GetObject方法将test.Form1.resources中的tiger1文件作为Object类型读出,利用(Image^)将Object类型转换为Image类型,并在PictureBox1中显示出来。
其实也挺简单的,一不小心就成功了。
在此基础上还将wav文件添加到Form1.resX中,并用soundPlayer类将声音播放出来。
编程要点:
在Form1.h中添加
using namespace System::Media;
在按钮onclick事件中添加代码
System::Resources::ResourceManager^ rm = gcnew ResourceManager("test.Form1",System::Reflection::Assembly::GetExecutingAssembly());
//声明指向ResourceManager类的指针rm,并将其初始化为资源文件为“test.Form1.resources”。
SoundPlayer music;
music.Stream::set(rm->GetStream("仙剑3"));
//将仙剑3资源以文件流读出,并赋值到music的流。
music.Play();
大功告成!
这就是最后测试程序的运行界面。
点击pic1,pic2,pic3这三个按钮分别显示上述资源中的图片;
点击sound按钮将播放资源中添加的声音。