千家信息网

VB6实现MUI程序方法是怎么样的

发表于:2025-11-16 作者:千家信息网编辑
千家信息网最后更新 2025年11月16日,这期内容当中小编将会给大家带来有关VB6实现MUI程序方法是怎么样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。为大家详细讲述的是VB6实现MUI程序方法,希望本
千家信息网最后更新 2025年11月16日VB6实现MUI程序方法是怎么样的

这期内容当中小编将会给大家带来有关VB6实现MUI程序方法是怎么样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

为大家详细讲述的是VB6实现MUI程序方法,希望本文能给大家的日常开发工作带来一些启示。

之前,我负责一个VB6编写的办公自动化系统,要求能在运行时,支持在不同语言间切换(英文,中文,日文,德文,法文和西班牙文);实质就是实现一个VB6的MUI程序.

这个需要的困难在于VB6显示文本的标准控件(Label,Textbox等)不支持Unicode;但字符串在其内部是按Unicode保存的,也就是说VB6本身是支持Unicode的.

VB6中,标准控件显示字符串的过程如下:

1) 标准控件先将Unicode字符串转换成ANSI字符串;

2) 标准控件尝试将ANSI字符串转换成其Font.Charset属性中指定的字符集格式的字符串;如果转换失败,则显示为问号(?).

具体可参照:Display Unicode Strings in Visual Basic 6.0.

因此,实现MUI程序的思路有两种:

1) 将标准控件替换为能支持Unicode的控件;

2) 将资源文件中不同字符集的文本,转换为ANSI格式,提供给标准控件使用;

第1)种方式可用 Forms 2.0 (fm20.dll);

第2)种方式,我在网上找到两篇文章,但各有不足:

a) Auto-Detect Language and Display Unicode in VB6 TextBox and Label Controls;

ChilkatCharset2控件需购买,具对日文的一些标点符号(如全角句号)不支持.

b) How To Convert from ANSI to Unicode & Unicode to ANSI for OLE

没有测试成功.

下面,着重介绍我自己认为比较成功的实现,它使用了ADODB.Stream(msado25.tlb);其实现思路如下:

1) 将程序中用到的文本保存为Unicode格式的资源文件中;

之所以将资源文本保存为双字节的Unicode格式,而非Utf8或Utf7格式,可省去从其它格式向VB6支持的Unicode格式转换过程.

2) 将显示文本的标准控件的Font.Charset,设置为程序要显示语言所对应的字符集,并设置一种支持这种字符集的字体到Font.Name属性

  If g_Str.NumJapanese > 0 Then       charset = "Shift_JIS"       Text1.Font.Name = "MS UI Gothic"       Text1.Font.charset = 128            ElseIf g_Str.NumKorean > 0 Then       charset = "ks_c_5601-1987"       Text1.Font.Name = "GulimChe"       Text1.Font.charset = 129         ElseIf g_Str.NumCentralEuro > 0 Then      charset = "windows-1250"      Text1.Font.Name = "Arial"      Text1.Font.charset = 238          ElseIf g_Str.NumArabic > 0 Then      charset = "windows-1256"      Text1.Font.Name = "Traditional Arabic"      Text1.Font.charset = 178          ElseIf g_Str.NumHebrew > 0 Then      charset = "windows-1255"      Text1.Font.Name = "David"      Text1.Font.charset = 177          ElseIf g_Str.NumCyrillic > 0 Then      charset = "windows-1251"      Text1.Font.Name = "Arial"      Text1.Font.charset = 204          ElseIf g_Str.NumGreek > 0 Then      charset = "windows-1253"      Text1.Font.Name = "Arial"      Text1.Font.charset = 161          ElseIf g_Str.NumThai > 0 Then      charset = "windows-874"      Text1.Font.Name = "Angsana New"      Text1.Font.charset = 222          ElseIf g_Str.NumChinese > 0 Then      charset = "gb2312"      Text1.Font.Name = "SimSun"      Text1.Font.charset = 134       ' An alternative is to use Big5:       ' Text1.Font.Name = "MingLiu"       'charset = "big5"       'fontCh = 136          Else      charset = "windows-1252"      Text1.Font.charset = 0      Text1.Font.Name = "Arial" End If

3) 根据要显示的语言,利用ADODB.Stream将资源文件中Unicode格式保存的字符串转换成操作系统的区域语言(Locale)支持字符集的字符串;

' 调用API来获取操作系统默认的区域语言设置(LocaleID)    Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long       ' 将Unicode字符串,转换为指定字符集的字节数组;    ' 用于转换用资源文件中读取的文本;    Public Function ConvertStringToBytes(ByRef strText As String, charset As String) As Byte()            Dim objStream As ADODB.Stream        Dim data() As Byte             ' init stream       Set objStream = New ADODB.Stream       objStream.charset = charset       objStream.Mode = adModeReadWrite       objStream.Type = adTypeText       objStream.Open              ' write bytes into stream       objStream.WriteText strText       objStream.Flush              ' rewind stream and read text       objStream.Position = 0       objStream.Type = adTypeBinary   '    objStream.Read 3 ' skip first 3 bytes as this is the utf-8 marker       data = objStream.Read()             ' close up and return       objStream.Close       ConvertStringToUtf8Bytes = data      End Function  ' 转换为指定字符集的字节数组,转换为ANSI(即LocaleID)对应的字符集的字符串;   ' 用于将ConvertStringToBytes()返回的字节数组转换为GetCharset()字符集的字符串.   Public Function ConvertBytesToString(ByRef data() As Byte, charset As String) As String         Dim objStream As ADODB.Stream       Dim strTmp As String                ' init stream       Set objStream = New ADODB.Stream       objStream.charset = charset       objStream.Mode = adModeReadWrite      objStream.Type = adTypeBinary       objStream.Open             ' write bytes into stream       objStream.Write data       objStream.Flush             ' rewind stream and read text       objStream.Position = 0       objStream.Type = adTypeText       strTmp = objStream.ReadText              ' close up and return       objStream.Close       ConvertUtf8BytesToString = strTmp      End Function     '获取操作系统默认区域语言对应的字符集   Public Function GetCharset() As String      Dim localeId As Long      Dim charset As String             ' 获取操作系统的LocaleId       localeId = GetSystemDefaultLCID()              Select Case localeId                  Case 1033               charset = "windows-1252"          Case 2052               charset = "gb2312"          Case 1041               charset = "Shift_JIS"          Case Else              charset = "windows-1252"      End Select             GetCharset = charset   End Function     '显示资源文本中的文本   Private Sub DisplayText(filename As String)          '保存资源文本中的文本的变量       Dim textBytes As Variant      Dim f As New FileSystemObject       Dim fs As TextStream       '将Unicode文本读取到变量中       Set fs = f.OpenTextFile(filename, ForReading, False, TristateTrue)          Do While Not fs.AtEndOfStream           textBytes = fs.ReadAll      Loop        fs.Close       ' Convert to a Unicode string:      Dim s As String     s = textBytes      Dim t As Long     ' CkString是免费的第三方组件,可自动判定一个字符串所对应的字符集      ' 下载地址:http://www.chilkatsoft.com/download/CkString.zip      Dim g_Str As New CkString       g_Str.Str = s            '获取资源文本所代表的字符集名称,设置对应的字体和字符集到textbox上      Dim charset As String     If g_Str.NumJapanese > 0 Then  '日文          charset = "Shift_JIS"         Text1.Font.Name = "MS UI Gothic"         Text1.Font.charset = 128                ElseIf g_Str.NumKorean > 0 Then '韩语          charset = "ks_c_5601-1987"         Text1.Font.Name = "GulimChe"         Text1.Font.charset = 129                ElseIf g_Str.NumCentralEuro > 0 Then '中欧语言          charset = "windows-1250"         Text1.Font.Name = "Arial"         Text1.Font.charset = 238                ElseIf g_Str.NumArabic > 0 Then '阿拉伯语          charset = "windows-1256"         Text1.Font.Name = "Traditional Arabic"         Text1.Font.charset = 178      ElseIf g_Str.NumGreek > 0 Then  '希腊语          charset = "windows-1253"         Text1.Font.Name = "Arial"         Text1.Font.charset = 161      ElseIf g_Str.NumThai > 0 Then  '泰语          charset = "windows-874"         Text1.Font.Name = "Angsana New"         Text1.Font.charset = 222      ElseIf g_Str.NumChinese > 0 Then '中文          charset = "gb2312"         Text1.Font.Name = "SimSun"         Text1.Font.charset = 134         ' 繁体则使用Big5:         ' Text1.Font.Name = "MingLiu"          'charset = "big5"          'Text1.Font.charset = 136      Else '默认值          charset = "windows-1252"         Text1.Font.charset = 0          Text1.Font.Name = "Arial"     End If      Dim bytes() As Byte     Dim g_OSCharset As String     '获取操作系统默认语言对应的字符集     g_OSCharset = GetCharset()      '先将Unicode资源文本转换成对应的字节数组;     bytes = ConvertStringToBytes(s, charset)      '将字节数组转换成ANSI(即默认字符集)对应的字符串      vbstr2 = ConvertBytesToString(bytes, g_OSCharset)      ' 设置字符串到VB6的标准控件中      Me.Text1.Text = vbstr2  End Sub

上述就是小编为大家分享的VB6实现MUI程序方法是怎么样的了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

字符 字符集 字符串 文本 控件 资源 标准 格式 语言 支持 程序 字节 系统 操作系统 数组 文件 方法 区域 日文 不同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 计算机软件开发原则有哪些 软件开发需要哪些合作伙伴 大专工业网络技术升本专业 单位网络安全试题及答案 辽宁数据网络技术分类技术 论述网络安全防护体系的构建4000 网络安全技术与实践的实验6 ui嵌入式软件开发是做什么 慧财网络技术有限公司官网 道路网络技术性能评价指标 清远餐厅连锁餐饮数字化软件开发 海南专业软件开发服务参考价格 网络安全面临的问题包括哪些 静态网页包含数据库吗 云服务器优点图解 ice服务器现状视频 软件开发销售企业成本核算 2021网络安全宣传周推迟 不履行网络安全保护义务处罚款 admet预测数据库PKKB 易语言修改数据库表名 元宇宙服务器算力 计算机网络技术转二进制 监狱防护网络安全底座 如何为服务器绑定域名 政府网络安全事故 hpz600服务器带双网口 关系数据库与网状数据库的比较 网络安全员学徒 火山软件开发平台视频教程下载
0