文档章节

关于wxWidgets控件出现乱码

双子座
 双子座
发布于 2012/10/12 20:26
字数 662
阅读 967
收藏 0

这两天在用wxWidgets做一个小程序,突然遇到了一个控件显示出现乱码的问题。

首先声明:我用的编译器是Visual Studio 2005,wxWidgets版本是2.8.12,下面的解决方法不一定对所有的平台都有效。

我们知道,wxWidgets中控件显示字符串一般都是用wxString,例如下面的一小段代码创建并显示一个按钮:

// 创建一个按钮,显示名称就是“按钮”
wxButton* oneButton = new wxButton( itemFrame1, ID_BUTTON, wxT("按钮"), wxDefaultPosition, wxDefaultSize, 0);
// 把这个按钮放在一个BoxSizer中
itemBoxSizer->Add(oneButton, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5);

上面的代码没有错误,显示截图如下:

但是,很多情况下,我们想要显示的控件的标签是先放在char *中的,我们当然要先转换成wxString,转换的方法有很多,比如用wxString::FromUTF8(),或者可以定义一个wxString对象,调用Printf方法。然而,两种方法都不行。

如下代码:

char *label = "按钮";
wxString wxLabel;
wxLabel.Printf(wxT("%s"), label);
wxButton* oneButton = new wxButton( itemFrame1, ID_BUTTON, wxLabel, wxDefaultPosition, wxDefaultSize, 0);
itemBoxSizer->Add(oneButton, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5);

得到的结果是

而如果使用wxString::FromUTF8(),则控件中根本没有显示的标签。

谷歌了很久都没找到解决办法,后来突然想到,以前做一个GTK项目的时候遇到过中文出现乱码的问题,当时峰哥给我发了一个将字符串转换编码的函数,当然,GTK有自带的函数可以进行转换,是g_locale_to_utf8。而wxWidgets貌似没有这样的函数。峰哥给我的函数正好派上用场。

峰哥给我的函数是ANSI与UTF8相互转换,为什么有用,是因为VS默认的编码是ANSI。我今天在谷歌的时候,见到有人说将源代码的编码格式改成UTF8,在VS的 文件——高级保存选项中,我试过了,没用。但是用了峰哥给我的函数,效果就不一样了。

峰哥的代码是:

BOOL ansi_to_utf8(char * lpcszStr, char** lpwszStr)
{       
    WCHAR* strA;    
    int i= MultiByteToWideChar(CP_ACP, 0, (char*)lpcszStr, -1, NULL, 0);    
    strA = (WCHAR *)malloc(sizeof(WCHAR) * i);    
    MultiByteToWideChar(CP_ACP, 0, (char* )lpcszStr, -1, strA, i*2);    
    i= WideCharToMultiByte(CP_UTF8, 0, strA, -1, NULL, 0, NULL, NULL);
    *lpwszStr = (char *)malloc(i);
    WideCharToMultiByte(CP_UTF8, 0, strA, -1, *lpwszStr, i, NULL, NULL);        
    return TRUE;
}

可以把这段代码放在程序的某个头文件中,作为一个成员函数。别忘了包含windows.h头文件。

再修改上面的第二段代码如下:

char *label = "按钮2";
char *label_utf8;
this->ansi_to_utf8(label, &label_utf8);
wxButton* oneButton = new wxButton( itemFrame1, ID_BUTTON, wxString::FromUTF8(label_utf8), wxDefaultPosition, wxDefaultSize, 0);
free(label_utf8);
itemBoxSizer->Add(oneButton, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5);

这样就可以正常显示了:

再次感谢 峰哥

© 著作权归作者所有

双子座
粉丝 540
博文 78
码字总数 61009
作品 0
南京
程序员
私信 提问
wxwidgets开发组件制作为ActiveX控件

主要思路: 在MFC中如果要创建wxwidgets 的窗口为MFC窗口的子窗口就要把MFC的窗口封装成wxwindow,即做一个虚拟窗口。同理如果要在wxwidgets上使用MFC窗口并把wxwidgets窗口作为MFC窗口的父窗...

流逝的风
2012/04/29
1K
4
配置winxp+eclispe cdt+WxWidgets 环境时的错误

D:/wxWidgets-2.8.11/build/msw/../../src/common/log.cpp:773: multiple definition of `wxSysErrorMsg(unsigned long)' D:\wxWidgets-2.8.11\lib\gcc_lib/libwxbase28u.a(baselib_log.o):l......

wolf2999
2010/06/23
484
2
wxWidgets与其他工具库的比较(下)

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 GTK+ www.gtk.org; http://www.gtkmm.org); Kylix Lazarus Ultimate++ http:...

nardoo
2012/09/06
234
0
《wxWidgets跨平台程序开发》在国内出版

《wxWidgets跨平台程序开发》日前已由机械工业出版社出版,这是国内第一部介绍wxWidgets的中文力作,旨在更好地促进wxWidgets在国内的推广应用,解决了国内学习wxWidgets但却没有系统介绍wxW...

fanfanzhang
2012/12/01
2.1K
7
wxWidgets3.0.0的静态编译

对于GUI编程,最早使用过VC6的MFC,之后使用过GTK,Java的Swing,前一段时间还摆弄过纯Windows原生的Win32 API,现在则开始折腾wxWidgets,但是这些技术的学习了解并没有做出像样的软件,基本都停留...

棋有此理
2013/12/11
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

云栖干货回顾 | 更强大的实时数仓构建能力!分析型数据库PostgreSQL 6.0新特性解读

阿里云 AnalyticDB for PostgreSQL 为采用MPP架构的分布式集群数据库,完备支持SQL 2003,部分兼容Oracle语法,支持PL/SQL存储过程,触发器,支持标准数据库事务ACID。AnalyticDB PG通过行存...

大涛学弟
15分钟前
4
0
TL138/1808/6748-EasyEVM开发板硬件CPU、FLASH、RAM

TL138/1808/6748-EasyEVM是广州创龙基于SOM-TL138/SOM-TL1808/SOM-TL6748核心板开发的一款开发板。由于SOM-TL138/SOM-TL1808/SOM-TL6748核心板管脚兼容,所以此三个核心板共用同一个底板。开...

Tronlong创龙
20分钟前
3
0
开普勒平台开源版

https://github.com/kplcloud/kplcloud

perofu
23分钟前
4
0
昨天,这项阿里技术再获世界级科技大奖!

第六届世界互联网大会来了!千年水乡古镇乌镇又一次吸引了全世界的目光。 昨天,阿里云自研数据库POLARDB 在会上当选世界互联网领先科技成果。POLARDB解决了企业在云时代的数据库难题,帮助企...

阿里云官方博客
23分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部