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

这样就可以正常显示了:

再次感谢 峰哥!

wxwidgets mysql_关于wxWidgets控件出现乱码相关推荐

  1. wxWidgets 示例演示 wxWizard 控件

    wxWidgets 示例演示 wxWizard 控件 wxWidgets 示例演示 wxWizard 控件 wxWidgets 示例演示 wxWizard 控件 #include "wx/w ...

  2. QT控件出现乱码问题

    问题描述: 在使用qt控件显示汉字的时候会变成乱码,记录下来! 解决方式: QT5之前的方式: #include <QTextCodec>int main(int argc, char * ...

  3. gridview绑定数据mysql_【gridview控件】怎么绑定数据库并显示?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这是我在百度上搜出来的代码,结果我运行后还是不显示表中数据:(我做的过程是这样:新建一个aspx文件,然后托一个gridview和button控件,然后c ...

  4. wxWidgets:网格控件 wxWidgets 示例

    wxWidgets:网格控件 wxWidgets 示例 wxWidgets:网格控件 wxWidgets 示例 griddemo.h griddemo.cpp wxWidgets:网格控件 wxWid ...

  5. wxWidgets:使用控件

    wxWidgets:使用控件 wxWidgets:使用控件 介绍 添加文本控件 添加菜单栏 添加状态栏 使用的类 概括 wxWidgets:使用控件 介绍 在上一节中,我们查看了 wxWidgets ...

  6. wxWidgets:添加控件

    wxWidgets:添加控件 wxWidgets:添加控件 步骤 1 - TextFrame 定义 第 2 步 - TextFrame 实现 wxWidgets:添加控件 步骤 1 - TextFra ...

  7. wxWidgets之wxGrid控件

    1. 介绍 wxGrid控件时wxWidgets界面库中内置的网格控件. 通经常使用来显示表格数据.该控件拥有强大的功能.开发人员可依据自己的需求对其进行定制. 2. 经常使用API 构造函数:wxG ...

  8. wxWidgets教程(14)——书签控件wxBookCtrl

    一.wxBookCtrlBase介绍 这是个抽象类,有七个子类,他们的成员函数基本差不多,分别: wxAuiNotebook wxNotebook wxChoicebook wxListbook wx ...

  9. 解决Visual Studio 找不到报表控件、rdlc中文乱码

    找回报表控件 运行安装程序中的 ..\packages\Reporting Services\RVAddon.msi 工具栏,右键选择ReportViewer,注意选择的版本 如果不能编辑报表文件(. ...

最新文章

  1. 附录7:SciPy实例记录
  2. json数据在前端(javascript)和后端(php)转换
  3. 四年级计算机笔试题,四年级计算机考试卷.doc
  4. jquery php联动,jQuery结合PHP+MySQL实现二级联动下拉列表[实例]
  5. 【电路仿真】基于simulink全数字锁相环设计【含Matlab源码 340期】
  6. 使用windows2003架设邮件服务器
  7. 【Flutter 问题系列第 54 篇】Flutter 引入阿里矢量图标库的详细图文教程
  8. GRE阅读高频机经原文及答案之鸟叫研究
  9. 腾讯帮助警方破获 30+ 起吃鸡外挂案件;Java 领域的五大发展预测
  10. java saxreader_java解析XML文件---SAXReader
  11. 基于FBMC的调制解调系统
  12. 洛马公司获得阿联酋“萨德”导弹防御系统支持合同-我爱无人机网
  13. 电脑知识与技术杂志电脑知识与技术杂志社电脑知识与技术编辑部2022年第15期目录
  14. Easyui项目之添加购物车、清空购物车
  15. 好用的oier命令行工具(自创的)
  16. oracle 11g从DBF文件恢复数据
  17. edrawmax 保存图片有水印
  18. 中枢神经的运动控制理论,神经网络运动控制方式
  19. DeFi是什么?DeFi对未来意味着什么?
  20. 生物网络中基于节点相似度的链路预测图卷积

热门文章

  1. 用计算机娱乐教学思路,第5课 用计算机娱乐”教学设计.pdf
  2. http状态码查询 http_code状态码大全《详细》
  3. 多组学整合2连发,肠道研究新突破:人参残渣有大用
  4. 2022年建筑三类人员C1证考试题,建筑三类人员考试搜题
  5. the request was rejected because no multipart boundary was found
  6. Qt操作SQLite数据库的三种方式
  7. 考研上岸学长的备考经验心得
  8. MPLS隧道——PE与CE之间运行不同路由协议的情况分析
  9. display 基础用法详解
  10. Matlab的disp()函数