科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件浅析Visual Basic.NET中的资源使用

浅析Visual Basic.NET中的资源使用

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

以下示例就是一个同时支持英文和中文界面的示例程序。程序创建完整步骤如下:

作者: 来源:中国IT实验室 2008年6月7日

关键字: 使用 资源 VB vb.net Windows

  • 评论
  • 分享微博
  • 分享邮件
例一:时下许多网上的软件都有什么多国语言版之类的说法,实在点就是同一程序在安装或使用过程中有个国家区域选项,当你选择了对应的国家时,程序就会显示使用相应国家语言的界面。其实在编程实现这种功能非常简单,只不过是使程序同时嵌入几个不同语言的资源文件而已,以下示例就是一个同时支持英文和中文界面的示例程序。程序创建完整步骤如下:
  
  1、在VB.net中新建一个项目,类型选择windows应用程序,项目名称改为resourcesample1。
  
  2、在form1上放一个Lable控件.
  
  3、选择窗体form1,按以下指示设置属性:
  
  (1)Locallizable 属性设为True,这一步是关键,这个属性告诉net环境,要使用资源文件来保存窗体及窗体内的各种控件的属性值.
  
  (2)选择窗体的language属性,将其设为英语。然后按下表设置窗体及lable控件的其它属性:
   
  窗体外观如下:
   
  (3)重新选择窗体的language属性,将其设为中文(简体)。然后按下表设置窗体及lable控件的其它属性:
   
  让我们说中文!
  
  窗体外观如下:
   
  大家也许很奇怪,为什么要对窗体及label的text属性进行两次不同的赋值呢?其实答案很简单,vs.net太聪明了,由于我们使用Locallizable 属性告诉net环境,要使用资源文件来保存窗体及窗体内的各种控件的属性值,当使用不同的language属性,它会将窗体及其上控件的属性按语言分别记录在不同的资源文件内。不信你将language属性重新设为英语看看,第一个英文界面的窗体又跳出来了吧8-D
  4、如果说可视化编程是光明之途的话,那么我们的快乐时光到此结束,由于net还没有智能化到会判断什么时候使用什么国家的语言界面的程度(如果net 太智能了,程序员就不幸了,下岗啊,谁受得了?!),所以以下必须由我们自己编写代码确定程序的实际界面显示。
  
  打开 form1的New过程,在InitializeComponent()前加入如下代码(这段代码作用是在窗体初始化组件之前,按指定的语言区域信息载入相应的界面资源文件):
  
  Dim tenmDialogResult As DialogResult
  tenmDialogResult = MessageBox.Show("请问是使用中文还是英语,中文选择OK,英文选择CANCEL。", _
  "语言选择", _
  MessageBoxButtons.OKCancel, _
  MessageBoxIcon.Question, _
  MessageBoxDefaultButton.Button1, _
  MessageBoxOptions.DefaultDesktopOnly)
  
  REM 一般情况下程序都是使用读取初始化文件的方法来取得语言设置信息,
  
  '但本例程为了简便起见,仅使用一个对话框提示用户选择适合自己的语言.
  
  If tenmDialogResult = DialogResult.OK Then '使用中文界面
  gstrAppCulture = "zh-CHS"
  Else '使用英文界面
  gstrAppCulture = "en"
  End If
  
  '将需要使用的区域信息放到当前线程的区域信息中,
  '程序窗体会根据设定的信息装载相应的资源文件以显示信息
  System.Threading.Thread.CurrentThread.CurrentUICulture = _
  New System.Globalization.CultureInfo(gstrAppCulture)
  
  剩下的事这没什么好说的了,按运行吧,在出现对话框时试着点OK或Cancel看看你的杰作吧,很酷的同时支持中英文界面的示例程序哦。
  
  伟大的思想家会说:我们要透过现象看到事物的本质。我虽说对哲学不感兴趣,但对net在后台到底瞒着我干了些什么见不得光的勾当还是非常好奇的。点击解决方案资源管理器,点击"显示所有文件"的按纽,很惊奇地发现在form1.vb下出现了几个后缀名为resx的文件,这些家伙就是本文要说明的资源文件了(留意一下资源文件的文件名包含的en和zh-CHS的字符,这就代表该资源文件储存的语言内容,en为英文,zh-CHS为简体中文)。
   
  双击form1.en.resx,看一下资源文件是如何储存界面的语言信息的:
   
  左边的数据源显示资源文件的实际数据(data)以及资源文件的文件版本信息(resheader),我只关心资源文件的实际数据储存,右边的表列出了储存的数据:很显然name代表控件的属性(其实是引用资源数据的键),后面的value代表对应键的实际数据(在程序中界面显示的值就靠这里了,你可以试着把Let's apeak English改一下,然后运行一下程序看看);comment代表注释,type代表数据的类型,mimetype就是资源数据的MIME 类型(当你窗体或picturebox存有图片时你会看到这里有一个很长的值,由于这个对编程作用不大,不作解释)。我们还可以在这个界面中插入新的资源数据,只要填写好name和value就可以了。
  
  明白了资源文件后,我们再看一下代码中是怎样引用这引些值的,打开窗体的代码编辑器,展开"Windows 窗体设计器生成的代码"这一代码段,找到窗体的Private Sub InitializeComponent()过程,
  
  第一句为:
  
  Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(Form1))
  
  这句代码的含义就是产生一个resourcemanager对象来对form1的资源文件进行控制,由于net 会根据线程的区域属性调用窗体的不同语言的资源文件,所以我们前面示例中将改变线程区域信息的代码放在InitializeComponent()过程之前,以便net在创建resources对象时调用正确的语言资源文件。
  
  接下来就是一大堆对控件属性进行赋值的语句了,看一下label的text 属性是如何赋值的就会明白资源数据的使用方法了。
  
  Me.Label1.Text = resources.GetString("Label1.Text")
  
  很简单,使用ResourceManager的方法就可以获得实际需要的资源数据了必要时可以可以使用getobjcet方法取得数据,然后再用Ctype将其转为指定的类型。
  
  写到这儿,本来按原计划我是想收笔的,但是天气依然阴沉沉,很闷,干脆就将资源使用的终极杀招也介绍一下好了。资源发展到现在已不权是简单地解决程序国际化的界面方面了,在net中可以使用资源将任意文件嵌入到你的可执行文件中,在需要时再用流的方式读出使用(是任意文件哦,而且方法非常简单),好象很酷的样子吧。以下我就用另一个示例说明一下。
  
  示例2:在net中可执行文件中嵌入一个文本文件。
  
  以前我做程序,版权使用协议信息总是放在一个txt文本文件中,打包时和可执行文件放在一起,在安装时释放到程序的安装路径,然后再打开使用。这种做法有两大坏处,一是这个文件很容易被其它人修改,二是可以套用蜡笔小新的一句话:"这种做法太不成熟了吧!"。现在我使用一个新的方法,就是将协议和可执行文件结合在一起,在程序运行时读出使用,当然这就全靠资源的作用了。步骤如下:
  
  1、在VB.net中新建一个项目,类型选择windows应用程序,项目名称改为resourcesample2。
  
  2、点击项目菜单,选择添加现有项,接着会弹出一个文件对话框,将文件类型改为所有文件后,选择要嵌入的txt文件(其实这时你可选择任意文件,只要你喜欢*-)。接着你会在解决方案资源管理器中发现你新加入的文件名。如图:
   
  3、关键的一步到了,在解决方案资源管理器中点击你刚加入的文件名,然后在属性窗体中将 "加成操作" 这一属性改为"嵌入的资源",这将告诉net,刚加入的文件将会作为资源链接进可执行文件中。留意一下文件名哦,这在后面的程序中也很重要,强烈建议使用小写文件名!如下图:
   
  4、接下就是在程序中用代码读出这个文件的内容。
  
  在Form1_Click事件中加入代码,如下所示:
  
  Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Click
  Dim tobjStream As IO.Stream = Me.GetType.Assembly.GetManifestResourceStream("resourcesample2.License.txt")
  Dim tobjStreamReader As New IO.StreamReader(tobjStream, System.Text.Encoding.Default)
  Dim tstrLicense As String = tobjStreamReader.ReadToEnd
  '如果是图象就可以使用dim tobjBMP as new bmp(tobjstrem)的方法直接得到资源内容
  MessageBox.Show(tstrLicense)'显示刚才读得的结果
  End Sub
  
  在此对上述代码进行一点解释,net是通过Assembly的GetManifestResourceStream读出嵌入在可执行文件的资源并以IO.Stream对象返回(反正得到了这个流,就好象你时进行文件流操作,读/写到磁盘或象我一样在程序内部处理都由你自己决定了)。这个方法的唯一参数是资源的唯一标识,是按如下方式组成的:程序集的根命名空间+"."+资源在属性窗口显示的文件名(这是区分大小写的,在上文已提醒你注意了哦,而且这个标识法在C#中是不同的,别问我为什么,谁叫你不和我一样使用VB.net,哼8-)。
  
  程序集的根命空间的名你可以从项目菜单下的XXXX(XXXX是你的项目名称,可不要认为是骂人的话8-)属性中看到:
  
  其余的代码就是以流方式读文件了,很简单吧。
  
  5、按生成菜单下的生成解决方案,然后到你可执文件的目录下看看,你会发现除了可执行文件外没有别的文本文件,因为文本文件已以资源的方式存
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章