当前位置: 首页 > 编程笔记 >

在Visual Studio上构建C++的GUI框架wxWidgets的开发环境

洪和风
2023-03-14
本文向大家介绍在Visual Studio上构建C++的GUI框架wxWidgets的开发环境,包括了在Visual Studio上构建C++的GUI框架wxWidgets的开发环境的使用技巧和注意事项,需要的朋友参考一下

本文使用的Unicode+DLL+Debug的方式,因为不想最后生成的exe文件太大。

环境搭建步骤如下:

1、下载wxWidgets包:

登录wxWidgets的下载页面:http://www.wxwidgets.org/downloads
下载最新的Stable Release稳定版,我这里用旧的2.8.12版作演示。

2、将wxMSW-2.8.12.zip解压到D盘根目录下。

转到D:\wxMSW-2.8.12\build\msw目录,用VS2005打开wx.dsw,会有提示转换项目:

选择“全是”。

3、进入到VS2005的界面,在下图所示区域选择DLL Unicode Debug:

4、按F7生成解决方案,这个操作会在D:\wxMSW-2.8.12\lib下生成一个“vc_dll”文件夹,里面是我们需要的dll和lib。

不过第一次执行会提示有一些失败的。因为有一些生成项依赖于其他的生成项。此时继续按F7,直到提示有1个失败。此时,再按F7也是没用的,看看错误提示:

1>LINK : fatal error LNK1104: 无法打开文件“..\..\lib\vc_dll\wxbase28ud_odbc.lib”

这个wxbase28ud_odbc.lib在D:\wxMSW-2.8.12\lib\vc_dll下并不存在。此时可以在上图中选择Unicode Debug,之后在左边选择odbc,右击,选择生成,会在D:\wxMSW-2.8.12\lib\vc_lib目录下生成wxbase28ud_odbc.lib,将这个文件拷到D:\wxMSW-2.8.12\lib\vc_dll目录下,在上图中将选项选回DLL Unicode Debug,再按F7,这样所有的文件都生成了。

这样,在生成了14个dll文件和18个lib文件。

5、在菜单栏依次选择 工具——选项,在打开的窗口依次选择 项目和解决方案——VC++目录。

5.1 在“包含文件”中添加:

D:\wxMSW-2.8.12\include
D:\wxMSW-2.8.12\include\msvc

5.2 在“库文件”中添加:

D:\wxMSW-2.8.12\lib\vc_dll
D:\wxMSW-2.8.12\lib\vc_dll\mswud

如下图:

6、关闭原来的工程,新建一个空的Win32项目,名称为wxTest。注意,要是空的项目。

为这个项目添加一个C++文件Test.cpp,内容为D:\wxMSW-2.8.12\samples\minimal\minimal.cpp的内容。

7、配置项目:

选中这个项目,在菜单栏依次选择 项目——wxTest属性,在打开的窗口配置属性:

7.1 在“配置属性 —— C/C++ —— 预处理器”中的“预处理器定义”添加:

_UNICODE;WXUSINGDLL

7.2 在“配置属性 —— C/C++ —— 运行时库”中的“运行时库”选择:

多线程调试 DLL (/MDd)

7.3 在“配置属性 —— 链接器 —— 输入”中的“附加依赖库”添加:

wxbase28ud.lib
wxbase28ud_net.lib
wxbase28ud_odbc.lib
wxbase28ud_xml.lib
wxexpatd.lib
wxjpegd.lib
wxmsw28ud_adv.lib
wxmsw28ud_aui.lib
wxmsw28ud_core.lib
wxmsw28ud_html.lib
wxmsw28ud_media.lib
wxmsw28ud_qa.lib
wxmsw28ud_richtext.lib
wxmsw28ud_xrc.lib
wxpngd.lib
wxregexud.lib
wxtiffd.lib
wxzlibd.lib

这里是一股脑全加上了。

8、生成解决方案,是成功的。按F5运行这个程序,会提示计算机中丢失wxmsw28ud_core_vc_custom.dll,从D:\wxMSW-2.8.12\lib\vc_dll中把这个文件拷到生成的exe文件所在的目录下。再次运行,会提示丢失wxbase28ud_vc_custom.dll,再把这个文件拷到生成的exe文件所在的目录下。此时再运行就可以正确执行了:

关于wxWidgets控件出现乱码问题的解决
这两天在用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);

这样就可以正常显示了:

 类似资料:
  • 本文向大家介绍Windows下Java+MyBatis框架+MySQL的开发环境搭建教程,包括了Windows下Java+MyBatis框架+MySQL的开发环境搭建教程的使用技巧和注意事项,需要的朋友参考一下 MyBatis是一个Java持久化框架,它通过XML描述符或注解把对象与存储过程或SQL语句关联起来。 MyBatis是在Apache许可证 2.0下分发的自由软件,是iBATIS 3.0

  • 依照以下操作,你可在Mac,Linux(Debia/Ubuntu)上搭建PPMessage开发环境。 下载PPMessage源代码 首先需要安装git,然后从github下载源代码,假设保存路径为~/Documents/ppmessage。 git clone git@github.com:PPMESSAGE/ppmessage.git 安装依赖软件 进入~/Documents/ppmessage

  • 我想知道这种情况下的最佳实践是什么: 我正在模拟一个电梯系统,该系统目前正在将所有输出转储到控制台。这不容易追踪,而且很难想象每层楼的问题状态以及当前算法的效率。设置如下: 一对人-生产者/消费者创建随机的人,并将他们放置在每个楼层的特定目的地。每一层都有供人们上下活动的问讯处。电梯与每层楼和一个调度器交互,以决定下一步去哪里以及接谁。 将此设置表示为gui时,将每个线程/对象的当前状态转换为gu

  • 9.14 一面 1h 1、项目介绍 2、RocketMQ和Kafka的区别 3、RocketMQ是如何保证消息顺序性的 4、RocketMQ的消息是如何存储的,对应的文件大小限制是多少 5、了解的限流中间件 6、介绍漏桶和令牌桶算法 7、虚拟内存 8、select和epoll的区别 9、虚函数如何实现 10、手撕:二叉树的最大宽度(lc662) 9.20 二面 1h 1、项目深挖 2、手撕:设计一

  • "One does not live by bread alone,but by every word that comes from the mouth of God" --(MATTHEW4:4) python开发框架 不管是python,还是php,亦或别的做web项目的语言,乃至于做其它非web项目的开发,一般都要用到一个称之为什么什么框架的东西。 框架的基本概念 开发这对框架的认识,由于

  • 本文向大家介绍推荐8款常用的Python GUI图形界面开发框架,包括了推荐8款常用的Python GUI图形界面开发框架的使用技巧和注意事项,需要的朋友参考一下 作为Python开发者,你迟早都会用到图形用户界面来开发应用。本文将推荐一些 Python GUI 框架,希望对你有所帮助,如果你有其他更好的选择,欢迎在评论区留言。 Python 的 UI 开发工具包 Kivy Kivy是一个开源工具