我的---关于在VC6.0中开发多国语言显示问题的总结---(有源码作为部分参考)

YP2002CN 2002-04-26 06:38:42
我来到这里,快有一个月了.都是因为该死的多国语言显示的问题,才让我在这里面结识了诸位,呵呵,在这里面我感觉到CHN-Programer的和睦和团结,不由得有时引发阵阵振兴祖国软件的豪情(呵呵,说笑那).在这里我要感谢帮助过我的人.当然很多问题都还要靠自己,但是没有你们这些人,我可能快要被老板炒鱿鱼了.我真正开始搞vc才三个月时间,就这一个月到了csdn后,进步最快.下面是我关于这个月以来我一直在研究的,关于在某些不同Win操作平台下,在我们的操作系统环境下,开发别国语言显示的问题.用来给初级程序员作为参考.(测试是在对话框里面进行的).
我们都知道windows操作系统有支持ANSI和支持Unicode的版本,也有都支持的.其中,windows98只能支持ANSI系统环境.windows2000可以支持Unicode和NSI.windowsCE只支持Unicode.WindowsXP好象也是两个都支持.所以我们在开发多国语言的时候一般都选用windows2000.因为我们可以构件Unicode工程来支持多国语言的显示.(如果你不理解什么是Unicode可以参看<<Windows核心编程>>的第二章.(在ttp://www.china-pub.com/computers/common/info.asp?id=131提供第二章的免费下载).|完整的下载,我都忘记了|.
为了在控件中显示别国语言(如日文,阿拉伯文等)而不至于显示成????,或者说文字可以显示在控件上,但是你无法获取他们并将他们保存到我们常用的CString中,这就需要你创建Unicode工程,这样才能支持.如果你一定要在Ansi系统(win98),开发这样的东西.我暂时还没有搞出来。.呵呵,在<<windows核心编程>>里面说得很清楚,如果你要把这个东西加到里面,即便成功也会造成无法想象的不稳定.关于这点显示的问题,我在下面还有一些支持在98下显示的问题说明,介绍的是用DHTML控件的.下面我先说建立Unicode工程和用Rich Edit 控件(用CRichEditCtrl类支持)显示多语言的问题.
创建Unicode工程只要按照下面步骤进行就可以了.(/***/注释段为摘抄)
/******************* //构件Unicode Debug
1.前提条件:
运行VC++的安装程序,选中MFC的UNICODE支持。
2。VC++Build->configurations...->Add->Configuration->"Unicode Debug"->OK
3.Project->Setting->C++->Preprosesser Definitions->加入UNICODE,_UNICODE, 去掉MBCS即可
4。Project->Setting->lINK->Category->)Outputw->加入wWinMainCRTStartup。
5选择"Win32 Unicode debug"编译方式,代码按照Unicode encoding!
6. Hope it has some help to you.
********************/
实际上只要下面两步骤:
1.project下面选setting,然后选C/C++,在preprocessor definitions中加入
_UNICODE.(不需要去掉_MBCS)
2.就是上面的4.
有了上面步骤,就说明你的工程已经是Unicode工程了.如果你是想把原来的程序改造成Unicode.编译后可能会发生错误,这就要求你改正成Unicode的正确形式..一般情况下对,字符串常量..你只要在前面加上_T("字符串常量"),就可以了.剩下的多为函数调用和字符转换的问题如strcpy->lstrcpy和CString<->Char *之类的(可以看核心编程)..关于这个转换问题,我这里有一个出自CSDN精华区的网页(别人的总结),不知道现在里面有没有了?如果没有你想要,可以和我联系告知.我将尽力帮助.这里对_T宏说明一点,其实它在ANSI环境下也是通过的.而且就读成相应的环境形式.所以一般情况下,我觉得编程,应该都加上这个宏.免得将来麻烦:).还有一个要考虑的,Unicode因为都是双字节的,所以读取的时候要注意,特别是在写文件的时候.首先,如果你要让你的文件成为Unicode文件,一定要在文件头加上0xFFFE.还有假如你用的是CFile 读写文件也要注意.如果你创建的是以非文本读写的..你应该考虑下面的问题:
CFile file;
CString htm;
if(!file.Open(filename,CFile::modeCreate|CFile::modeWrite))
//Open fail;
WORD wFlag=0xFEFF;
file.Write(&wFlag,2); //这是写Unicode文件标志头.
htm=_T("alkdsj flajdflajdlsfj")
file.Write(htm,htm.GetLength()+1);//这是错误的.应该把后面的长度这样才能把htm内容完整的写到文件里面.
//你可以自己考虑具体问题出现在哪.:).
接着,我再说一下关于Rich Edit控件的问题.因为是昨天刚遇到,所以今天就抽空帮别人解决了.他的问题是这样,在2000下,Unicode工程,RichEdit控件中输入小语种(日文,阿拉伯),无法用GetWindowText等函数获取.(获取的都是????).问题原因主要是因为:
(1).Rich Edit控件的版本太低,如RichEdit1.0(riched32.dll)就是不支持Unicode的.所以必须换成RichEdit2.0或者3.0(riched20.dll)的.所以在你的程序InitInstance()里面应该有下面代码:
HINSTANCE richEdit=::LoadLibrary(_T("riched20.dll"));
if(!richEdit)
AfxMessageBox(_T("Unable to load RichEdit2.0"));
AfxInitRichEdit();
(2).修改你的资源*.rc.打开rc文件.(Open->*.rc|Text方式|)..把原来的"RICHEDIT"改成"RICHEDIT20W"就可以了.如下:
CONTROL "",IDC_RICHEDIT1,"RICHEDIT20W",WS_BORDER |
这样,你利用GetWindowText,就可以得到你要的东西.也就是解决上面的问题。
这儿,我提供方法给那些没有用过RichEdit的人去构造这个控件.
A.当你在对话框中有了Rich Edit后..你编译时发现不能弹出对话框了.请在你的InitInstance()开头加上.AfxInitRichEdit();
B.如果你初始化的话..用下面方式(在OnInitDialog里面加)
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CHARFORMAT cfDefault;
memset(&cfDefault,0,sizeof(cfDefault));
cfDefault.cbSize=sizeof(cfDefault);
cfDefault.dwMask = CFM_FACE | CFM_SIZE |CFM_CHARSET | CFM_SPACING;
cfDefault.yHeight = 200;
cfDefault.bCharSet =ARABIC_CHARSET; //这是阿拉伯文的.这个好象不会影响控件.|我没研究清楚.不过是不可以用来让我们在非Unicode中获取文字的(或者没有上面解决方式).
strcpy(cfDefault.szFaceName,"Arial");
m_RichEdit1.SetDefaultCharFormat(cfDefault);//设置模式
c.如果要设置你的RichEdit响应事件消息(Envent)用:
CWnd* pWnd=GetDlgItem(IDC_RICHEDIT1);
CRichEditCtrl* pRich=(CRichEditCtrl*)(pWnd);
long nEvn=pRich->GetEventMask();
nEvn |=ENM_CHANGE; //响应OnChangeEdit函数.
pRich->SetEventMask(nEvn);
上面这些就是RichEdit入门.呵呵..

我这里有一个我测试时写的一个源程序.(很简单).可以用来输入多国语言(用的是RichEdit),并且获取显示.还有就是把他的Unicode代码显示出来.如果你要..请和我联系.我给你们发过去.(尽力而为).

这里我还要提出一些关于显示多国语言里面我曾经思考的问题..作为参考留给大家..至于实现,我这个低级选手暂时只能望尘莫及了.
(1):我当时曾考虑过如何在98下显示并获取的问题,当中用到了vb上面的一个RichText控件.那时侯发现,其实里面的文本可以用RTF格式取出来.但是RTF格式及其让人讨厌..所以当时是在没有办法的情况下(转悠了15天,急了),才考虑到准备把里面的内码值抠出来..呵呵.
(2):仔细分析情况,(我个人认为)为什么会得到???,是因为内码对应不正确的问题..或者字符集不正确.例如:我们现在的操作环境对应的是GB2312码(里面有中文繁体字,以及中文日文字,我们虽然可以输入,但却被认成了中文的相应字符).当你把控制面版里区域选项下面的预设默认值设为中文简体时,它将被选入系统.以至于影响到你的vc程序.导致了无法获取的问题.关于这内码还要提一点..如果你是用繁体的,由于他没有简体和日文字体,所以无法正确显示.这里要说明一下..设置这个预设默认值,是为了构造环境,如果你预设是日文,然后你的程序连接也用的是日文资源dll.那么你的程序即便是在中文Win平台下,用vc,在这时候也可以获得对日文的支持显示和处理功能.(其实就是相单于构造了日文操作平台).
(3):这个和支持多国语资源没有关系..如果你想在你资源里面多加日文资源,那只能保证你可以用 日文windows显示那些文字.但却不能共同显示中文,日文.我看到了<<用VC5_0实现软件中的多种语言支持>>文章..完全和这个是不一样的事情.而且它和我们常遇到的多国语言下载组件支持也没有任何关系.
(4):我的一个同事由于研究给软件安装输入法时,发现可以利用DHTML控件来支持呼叫和显示,无论是98还是2000.都可以,只不过里面内容都为网页,所以必须自己抠出来(我想不会很难).
好了,就写到这里,算是我这一段时间的总结,呵呵..如果你头晕了,千万要记得,我的交友申请,欢迎和我联系,一起研究,另外本人可能要转入多媒体了,也希望多交一些搞多煤体的朋友.
我的QQ:8802311.Email:xie_yong_ping@163.com.还有,很希望和那些想搞清楚在98下来支持这些显示的人,互相探讨.你们都可以在下面留下联系方式.
如果你要查询资料建议你到google里面寻找..最好的方式就是看看MSDN..然后对照..呵呵。.以后遇到这方面的麻烦。。大家可以找我了。。。
...全文
1427 151 打赏 收藏 转发到动态 举报
写回复
用AI写文章
151 条回复
切换为时间正序
请发表友善的回复…
发表回复
patient 2002-08-11
  • 打赏
  • 举报
回复
all for one/one for all

unfeeling@sina.com
venusfsh 2002-08-07
  • 打赏
  • 举报
回复
我正在被类似的问题困扰,给我一分好么?
samanthafsh@163.com
timaeus 2002-06-23
  • 打赏
  • 举报
回复
很希望能一起学习
timaeus@sohu.com
zeronow 2002-05-12
  • 打赏
  • 举报
回复
给我一份,谢谢。
wym2004@163.com
hlc01 2002-05-10
  • 打赏
  • 举报
回复
能给我发一份吗?
谢谢!
hlc01@mails.tsinghua.edu.cn
lgly2k 2002-05-09
  • 打赏
  • 举报
回复
lgly2k@sina.com
john1980 2002-05-09
  • 打赏
  • 举报
回复
ram128m@hotmail.com

3ks
Ago23 2002-05-09
  • 打赏
  • 举报
回复
插播紧急新闻

请关注:http://www.csdn.net/expert/topic/709/709609.xml?temp=.4640314
weblove 2002-05-09
  • 打赏
  • 举报
回复
看看,~~~~~~~~`
daniel2001 2002-05-09
  • 打赏
  • 举报
回复
z_danhua@hotmail.com
SmallBug2002 2002-05-09
  • 打赏
  • 举报
回复
麻烦你了
guanghui2002@263.net
wjj888 2002-05-09
  • 打赏
  • 举报
回复
wjj.888@163.net
gstan 2002-05-09
  • 打赏
  • 举报
回复
:)
lnk 2002-05-09
  • 打赏
  • 举报
回复
我要
rockentlnk@sohu.com
谢谢!
czgInCSDN 2002-05-08
  • 打赏
  • 举报
回复
谢谢你能给我一份
my_netinfo@sina.com
czgInCSDN 2002-05-08
  • 打赏
  • 举报
回复
给我一份吧,谢谢,如果我有什么好东东,我也会记得给你的,3x!
my_netinfo@sina.com
HawkClap 2002-05-08
  • 打赏
  • 举报
回复
yingzhenyi@21cn.com
谢谢
xzqi 2002-05-08
  • 打赏
  • 举报
回复
xzqi@263.net
//3x
fox2002 2002-05-08
  • 打赏
  • 举报
回复
powerbeyond@sina.com
相烦!
HighTech 2002-05-08
  • 打赏
  • 举报
回复
很好
加载更多回复(131)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧