繁体
目前用VB写一小程序,简体系统开发,运行于繁体系统
出现繁体字无法显示的问题,于是采用*.ini配置的方法读入,解决
新的问题:界面上放置Text控件让用户在繁体系统输入,
程序将获得的Text1.Text重新画在Picture上,仍然乱码,由于输入文本不可预期,
无法使用.ini文件
急求高手帮忙,分不够可加。
问题点数:100、回复次数:25Top
1 楼of123()回复于 2006-02-08 11:17:47 得分 10
利用 CD 环境直接画,不要采用 Print 方法。Top
2 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2006-02-08 11:18:27 得分 0
代码页问题
用WideCharToMultiByte、MultiByteToWideChar转一下代码页就行了Top
3 楼Modest(塞北雪貂)·(偶最欣赏楼主的分)回复于 2006-02-08 11:22:20 得分 10
Private Declare Function LCMapString Lib "kernel32" Alias "LCMapStringA" (ByVal Locale As Long, ByVal dwMapFlags As Long, ByVal lpSrcStr As String, ByVal cchSrc As Long, ByVal lpDestStr As String, ByVal cchDest As Long) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long
'简转繁
Public Function JToF(ByVal Str As String) As String
Dim STlen As Long
Dim STf As String
STlen = lstrlen(Str)
STf = Space(STlen)
LCMapString &H804, &H4000000, Str, STlen, STf, STlen
JToF = STf
End Function
'繁转简
Public Function FToJ(ByVal Str As String) As String
Dim STlen As Long
Dim STj As String
STlen = lstrlen(Str)
STj = Space(STlen)
LCMapString &H804, &H2000000, Str, STlen, STj, STlen
FToJ = STj
End Function
Top
4 楼xuhhff(惠鸿)回复于 2006-02-08 12:17:26 得分 0
zyl910(910:分儿,我又来了!)
代码页问题
用WideCharToMultiByte、MultiByteToWideChar转一下代码页就行了
能说得祥细点么?非常急,谢谢。Top
5 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2006-02-08 12:22:38 得分 0
这牵涉到很多概念,从头说起很麻烦的
推荐:
1)《Visual Basic Win32 API 编程》(原名《Win32 API Programming with Visual Basic》),Steven Roman著,陈志远译。中国电力出版社,2001.4
2)Developing International Software, Second Edition(国际化软件开发,第二版)
楼主最好将相关代码贴出来,这样才好帮你解决问题
至少先将得到的乱码贴上来,看有没有办法恢复
Top
6 楼xuhhff(惠鸿)回复于 2006-02-08 12:38:17 得分 0
form1放置Text1,Command1, Picture1 3个控件
代码如下:
Dim txt As String
Private Sub Form_Load()
Me.Text1.Text = "多语言程序"
Me.Command1.Caption = "Draw"
End Sub
Private Sub Draw()
Me.Picture1.Cls
With Me.Picture1
.CurrentX = 300
.CurrentY = 500
Me.Picture1.Print txt
End With
End Sub
Private Sub Command1_Click()
txt = Me.Text1.Text
Call Draw
End Sub
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyEscape
Me.Text1.Text = ""
Case 13
txt = Me.Text1.Text
Call Draw
End Select
End Sub
在简体中文环境运行,当然是正常,可是在繁体系统,text1输入繁体回车后就出现乱码了
Top
7 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2006-02-08 12:47:20 得分 0
至少先将得到的乱码贴上来,看有没有办法恢复!Top
8 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2006-02-08 12:53:37 得分 0
我这里没有繁体中文平台
所以相关的测试数据才是最重要的
Top
9 楼Modest(塞北雪貂)·(偶最欣赏楼主的分)回复于 2006-02-08 12:57:25 得分 15
在繁体系统中编译Top
10 楼xuhhff(惠鸿)回复于 2006-02-08 13:11:45 得分 0
如何贴图回复呢?
個性磁鐵
說明
列印
離開
試用期已到,請聯繫軟體作者。
單擊小圖上半部分,切換文字;
單擊小圖下半部分,切換圖片;
修改文字時,按 [Esc] 鍵(或滑鼠右鍵)取消,按 [Enter] 鍵確認。
=====>>>>>>>>>
┦合臟
/弧
/
/瞒秨
/刚ノ戳叫羛么硁砰
/虫阑瓜场だち传ゅ
/虫阑瓜场だち传瓜
/эゅ [Esc] 龄┪菲公龄 [Enter] 龄絋粄Top
11 楼xuhhff(惠鸿)回复于 2006-02-08 13:12:26 得分 0
用户输入什么内容,我们是无法预知的,怎么叫恢复呢?Top
12 楼xuhhff(惠鸿)回复于 2006-02-08 13:12:48 得分 0
那位有繁体中文win的下载地址,谢谢Top
13 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2006-02-08 13:19:46 得分 15
访问VB控件得到的肯定是乱码,这时得想办法使乱码恢复
还不一样转出来了
個性磁鐵
/說明
/列印
/離開
/試用期已到,請聯繫軟體作者。
/單擊小圖上半部分,切換文字;
/單擊小圖下半部分,切換圖片;
/修改文字時,按 [Esc] 鍵(或滑鼠右鍵)取消,按 [Enter] 鍵確認
Top
14 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2006-02-08 13:20:32 得分 0
不信的话再发一段乱码(别发原文)Top
15 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2006-02-08 13:22:45 得分 0
//那位有繁体中文win的下载地址,谢谢
我现在是在家里拨号上网
才56Kbps
等下载完已经是明年了Top
16 楼xuhhff(惠鸿)回复于 2006-02-08 13:30:17 得分 0
能否有个不安装繁体系统就能解决的方案呢
现在的情况就是客户如果把它输入繁体后得到的乱码我,
我把这些乱码写入到vb代码中编译,msgbox出来,在客户繁体机中看到就是正常的代码了
实际上这个繁体乱码可以通过FrontPage内修改Big5保存成网页,然后再用*.txt就可以得到的
那么获得用户输入控件的text,应该执行一个 str = Gb2Big(text1.text)就可以才对阿
可是测试的结果都还是乱码。如果从把乱码写在*.txt文件,读出来就不会。
Top
17 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2006-02-08 14:12:04 得分 30
下面的代码绕开了VB控件机制,理论上支持任何语言环境
Option Explicit
Private Declare Function SendMessageA Lib "user32" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_GETTEXT = &HD
Private Const WM_GETTEXTLENGTH = &HE
Private Declare Function GetClientRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function DrawTextA Lib "user32" (ByVal hDC As Long, ByRef lpStr As Any, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long
Private Const DT_TOP As Long = &H0
Private Const DT_LEFT As Long = &H0
Private Const DT_CENTER As Long = &H1
Private Const DT_RIGHT As Long = &H2
Private Const DT_VCENTER As Long = &H4
Private Const DT_BOTTOM As Long = &H8
Private Const DT_WORDBREAK As Long = &H10
Private Const DT_SINGLELINE As Long = &H20
Private Const DT_EXPANDTABS As Long = &H40
Private Const DT_TABSTOP As Long = &H80
Private Const DT_NOCLIP As Long = &H100
Private Const DT_EXTERNALLEADING As Long = &H200
Private Const DT_CALCRECT As Long = &H400
Private Const DT_NOPREFIX As Long = &H800
Private Const DT_INTERNAL As Long = &H1000
'#if(WINVER >= 0x0400)
Private Const DT_EDITCONTROL As Long = &H2000
Private Const DT_PATH_ELLIPSIS As Long = &H4000
Private Const DT_END_ELLIPSIS As Long = &H8000&
Private Const DT_MODIFYSTRING As Long = &H10000
Private Const DT_RTLREADING As Long = &H20000
Private Const DT_WORD_ELLIPSIS As Long = &H40000
'#if(WINVER >= 0x0500)
Private Const DT_NOFULLWIDTHCHARBREAK As Long = &H80000
'#if(_WIN32_WINNT >= 0x0500)
Private Const DT_HIDEPREFIX As Long = &H100000
Private Const DT_PREFIXONLY As Long = &H200000
'#endif /* _WIN32_WINNT >= 0x0500 */
'#endif /* WINVER >= 0x0500 */
'Dim txt As String
Private m_Text() As Byte
Private m_cbText As Long
Private Sub Form_Load()
Me.Text1.Text = "多语言程序"
Me.Command1.Caption = "Draw"
End Sub
Private Sub Draw()
Dim rcTemp As RECT
With Picture1
Call .Cls
'绘制文本
Call GetClientRect(.hWnd, rcTemp)
Call DrawTextA(.hDC, m_Text(0), m_cbText, rcTemp, DT_EDITCONTROL)
End With
End Sub
Private Sub Command1_Click()
Dim hWndEdit As Long
'取得文字
hWndEdit = Text1.hWnd
m_cbText = SendMessageA(hWndEdit, WM_GETTEXTLENGTH, 0, ByVal 0&)
If m_cbText > 0 Then
ReDim m_Text(0 To m_cbText - 1)
Call SendMessageA(hWndEdit, WM_GETTEXT, m_cbText + 1, m_Text(0))
End If
Call Draw
End Sub
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyEscape
Me.Text1.Text = ""
Case 13
Call Command1_Click
End Select
End Sub
Top
18 楼DengXingJie(杰西)回复于 2006-02-08 14:15:02 得分 20
樓主請注意控件的Font屬性
在簡體中有很多字體在繁體中是不存在,此時則會出現亂碼的情況
如果字體名稱通用(即:在簡體與繁體中都存在的字體名稱,如Arial字體),則一般不會出現亂碼的情況
樓主不妨試試Top
19 楼xuhhff(惠鸿)回复于 2006-02-08 15:33:58 得分 0
非常感谢大家特别是 zyl910 兄的热心帮助
再问一下,最后的这部分代码,利用API得到rect,如果在pic的多个地方都要画呢
怎么控制rect的left/top等位置属性?Top
20 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2006-02-08 15:40:29 得分 0
你自己设置rcTemp的left、top属性就行Top
21 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2006-02-08 15:41:36 得分 0
'绘制文本
Call GetClientRect(.hWnd, rcTemp)
rcTemp.Left = 10 '注意单位是像素
rcTemp.Top = 10
Call DrawTextA(.hDC, m_Text(0), m_cbText, rcTemp, DT_EDITCONTROL)
Top
22 楼xuhhff(惠鸿)回复于 2006-02-08 15:53:22 得分 0
很遗憾,整段代码编译后在繁体环境运行,文本框无法输入繁体字。!Top
23 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2006-02-08 16:01:45 得分 0
//很遗憾,整段代码编译后在繁体环境运行,文本框无法输入繁体字。!
字体设对了没有?Top
24 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2006-02-08 16:03:00 得分 0
尽量使用系统标准字体,如:Fixedsys、ArialTop
25 楼eslbs(书林跋涉)回复于 2006-02-09 16:31:38 得分 0
以前研究过这个问题
没有解决
不过我觉得解决方法是
用vb英文版编译程序
设置代码页
设置字体属性
用DrawText 输出
Top




