.NET COM 用户控件未正确设置字体或语言
.NET COM usercontrol does not set font or language properly
我创建了一个 COM VB.NET(VS2013 下的 v3.5)用户控件,我已将其包含在旧的 VB6 项目中。该控件与其 VB6 主机通信正常。它按预期工作,打开数据库,读取/写入内容。一切都很好,除了一件事,我不确定它是什么。看来我无法将其字体(?)或语言(?)正确设置为希腊语,以便能够在包含的文本框中键入希腊语字符。
此用户控件包含其他几个 .NET 控件。列表框、按钮和文本框。我从 DB 读取内容,将所有这些控件的文本 属性 设置为数据库的内容,希腊语显示正确。如果我尝试将 O/S 语言切换为希腊语并在文本框中键入内容,则会显示奇怪的字符而不是正确的希腊字符(我假设来自另一个代码页)。我以编程方式将其字体更改为“[Font: Name=Arial, Size=9, Units=3, GdiCharSet=161, GdiVerticalFont=False]”。 GdiCharSet=161 是希腊语。它应该工作。它确实可以在 .NET 环境或测试 .NET exe 中运行。我可以在文本框中输入希腊语。当我尝试在 VB6 程序中使用它时,似乎无法切换到希腊语并无法输入希腊语字符。从数据库中加载希腊语并显示它们是没有问题的。
我也曾尝试将 GdiCharSet 设置为 0、1、2(是的,它确实按预期显示了 Symbols)并更改了用户控件构造函数中的区域性,但没有成功:
System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("el-GR")
System.Threading.Thread.CurrentThread.CurrentUICulture = New System.Globalization.CultureInfo("el-GR")
有人有什么想法,要检查/尝试什么?
哇...在这件事上花了很多时间,我终于找到了解决办法。
Private Sub txtMessage_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMessage.KeyPress
If InputLanguage.CurrentInputLanguage.Culture.Equals(New Globalization.CultureInfo("el-GR")) Then
FixKeyChar(e)
End If
End Sub
Public Sub FixKeyChar(ByRef e As KeyPressEventArgs)
Dim myUnicodeBytes As Byte() = Encoding.Unicode.GetBytes(e.KeyChar)
Dim myUTF32Bytes As Byte() = Encoding.Convert(Encoding.Default, Encoding.UTF32, myUnicodeBytes)
e.KeyChar = ChrW(myUTF32Bytes(1) * 256 + myUTF32Bytes(0))
End Sub
我希望它能对其他处理这些事情的可怜人有所帮助...
我创建了一个 COM VB.NET(VS2013 下的 v3.5)用户控件,我已将其包含在旧的 VB6 项目中。该控件与其 VB6 主机通信正常。它按预期工作,打开数据库,读取/写入内容。一切都很好,除了一件事,我不确定它是什么。看来我无法将其字体(?)或语言(?)正确设置为希腊语,以便能够在包含的文本框中键入希腊语字符。
此用户控件包含其他几个 .NET 控件。列表框、按钮和文本框。我从 DB 读取内容,将所有这些控件的文本 属性 设置为数据库的内容,希腊语显示正确。如果我尝试将 O/S 语言切换为希腊语并在文本框中键入内容,则会显示奇怪的字符而不是正确的希腊字符(我假设来自另一个代码页)。我以编程方式将其字体更改为“[Font: Name=Arial, Size=9, Units=3, GdiCharSet=161, GdiVerticalFont=False]”。 GdiCharSet=161 是希腊语。它应该工作。它确实可以在 .NET 环境或测试 .NET exe 中运行。我可以在文本框中输入希腊语。当我尝试在 VB6 程序中使用它时,似乎无法切换到希腊语并无法输入希腊语字符。从数据库中加载希腊语并显示它们是没有问题的。
我也曾尝试将 GdiCharSet 设置为 0、1、2(是的,它确实按预期显示了 Symbols)并更改了用户控件构造函数中的区域性,但没有成功:
System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("el-GR")
System.Threading.Thread.CurrentThread.CurrentUICulture = New System.Globalization.CultureInfo("el-GR")
有人有什么想法,要检查/尝试什么?
哇...在这件事上花了很多时间,我终于找到了解决办法。
Private Sub txtMessage_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMessage.KeyPress
If InputLanguage.CurrentInputLanguage.Culture.Equals(New Globalization.CultureInfo("el-GR")) Then
FixKeyChar(e)
End If
End Sub
Public Sub FixKeyChar(ByRef e As KeyPressEventArgs)
Dim myUnicodeBytes As Byte() = Encoding.Unicode.GetBytes(e.KeyChar)
Dim myUTF32Bytes As Byte() = Encoding.Convert(Encoding.Default, Encoding.UTF32, myUnicodeBytes)
e.KeyChar = ChrW(myUTF32Bytes(1) * 256 + myUTF32Bytes(0))
End Sub
我希望它能对其他处理这些事情的可怜人有所帮助...