刚才闲逛,看到http://blog.joycode.com/mvm/posts/21261.aspx,说程序员搞懂的问题过几天就忘了,年级大点就完蛋了,有点怕怕,赶快把前几天搞懂的一个多语言的问题写下来,说不定将来还有用呢
问题是这样的,要在窗体(控件)上混合显示CJK的字符
1.要在win2000平台及后续平台上搞,非常简单,把整个程序编译为Unicode版本就可以了,然后字符串(Unicode)里面,前一个是日文,后一个是中文,都没关系,都可以正确显示了.举个例子SetWindowText以后,就可以正确看到了。
2.如果不想把整个程序编译为Unicode(也就是不想定义_Unicode,Unicode宏,也就是不想在VC2003的工程属性-〉常规-〉字符集中选Unicode),那么直接使用CreateWindowW创建窗体,然后函数调用的时候调用相应的W版本就可以,比如调用SetWindowTextW传Unicode字符串就ok,当然你也可以调用A的版本,然后win32窗口子系统会把你传入的字符转化为Unicode字符,然后调用W的版本。
3.如果你使用MFC,为了调用CreateWindowW,你可以重载CreateEx(放心,这是一个虚函数),在其中调用CreateWindowExW。
4.不把窗体创建为Unicode窗体(调用W版的函数创建),而单纯调用SetWindowTextW之类的函数,想混和显示CJK字符,好像不行,好像窗口会调用IsWindowUnicode偷偷摸摸做一些事情。
5.在win98下,整个世界就变了,MSLU只是让W版的函数正确运行,其实基本上没干活,而且问题多多,所以MSLU个人觉得,毫无用处,一切靠自己。
6.在win98下,所有的操作依赖于函数TextOut,ExtTextOut,这个函数"Included in Windows 95 and later,Implemented as Unicode and ANSI versions on all platforms."
7.在win98下,你需要重写所有的文字显示操作,然后使用TextOutW显示Unicode字符。其实如果做一个好看的界面,相信所有的文字显示也基本上都是自己做的。
8.ok,我们那个程序需要在win98,win2000上同时工作,于是我们重写了所有文字显示操作,统统调用TextOutW。
9.如果一个字符串,前3个字符是繁体中文,后3个是日文,那么你需要用繁体中文的字体TextOutW前3个字符,然后SelectObject日文字体,TextOutW后3个字符。
10.所有的工作量非常大,其中Edit控件工作量最大,如果大家有什么好办法,请指教。