博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于wxWidgets控件出现乱码
阅读量:5847 次
发布时间:2019-06-19

本文共 1988 字,大约阅读时间需要 6 分钟。

hot3.png

这两天在用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);

这样就可以正常显示了:

再次感谢 !

转载于:https://my.oschina.net/plumsoft/blog/82798

你可能感兴趣的文章
postdrop: create file maildrop/xxx: Permission denied
查看>>
(转)关于TCP封包、粘包、半包
查看>>
[z]如何在一台windows主机上安装多个mysql服务
查看>>
wordpress主题制作常用基本的模板及说明
查看>>
cocos2d-x学习日志(10) --射击游戏(喵星战争)
查看>>
乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)
查看>>
轻量级router[类似laravel router]
查看>>
在android创建bitmap避免低记忆法
查看>>
php 数组排序
查看>>
CPLD/FPGA基础知识(一)——FPGA的结构
查看>>
WPF快速精通版
查看>>
eclipse下遇到 无法解析类型 javax.servlet.http.HttpServletRequest
查看>>
jboss5优化
查看>>
北风网VIP6级学习视频地址
查看>>
PHP基础之 file_get_contents() 函数
查看>>
用platformio编写arduino程序
查看>>
InnoDB主键设计
查看>>
JS阻止链接跳转代码
查看>>
存储过程语法
查看>>
tomcat 内存大小配置
查看>>