背景:我们在OSGEARTH上的项目已经快要完成,但苦于还没有找到一个合适的界面框架去和交互。在界面框架方面,qt已经做的成熟了,但我们考虑到一些问题,不打算用qt来做这个界面,于是便对一些现有的界面框架做了一些调研分析,首先便是Wxwidgets。
关键词:界面框架;Wxwidgets
一、 什么是Wxwidgets
wxWidgets是一个开源的跨平台的C++构架库(framework),它可以提供GUI(图形用户界面)和其它工具。wxWidgets除了可以用于开发“有界面”的程序,还提供对图形、多媒体、网络等常见领域应用的支持。
wxWidgets是开源的,无论对于个人还是对于商业应用都是免费的。wxWidgets可以支持现今几乎所有操作系统,包括对掌上电脑的支持。wxWidgets社区快速稳健成长,其周边工具也越来越多。wxWidgets支持各种主流的编译器,通过“重新编译”的方式支持软件的移植。wxWidgets尽可能的使用目标系统“原生的”的GUI样式,界面与环境异常和谐。
二、 Wxwidgets的下载和安装
1.wxWidgets的官网在http://www.wxwidgets.orgs/,下载页面是http://www.wxwidgets.org/downloads/。作为Windows用户,从下载页面下载如下画圈的两个文件。Windows.ZIP是wxWidgets的源代码,Manual(HTML).zip则是在学习过程中最重要的参考。
2.下载后,将文件Windows.ZIP解压缩到X:/wxWidgets-3.0.0中,X代表你选择的盘符。
3.进入X:\wxWidgets-3.0.0\build\msw中用VS2010打开wx.dsw,等待工程从VC6到VS2010的转换完成。
4.右击解决方案,点击批生成,勾选所有Debug和Release(可根据需要选择),点击生成进行编译。
5.编译成功后,wxWidgets-3.0.0\lib\vc_lib目录如下所示,已生成所需库文件,其中u表示Release版本,ud表示Debug版本。
三、 vs下的配置
1. 新建Win32控制台应用程序,应用程序类型勾选Windows应用程序或控制台应用程序。新建源文件test.cc,粘贴以下代码。
// wxWidgets "Hello world" Program
// For compilers that support precompilation, includes "wx/wx.h".
#include
#ifndef WX_PRECOMP
#include
#endif
class MyApp : public wxApp
{
public:
virtual bool OnInit();
};
class MyFrame : public wxFrame
{
public:
MyFrame(const wxString&title, const wxPoint& pos, const wxSize& size);
private:
voidOnHello(wxCommandEvent& event);
voidOnExit(wxCommandEvent& event);
void OnAbout(wxCommandEvent&event);
wxDECLARE_EVENT_TABLE();
};
enum
{
ID_Hello = 1
};
wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_Hello, MyFrame::OnHello)
EVT_MENU(wxID_EXIT, MyFrame::OnExit)
EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
wxEND_EVENT_TABLE()
wxIMPLEMENT_APP(MyApp);
bool MyApp::OnInit()
{
//MyFrame *frame = newMyFrame("Hello World", wxPoint(50, 50), wxSize(450, 340));
MyFrame *frame = newMyFrame("Hello World", wxDefaultPosition, wxDefaultSize);
frame->Show(true);
return true;
}
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, constwxSize& size)
: wxFrame(NULL, wxID_ANY, title, pos, size)
{
wxMenu *menuFile = newwxMenu;
menuFile->Append(ID_Hello,"&Hello...\tCtrl-H",
"Help stringshown in status bar for this menu item");
menuFile->AppendSeparator();
menuFile->Append(wxID_EXIT);
wxMenu *menuHelp = newwxMenu;
menuHelp->Append(wxID_ABOUT);
wxMenuBar *menuBar = newwxMenuBar;
menuBar->Append(menuFile,"&File");
menuBar->Append(menuHelp,"&Help");
SetMenuBar(menuBar);
CreateStatusBar();
SetStatusText("Welcometo wxWidgets!");
}
void MyFrame::OnExit(wxCommandEvent& event)
{
Close(true);
}
void MyFrame::OnAbout(wxCommandEvent& event)
{
wxMessageBox("This is awxWidgets' Hello world sample",
"About HelloWorld", wxOK | wxICON_INFORMATION);
}
void MyFrame::OnHello(wxCommandEvent& event)
{
wxLogMessage("Helloworld from wxWidgets!");
}
2.包含目录:右击项目,打开项目属性页,配置一项选择所有配置配置属性->C/C++->常规->附加包含目录 中添加:
C:\wxWidgets-3.0.0\include
C:\wxWidgets-3.0.0\lib\vc_lib\mswu
3.添加库目录:配置属性->链接器->常规->附加库目录 中添加:
C:\wxWidgets-3.0.0\lib\vc_lib
4.MFC的使用:配置属性->MFC的使用:使用标准Windows库
5. 添加依赖项:配置属性->链接器->输入->附加依赖项按照如下规则添加:
A、配置一项改为Release
wxbase30u.lib
wxbase30u_net.lib
wxbase30u_xml.lib
wxexpat.lib
wxjpeg.lib
wxmsw30u_adv.lib
wxmsw30u_aui.lib
wxmsw30u_core.lib
wxmsw30u_gl.lib
wxmsw30u_html.lib
wxmsw30u_media.lib
wxmsw30u_propgrid.lib
wxmsw30u_qa.lib
wxmsw30u_ribbon.lib
wxmsw30u_richtext.lib
wxmsw30u_stc.lib
wxmsw30u_xrc.lib
wxpng.lib
wxregexu.lib
wxscintilla.lib
wxtiff.lib
wxzlib.lib
comctl32.lib
rpcrt4.lib
B、 配置一项改为Debug
wxbase30ud_net.lib
wxmsw30ud_html.lib
wxbase30ud_xml.lib
wxmsw30ud_adv.lib
wxmsw30ud_aui.lib
wxmsw30ud_gl.lib
wxmsw30ud_media.lib
wxmsw30ud_propgrid.lib
wxmsw30ud_qa.lib
wxmsw30ud_ribbon.lib
wxmsw30ud_richtext.lib
wxmsw30ud_stc.lib
wxmsw30ud_xrc.lib
wxscintillad.lib
wxmsw30ud_core.lib
wxbase30ud.lib
wxtiffd.lib
wxjpegd.lib
wxpngd.lib
wxzlibd.lib
wxexpatd.lib
winmm.lib
comctl32.lib
rpcrt4.lib
wsock32.lib
odbc32.lib
6.预处理器定义:
配置一项改为Debug
配置属性->C/C++->预处理器->预处理器定义 中添加:
__WXMSW__
__WXDEBUG__
7.保存运行,运行结果如下:
四、 Wxwidgets的优势和不足
优势:
1、Wxwidgets无论对于个人还是对于商业应用都是免费的!
2、 他是跨平台的gui库,支持的操作系统很全面,甚至支持pda(最新版本【3.0.1】支持iOS,可以在下载的源码包中找到wxWidgets-3.0.1.tar.bz2\wxWidgets-3.0.1\build\osx\wxiphone.xcodeproj)。
3、 wxwidgets提供的gui是大量使用宏的,这就意味着它是在尽可能的使用目标系统native的gui样式。
4、 它支持的编译器也很多,而且borland也曾声明将在c++builderx2里边提供对wxidgets的支持——预览版都出来了。
不足:
首先官方文档不全(至少我觉得个官方的help远远不够我的菜鸟需求,大部分都是网络上零散的教程),对STL的支持不够,特别是没有源代码的开发速度快;没有强大全面的rad工具;还没有形成很浓的产业气候,等等。
五、 前景与可行性
相比MFC,wxWidgets有着跨平台和开源免费的优势;相比Qt,wxWidgets的语法是完全C++的,不像Qt的Q_OBJECT宏需要用moc单独编译出一个cpp文件再编译。使用wxWidgets开发的程序有很多,比较著名的有跨平台3D游戏0.A.D, 集成编程工具Code::Blocks和CodeLite,文件传输工具filezilla。类似于Qt的QtDesigner界面编译器,wxWidgets也有相应的界面开发工具,如wxSmith和wxFormBuilder,有着非常友好人机交互界面,实现界面可视化开发。但是,Wxwidgets的界面框架是跟随系统特征的,太过单一,如果要实现与系统不一致的框架,需要非常复杂的实现机制。