原来要这样在程序中使用资源文件!

    自从接触Visual C++ 2008CLR以来,就一直想将程序中经常用到的图片、声音等文件做成资源文件。可是因为以前编写的小程序对这方面要求不太高,就一直没有深入研究。

    现在终于要用到这方面知识了,就仔细地研究了一番,终于把这个问题给解决了。

    现在就把这个过程描述一下。

    首先在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"));

      //ResourceManagerGetObject方法将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();

 

    大功告成!

    这就是最后测试程序的运行界面。

    点击pic1pic2pic3这三个按钮分别显示上述资源中的图片;

    点击sound按钮将播放资源中添加的声音。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Fortran ,要调用嵌入主程序源文件,可以使用以下步骤: 1. 将源文件作为一个数组或变量嵌入到 Fortran 代码。可以使用 C++ 或其他语言编写一个函数来读取源文件,并将其返回给 Fortran。 例如,在 C++ 代码,可以使用以下函数将一个名为 test.datj 的文件读取到一个字符数组: ``` char* readResourceFile(const char* filename, long& size) { FILE* fp = fopen(filename, "rb"); if (fp == NULL) { return NULL; } fseek(fp, 0, SEEK_END); size = ftell(fp); fseek(fp, 0, SEEK_SET); char* buffer = new char[size]; fread(buffer, 1, size, fp); fclose(fp); return buffer; } ``` 这个函数会打开一个名为 test.datj 的文件并读取其的内容。可以将文件内容存储在内存的一个字符数组,并将数组的大小存储在变量 size 。 2. 在 Fortran 代码使用 ISO_C_BINDING 模块来调用 C++ 函数,并获取源文件的内容和大小。可以使用以下代码: ``` use iso_c_binding implicit none interface function readResourceFile(filename, size) bind(C, name='readResourceFile') import character(kind=c_char) :: filename(*) integer(kind=c_long) :: size type(c_ptr) :: readResourceFile end function readResourceFile end interface character(len=10), parameter :: filename = 'test.datj' integer(kind=c_long) :: size type(c_ptr) :: buffer_ptr character(kind=c_char), pointer :: buffer(:) buffer_ptr = readResourceFile(filename, size) if (buffer_ptr == c_null_ptr) then ! 处理文件读取失败的情况 end if ! 将指针转换成字符数组 call c_f_pointer(buffer_ptr, buffer, [size]) ! 使用 buffer 数组的内容进行操作 ``` 这个代码会调用 C++ 函数 readResourceFile() 来读取源文件,并将其返回给 Fortran。函数返回一个指向字符数组的指针,可以使用 c_f_pointer() 将其转换为 Fortran 字符数组。 需要注意的是,上述代码的 ISO_C_BINDING 模块可能不是所有 Fortran 编译器都支持的,如果编译器不支持该模块,可以考虑使用其他方法来获取源文件的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值