2 qq 23842401 qq_23842401 于 2016.02.12 11:41 提问

多字符集使用后,界面风格变了

mfc使用多字符集后,界面风格变了,该如何解决,我找了一些方法,虽然界面风格变回来了,但是有一个警告,请问有没有比较好的方法能解决,没有警告

3个回答

devmiao
devmiao   Ds   Rxr 2016.02.13 09:08

有些国际市场以大字符集来使用日文和中文等语言。为了支持这些市场的编程,Microsoft 基础类库 (MFC) 支持以两种方式处理大字符集:
Unicode
多字节字符集 (MBCS)
Unicode 字符串的 MFC 支持
整个类库有条件地支持 Unicode 字符和字符串。特别是 CString 类也支持 Unicode。
注意 MFC 库的 Unicode 版本不会复制到硬盘上,除非您在“自定义”安装时选择它们。在其他类型的安装过程中不会复制它们。如果试图在没有 MFC Unicode 文件的情况下生成或运行 MFC Unicode 应用程序,可能会出现错误。
要将这些文件复制到硬盘上,请重新运行安装程序并单击“添加/移除功能”。单击“语言工具”,单击“Visual C++”并单击“Visual C++ 类和模板库”,然后选择“ATL MFC 共享库 Unicode”和“ATL MFC 静态库 Unicode”。这会将以下文件复制到硬盘上:
UAFXCW.LIB UAFXCW.PDB UAFXCWD.LIB UAFXCWD.PDB
MFCxxU.LIB MFCxxU.DBG MFCxxU.DLL MFCxxUD.LIB
MFCxxUD.PDB MFCxxUD.DLL MFCDxxUD.LIB MFCDxxUD.PDB
MFCDxxUD.DLL MFCNxxUD.LIB MFCNxxUD.PDB MFCNxxUD.DLL
MFCOxxUD.LIB MFCOxxUD.PDB MFCOxxUD.DLL

其中“xx”表示文件的版本号,例如“70”表示 7.0 版本。
CString 是基于 TCHAR 数据类型的。如果为程序的生成定义了符号 _UNICODE,则会将 TCHAR 定义为 wchar_t 类型(一个 16 位的字符编码类型);否则,会将它定义为 char(普通的 8 位字符编码)。于是,在 Unicode 下,CString 由 16 位字符组成。如果没有 Unicode,它们则由 char 类型的字符组成。
要完成应用程序的 Unicode 编程,还必须:
使用 _T 宏有条件地编写字符串的代码,使之可移植到 Unicode。
当传递字符串时,请注意函数参数要求的长度是以字符为单位还是以字节为单位的。如果在使用 Unicode 字符串,这一区别是很重要的。
使用 C 运行时字符串处理函数的可移植版本。
使用以下用于字符和字符指针的数据类型:
TCHAR 这里将使用 char。
LPTSTR 这里将使用 char*。
LPCTSTR 这里将使用 const char*。CString 提供 operator LPCTSTR 来在 CString 和 LPCTSTR 之间进行转换。
CString 还提供识别 Unicode 的构造函数,赋值运算符和比较运算符。
有关 Unicode 编程的相关信息,请参见 Unicode 和 MBCS 和 Unicode 主题。《运行时库参考》中定义了所有字符串处理函数的可移植版本。请参见类别国际化。
MBCS 字符串的 MFC 支持
类库还支持多字节字符集,特别是双字节字符集 (DBCS)。
在这一方案下,字符的宽度可以是一个字节,也可是两个字节。如果字符的宽度是两个字节,那么它的第一个字节就是一个特殊的“前导字节”,该字节是根据所使用的代码页从某个特定范围选定的。前导字节和“尾字节”合起来指定一个唯一的字符编码。
如果为程序的生成定义了符号 _MBCS,则类型 TCHAR(CString 基于该类型)将映射到 char。由您来决定 CString 中的哪些字节是前导字节,哪些字节是尾字节。C 运行时库提供函数来帮助您进行确定。
在 DBCS 下,给定的字符串可以包含所有的单字节 ANSI 字符、所有的双字节字符或两者的组合。这些可能性需要您在分析字符串(包括 CString 对象)时要备加小心。
注意 MFC 中的 Unicode 字符串序列化能够读取 Unicode 和 MBCS 字符串,而不论运行的是哪个版本的应用程序。正因为如此,数据文件在程序的 Unicode 和 MBCS 版本之间是可移植的。
CString 成员函数使用其调用的 C 运行时库特殊的“一般文本”版本,或使用识别 Unicode 的函数,如 lstrlen 或 lstrcpy。因此,如果 CString 函数通常情况下调用 strcmp,那么它会调用相应的一般文本函数 _tcscmp。根据符号 _MBCS 和 _UNICODE 定义方式的不同,_tcscmp 映射如下:
_MBCS 已定义 _mbscmp
_UNICODE 已定义 wcscmp
两者都未定义 strcmp
注意 符号 _MBCS 和 _UNICODE 是互相排斥的。
《运行时库参考》中对所有运行时字符串处理例程的一般文本函数映射作了详细的介绍。请参见类别国际化。
同样地,CString 成员函数是使用“一般”数据类型映射来实现的。要启用 MBCS 和 Unicode,MFC 使用 TCHAR 映射 char、LPTSTR 映射 char* 并使用 LPCTSTR 映射 const char*。这会得到 MBCS 或 Unicode 的正确映射。

oyljerry
oyljerry   Ds   Rxr 2016.02.12 16:10

是不是用到了一些宽字符资源。

91program
91program   Ds   Rxr 2016.02.12 13:37

建议你能将界面风格变化前与后的图片贴出来,还有警告的内容,否则别人不太方便帮你。

91program
91program 回复qq_23842401: 解决好就好!你可以自己回答一下,然后采纳自己的回答。
2 年多之前 回复
qq_23842401
qq_23842401 谢谢,我已解决
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
[MFC] 为什么选用多字节字符集后界面变丑了?
原来问题在stdafx.h中的这段代码上: #ifdef _UNICODE #if defined _M_IX86 #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='
解决MFC项目使用多字节字符集后软件界面风格发生改变的问题
本文描述了如何解决MFC项目使用多字节字符集后软件界面风格发生改变的问题,编程环境为VS2008 SP1。
MFC程序字符集改变后界面风格改变
VS2015 MFC 界面程序字符集由 Unicode 变为多字节后,界面风格变成了 VC6 MFC控件的风格了,如下图: 解决方法: 修改 stdafx.h 中自动生成的代码,去掉 #ifdef _UNICODE,如下: //#ifdef _UNICODE #if defined _M_IX86 #pragma comment(linker,"/manifestdependency:
vs2010 mfc项目配置属性的字符集为Unicode和多字节时,两者转换后使用的控件外观不一样
这是正常现象。你可以说这是VC的BUG,也可以说是多字符集考虑。资源文件rc中,对每个部分都有关于字符集的设定,大部分资源都是单一属性的,不能在其它字符集下使用。如果需要多字符集,甚至多国语言,你需要对每种字符集定制单独的资源。如果你的一个资源在所有字符集下都使用,其实是无法保障正确显示的。如果是新建项目的时候选择了多字节的话,那么运行前后设计的窗口风格会不一样,如下:  那么怎么做使得
warning C4603: “_WINDLL”: 未定义宏或在预编译头使用后定义发生改变
wxdebug.cpp(11) : warning C4603: “_WINDLL”: 未定义宏或在预编译头使用后定义发生改变    Posted on 2011-07-13 00:40 皓月云天 阅读(396) 评论(0)  编辑 收藏 解决方法 属性=》配置属性=》预编译头=》不使用预编译头   如果预编译头文件被正确使用时,它确实大大提高我们编程的效率(
Unicode与多字符集的区别、使用及相关函数
yi Unicode:
VS2013中添加对多字符集的支持
1.问题描述            VS2013中创建的工程默认采用Unicode编码,在使用VS2013编译旧版VC++程序时,经常提示Buildingan MFC project for a non-Unicode character set is deprecated。(VC6.0中工程默认采用对字符集编码) 1>C:\Program Files(x86)\MSBuild\Micro
StarUMLSetup中文版
starum stetup 中文版使用后starum stetup 中文版使用后
Visual Studio中C++关于Unicode字符集和多字节字符集
1.Unicode字符集     原本标准字符集为8位的ASCII码,但世界上的书写语言不能简单地用256个8位代码即一字节表示,就试更宽的值,例如16位值。这就是Unicode非常简单的原理。与混乱的256字符代码映射,以及含有一些单字节代码和一些双字节代码的双字节字符集不同,Unicode是统一的16位系统,这样就允许表示65536个字符。在这里会高兴地告诉你前128个Unicode字符(1
UNICODE与多字节字符集的区别及转换
一、一点历史 在计算机中字符通常并不是保存为图像,每个字符都是使用一个编码来表示的,而每个字符究竟使用哪个编码代表,要取决于使用哪个字符集(charset)。 在最初的时候,Internet上只有一种字符集——ANSI的ASCII字符集,它使用7 bits来表示一个字符,总共表示128个字符,其中包括了英文字母、数字、标点符号等常用字符。之后,又进行扩展,使用8 bits表示一个字符,可