CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

繁体

楼主xuhhff(惠鸿)2006-02-08 11:13:18 在 VB / 基础类 提问

 
    目前用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

相关问题

  • 繁体 or 简体?
  • 繁体中文
  • 简繁体转换
  • 可恶的繁体
  • 简繁体转换
  • 求繁体版XP
  • 简繁体问题
  • 简繁体转换
  • DELPHI5.0简繁体问题
  • 关于繁体显示

关键词

  • win32
  • win32 api
  • 乱码
  • 代码
  • 控件
  • 字体
  • 系统
  • 文字
  • 解决
  • 中文

得分解答快速导航

  • 帖主:xuhhff
  • of123
  • Modest
  • Modest
  • zyl910
  • zyl910
  • DengXingJie

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo