创建资源文件
资源文件顾名思义就是存放资源的文件。资源文件在程序设计中有着自身独特的优势,他独立于源程序,这样资源文件就可以被多个程序使用。同时在程序设计的时候,有时出于安全或者其他方面因素的考虑,把重要东西存放在资源文件中,也可以达到保密、安全的效果。那么visual c#所使用的资源文件中到底存放哪些东西呢?在用visual c#创建资源文件大致可以存放三种类型的数据资源,分别是字节数组、各种对象和字符串。本文将结合一个程序例子来具体说明用visual c#是如何创建资源文件的。
一.用visual c#在创建资源文件用到的一些概念和理论:
在.net framework sdk中的一个名字叫system.resources名称空间,在此名称空间中为应用程序提供了许多创建、存储和使用资源文件的类和接口。其中有一个类叫resourcewriter,visual c#就是通过调用这个类来实现创建、存储资源文件的。
二.visual c#如何创建资源文件:
首先要继承一个resourcewriter类,然后调用resourcewriter类的一个方法generate ( ),就可以产生一个资源文件了。具体语句如下:
resourcewriter rw = new resourcewriter ( "my.resources" ) ;
rw.generate ( ) ;
此时在磁盘的中就会产生一个名称为"my.resources"的资源文件,但此时的资源文件没有任何内容,下面我们就来看看如何往资源文件中添加资源。
三.在资源文件中添加资源:
在resourcewriter类中提供了一个addresource ( )方法,这个方法的作用就是往资源文件中添加资源的。在visual c#中对不同的资源有着不同的加入方式。
(1).加入字节数组,语法格式为:
public void addresource ( string , byte [ ] ) ;
注释:其中string是在使用资源文件的时候,此字节数组在程序中的的唯一标识符
(2).加入对象,语法格式为:
public void addresource ( string , object );
注释:其中string是在使用资源文件的时候,此对象在程序中的唯一标识符
在本文程序中,我们利用这种调用方式来加入图标和图象,具体如下:
icon ico = new icon ( "demo.ico" ) ;
image canceloff = image.fromfile ("cancel-off.png") ;
image cancelon = image.fromfile ( "cancel-on.png" ) ;
image cancelover = image.fromfile ( "cancel-over.png" ) ;
image okdown = image.fromfile ( "ok-down.png" ) ;
image okoff = image.fromfile ( "ok-off.png" ) ;
image okon = image.fromfile ( "ok-on.png" ) ;
rw.addresource ( "demo.ico" , ico ) ;//在资源文件中加入图标
//以下是在资源文件中加入图象
rw.addresource ( "cancel-off.png" , canceloff ) ;
rw.addresource ( "cancel-on.png" , cancelon ) ;
rw.addresource ( "cancel-over.png" , cancelover ) ;
rw.addresource ( "ok-down.png" , okdown ) ;
rw.addresource ( "ok-off.png" , okoff ) ;
rw.addresource ( "ok-on.png" , okon ) ;
(3).加入字符串,具体语法如下:
public void addresource ( string1 , string2) ;
注释:其中string1是在使用资源文件的时候,此字符串在程序中的唯一标识符在本文的程序中,是如此使用的:
rw.addresource ( "mystr" , "从资源文件中读取字符串!" );
至此我们已经创建了一个资源文件,并且在资源文件中加入了若干个资源,当然在这之后,还应该注意,保存此资源文件,并关闭资源文件,具体如下:
rw.close ( ) ;
四.创建资源文件的源程序代码:
通过上面的论述,我们不难理解下面这些代码。下列程序代码的作用就是,创建一个名称为"my.resources"资源文件,并且在此资源文件中加入一个图标资源,若干个图象资源,和一个字符串资源。具体代码如下:
creatresources.cs:
using system ;
using system.drawing ;
using system.resources ;
class creatresource
{
public static void main ( )
{
resourcewriter rw = new resourcewriter ( "my.resources" ) ;
icon ico = new icon ( "demo.ico" ) ;
image canceloff = image.fromfile ("cancel-off.png") ;
image cancelon = image.fromfile ( "cancel-on.png" ) ;
image cancelover = image.fromfile ( "cancel-over.png" ) ;
image okdown = image.fromfile ( "ok-down.png" ) ;
image okoff = image.fromfile ( "ok-off.png" ) ;
image okon = image.fromfile ( "ok-on.png" ) ;
rw.addresource ( "demo.ico" , ico ) ;
rw.addresource ( "cancel-off.png" , canceloff ) ;
rw.addresource ( "cancel-on.png" , cancelon ) ;
rw.addresource ( "cancel-over.png" , cancelover ) ;
rw.addresource ( "ok-down.png" , okdown ) ;
rw.addresource ( "ok-off.png" , okoff ) ;
rw.addresource ( "ok-on.png" , okon ) ;
rw.addresource ( "mystr" , "从资源文件中读取字符串!" ) ;
rw.generate ( ) ;
rw.close ( ) ;
}
}
最好还要提醒一下,在成功编译成执行文件后,在执行此文件的时候,必须保证在此执行文件的相同目录,存在上面代码中提到名称的图标和图象,否则在创建资源文件的时候是会出错的。
五.总结:
可见用visual c#创建资源文件并不是一个复杂的过程,在下一篇文章中,我们将介绍如何在visual c#使用资源文件中资源。这才是visual c#资源文件编程的重点和难点。当然文中所使用的资源文件就是以本文中创建的资源文件。
使用资源文件
在《visual c#资源文件编程--创建资源文件》中已经介绍了如何用visual c#创建资源文件。本文将接着上篇文章的话题来探讨资源文件另外一个问题,在visual c#如何使用资源文件。在上一篇文章中,我们已经成功的创建了一个名称为"my.resources"的资源文件。这个资源文件中包含有一个图标资源,在文件中的名称为"demo.ico",若干个图片资源和一个字符串资源,在文件中的名称为"mystr"。我们将以上一篇文章创建的此资源文件为对象,结合一个具体的程序例子来看一下用visual c#如何使用资源文件。
一.本文程序设计和运行的软件环境:
(1).微软公司视窗2000服务器版
(2)..net framework sdk beta 2
二.程序设计中的一些概念和理论:
程序设计时涉及到的概念和理论主要是二种变量的相互转换。这就是二种变量就是所谓的实值类型变量(value type variable)和参考类型变量(reference type variable)。而二者之间的相互转换,在visual c#中被称为装箱(boxing)和出箱(unboxing)。所谓装箱就是把实值类型变量转换成参考类型变量的过程,反之就是出箱。那么什么类型的变量是参考类型的变量,什么类型的变量又是实值类型变量呢?这二者之间有什么区别么?在visual c#中的参考类型就是泛指这些类型,如:object、class、interface、delegate、string、array等。这些类型定义的变量就是参考类型变量。而实值类型就是平常的平常使用的整型、布尔型、枚举型等,由这些类型定义的变量就是实值类型变量。他们之间的最大区别是参考类型变量是指向实体对象的指针,而实值类型变量就是实在的实体对象。由于装箱和出箱是一个概念性很强的操作过程,详细介绍需要很大的篇幅。而这超出了本文探讨的主要范畴。所以本文只介绍和程序相关的操作即出箱。具体的操作步骤,将在下一届结合程序来介绍。
三.程序设计的思路已经重要步骤的解决方法:
(1).如何在程序编译的时候中嵌入资源。资源文件和程序是二个独立的文件,要把资源文件嵌入到最后生成的程序中,需要在编译的时候加上"/resource"命令,这个命令可以简写为"/res"。在本文中程序的名称为"use.cs",资源文件的名称为"my.resources",则把资源嵌入程序的编译命令如下:
csc.exe /res:my.resources use.cs
(2).如何在程序管理资源文件中的资源:
在.net framework sdk这提供了一个关于资源文件创建和使用的名称空间--system.resources。在这个名称空间中有一个class为resourcemanager,这个class的主要作用就是管理并使用资源文件。visual c#是通过这个类来管理并使用嵌入程序中的资源文件中的资源。下列代码就是定义一个resourcemanager类来管理嵌入程序资源文件中的资源:
resourcemanager rm = new resourcemanager ( "images" , assembly.getexecutingassembly ( ) ) ;
(3).如何在程序中使用资源文件中的资源:
在上一篇文章中,我们已经了解到在创建资源文件的时候,使用了addresource ( )方法来加入资源,他的语法中的第一个参数是用户可以定义的字符串,这个字符串就是资源在资源文件的唯一标识,在程序设计中,就是通过这个唯一标识符来使用某个资源的。那么如何在程序中通过这个标识符来得到所需资源?这就要使用到resourcemanager类中的getobject()和getstring()方法。这二个方法作用是获得指定的资源。下面是这二个方法的语法:
object getsting(string)
object getobject(string)
其中的"string"就是资源在资源文件中的那个唯一标识符。细心的读者可能已经注意到,这二个方法的返回值都是一个object类型的变量,也就是一个参考类型的变量,而在程序中的字符串或者图象等,是一个实值类型变量。这就需要进行转换,而这种转换就是上面所说的装箱和出箱。下列代码是从资源文件中提取字符串、图象和图标资源:
提取字符串资源:
string s = ( ( string ) rm.getstring ( "mystr" ) ) ;
提取图标资源:
icon icodemo = ( ( icon ) rm.getobject ( "demo.ico" ) ) ;
提取图象资源:
image a = ( ( image ) ( rm.getobject ( "ok-off.png" ) ) ) ;
四.结合一个程序例子来看一下,资源文件的具体使用方法:
下面的程序例子所使用的资源文件是上一篇文章中创建的资源文件"my.resources",程序中定义了三个lable组件,其中的二个的作用是显示资源文件中图象资源,另外一个的作用是显示资源文件中字符串资源,程序的图标是取自资源文件中的图标资源。下面是程序的源代码:
using system ;
using system.drawing ;
using system.collections ;
using system.componentmodel ;
using system.windows.forms ;
using system.data ;
using system.resources ;
using system.reflection ;
public class form1 : form
{
private label lblok ;
private label lblcancel ;
private system.componentmodel.container components = null ;
private label lblresource ;
public form1 ( )
{
//初始化窗体中的组件
initializecomponent ( ) ;
}
//清除程序中使用过的资源
protected override void dispose ( bool disposing )
{
if ( disposing )
{
if ( components != null )
{
components.dispose ( ) ;
}
}
base.dispose ( disposing ) ;
}
private void initializecomponent ( )
{
resourcemanager rm = new resourcemanager ( "images" , assembly.getexecutingassembly ( ) ) ;
this.lblok = new label ( ) ;
this.lblcancel = new label ( ) ;
this.lblresource = new label ( ) ;
this.suspendlayout ( ) ;
this.lblok.backcolor = system.drawing.color.white ;
//使用资源文件中的图象资源
this.lblok.image = ( ( image ) ( rm.getobject ( "ok-off.png" ) ) ) ;
this.lblok.location = new system.drawing.point ( 24 , 40 ) ;
this.lblok.name = "lblok" ;
this.lblok.size = new system.drawing.size ( 75 , 23 ) ;
this.lblok.tabindex = 0 ;
this.lblok.click += new system.eventhandler ( this.lblok_click ) ;
this.lblok.mouseenter += new system.eventhandler ( this.lblok_mouseenter ) ;
this.lblok.mouseleave += new system.eventhandler ( this.lblok_mouseleave ) ;
//出箱
//使用资源文件中的图象资源
this.lblcancel.image = ( ( image ) ( rm.getobject ( "cancel-off.png" ) ) ) ;
this.lblcancel.location = new system.drawing.point ( 152 , 40 ) ;
this.lblcancel.name = "lblcancel" ;
this.lblcancel.size = new system.drawing.size ( 75 , 23 ) ;
this.lblcancel.tabindex = 1 ;
this.lblcancel.click += new system.eventhandler ( this.lblcancel_click ) ;
this.lblcancel.mouseenter += new system.eventhandler ( this.lblcancel_mouseenter ) ;
this.lblcancel.mouseleave += new system.eventhandler ( this.lblcancel_mouseleave ) ;
this.lblresource.location = new system.drawing.point ( 88 , 8 ) ;
this.lblresource.name = "lblresource" ;
this.lblresource.tabindex = 2 ;
//出箱
//使用资源文件中的字符串资源
this.lblresource.text = ( ( string ) rm.getstring ( "mystr" ) ) ;
this.autoscalebasesize = new system.drawing.size ( 5 , 13 ) ;
this.clientsize = new system.drawing.size ( 240 , 101 ) ;
this.controls.add ( lblresource ) ;
this.controls.add ( lblcancel ) ;
this.controls.add ( lblok ) ;
//出箱
//使用资源文件中的图标资源
icon icodemo = ( ( icon ) rm.getobject ( "demo.ico" ) ) ;
this.icon = icodemo ;
this.name = "form1" ;
this.text = "visual c#中使用资源文件!" ;
this.resumelayout ( false ) ;
}
static void main ( )
{
application.run ( new form1 ( ) ) ;
}
private void lblok_mouseenter ( object sender , system.eventargs e )
{
resourcemanager rm = new resourcemanager ( "images" , assembly.getexecutingassembly ( ) ) ;
this.lblok.image = ( ( image ) ( rm.getobject ( "ok-on.png" ) ) ) ;
}
private void lblok_mouseleave ( object sender , system.eventargs e )
{
resourcemanager rm = new resourcemanager ( "images" , assembly.getexecutingassembly ( ) ) ;
this.lblok.image = ( ( image ) ( rm.getobject ( "ok-off.png" ) ) ) ;
}
private void lblok_click ( object sender, system.eventargs e )
{
resourcemanager rm = new resourcemanager ( "images" , assembly.getexecutingassembly ( ) ) ;
this.lblok.image = ( ( image ) ( rm.getobject ( "ok-down.png" ) ) ) ;
}
private void lblcancel_mouseenter ( object sender , system.eventargs e )
{
resourcemanager rm = new resourcemanager ( "images" , assembly.getexecutingassembly ( ) ) ;
this.lblcancel.image = ( ( image ) ( rm.getobject ( "cancel-onr.png" ) ) ) ;
}
private void lblcancel_mouseleave ( object sender , system.eventargs e )
{
resourcemanager rm = new resourcemanager ( "images" , assembly.getexecutingassembly ( ) ) ;
this.lblcancel.image = ( ( image ) ( rm.getobject ( "cancel-off.png" ) ) ) ;
}
private void lblcancel_click(object sender, system.eventargs e)
{
resourcemanager rm = new resourcemanager ( "images" , assembly.getexecutingassembly ( ) ) ;
this.lblcancel.image = ( ( image ) ( rm.getobject ( "cancel-over.png" ) ) ) ;
}
}
五.总结:
至此我们已经完成了在visual c#资源文件方面编程的全部内容,其中的主要内容就是创建资源文件和使用资源文件二大方面,我想通过这二篇文章的介绍,你对资源文件应该有了一个比较全面的认识了吧!
新闻热点
疑难解答