当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 托管资源全攻略

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 托管资源全攻略


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 56 ::
收藏到网摘: n/a

托管资源全攻略

作者:caeser2

下载源代码

本文内容适用于所有使用.net v1.1及以上框架的语言。

前传1:提出问题(急于了解正式内容的读者请转到下面的正传部分^_^)

  前段时间写了一篇题为“VC.NET轻松实现按钮控件自绘”的文章,其中按钮按下时的效果是由一张图片呈现的。这时问题就来了,最初我将该图片加入资源列表(.rc)中,然后使用下面的2个读取资源的方法;编译通过,可执行时程序抛出异常,提示找不到资源文件。

	//方法1,从指定的hinstance中名为bitmapName的资源创建Bitmap对象	public: static Bitmap* System::Drawing::Bitmap::FromResource(IntPtr hinstance,String* bitmapName);	//方法2,使用构造函数从指定的type类中提取的resource资源初始化Bitmap对象	public: System::Drawing::Bitmap::Bitmap(Type* type,String* resource);	
前传2:分析问题

  接着我就犯难了,在论坛上提出该问题,没有得到建设性的回答,为了赶时间只好匆匆将图片和程序放在一起发布了。事后回想一下心里挺不是滋味,将分离的资源文件和程序文件一起发布,搞的目录里乱七八糟很不好看,为什么加入资源的图片不能用呢?会不会是资源没有打包进.exe文件呢?于是我用2进制查看工具打开资源图片和.exe文件,做了下对比,结果发现资源图片已打包进.exe文件:

  资源虽已打包进.exe文件,可是除了上面提到的那两个方法,似乎再没有其它读取内部资源的函数了,那怎么办呢?

前传3:看到解决问题的曙光

  打开MSDN,查找有关"资源"的索引,看了半天,最后终于弄明白了,原来.net框架对通过资源编辑器(.rc)打包进程序的资源不再提供支持,而改用一种名为"托管资源"的资源。那么这种资源与普通的非托管资源有何异同?既然不能使用Visual Stdio 200x提供的资源编辑器(.rc)打包资源,这种资源又该怎么打包进程序?打包成功后又应该怎样去使用呢?

正传1:什么是托管资源

  资源可以理解为是在逻辑上由应用程序部署的任何非可执行数据,托管资源其本质也大抵如此。那么mfc使用的rc资源和.net使用的托管资源有什么区别呢?请看下表:
 

资源类型 Windows支持度(注1)

索引方式

可否打包"对象" 独立于.exe打包的难易度 资源的部署 其它
.rc资源

95/98/me/nt/2000及以上

依靠资源ID找到资源

不可以

使用纯资源DLL,比较麻烦

由程序员决定,管理混乱

还没想好:)

.net托管资源

目前还没有支持的

取消资源ID,改为依靠资源名,也可以依靠资源的值(内容)

可序列化的就可以

使用专用的资源文件,很简单

由程序集统一管理(注2)

 
  • 注1:比如说,对一个文件夹右键选"属性"->"自定义"->"更改图标",在"浏览"中选择.exe文件,如果被系统支持则会读出.exe中打包的所有图标,反之只能读出1个;
  • 注2:有关程序集的讨论超出了本文的范围,感兴趣的读者可以参考MSDN;

  从上表可以看出,虽然托管资源的本质概念和以往的"资源"没有区别,但是使用方式却被彻底颠覆了。托管资源将一个资源视为一个对象,对资源的查找引用不再使用资源ID,改为资源名,就像使用一个对象一样;反过来给可序列化的任意对象起个好记的名字就可以当作资源保存起来。.net托管资源的打包方式有两种,分别是打包进程序的资源和独立的资源文件。独立资源文件的组织方式也有两种形式,一种