**************************************我是一个愚蠢的程序猿******************************
理论搞不懂,编程搞不定。天天穷开心,幻想当个人。
日子一天天过,编程一次次改。话说编程习惯这个东东还是最初养成好,现在
一把年纪被一些坏的编程习惯搞得头都大了。随着年岁的增长,这记忆也跟着
变老,所以只能记录下来喽。
*************************************************************************************************
一、准备wxWidgets
wxWidgets(Windows and X widgets,最早命名为wxWindows[1])是一个开放源代码且跨平台的对象工具集(widget toolkit),其库可用来创建基本的图形用户界面(GUI)。wxWidgets由Julian Smart于1992年首先开发。
wxWidgets标榜使用其库所开发的软件只需要对源代码做少量更改(或者完全不用更改),就能在各种不同的作业平台上编译并运行。目前可支持Windows、Apple Macintosh、Linux/Unix(转译成X11、GTK+、Motif等库)、OpenVMS、以及OS/2。
wxWidgets的官网是http://www.wxwidgets.org/downloads/,其中有各个版本的源代码,有兴趣的话可以自己在网上找找教程进行编译学习。
同时,wxWidgets在SourceForge网站上也挂出了一些预编译好的库等,这是链接http://sourceforge.net/projects/wxwindows/files/2.9.4/binaries/,可以直接下载编译好的lib和dll。wxMSW-2.9.4_vc100_Dev.7z中包含了wx/setup.h头文件,链接库和动态库。wxWidgets-2.9.4_Headers.7z包含了必要的头文件,基本下载这两个文件就可以满足要求了。
二、配置vs2010的wxWidgets开发环境
环境的配置其实和一般的项目环境配置类似,添加头文件目录、库目录和添加链接器。但是这里需要注意的是,最好直接建立一个Windows application项目,这样在后边的测试中会方便一点。
1.新建项目:建议选择Win32 Console Applictaion,然后选择空项目即可。
2.配置头文件目录和库目录:
需要注意的是,在头文件包含目录中需要添加两个目录:wxWidgets-2.9.4-vc100/include 和wxWidgets-2.9.4/lib/vc100_dll/mswu
库目录需要添加wxWidgets-2.9.4-vc100/include 和wxWidgets-2.9.4/lib/vc100_dll。
3.需要进行一些预编译项处理设置:
最为主要的是在属性->c/c++->预处理器->预处理器定义中添加WXUSINGDLL,这是因为使用到了动态链接库,否则在编译的时候会进行报错。报错的类型如下代码:
minimal.obj : error LNK2001: unresolved external symbol "protected: static struct wxEventTable const wxFrame::sm_eventTable" (?sm_eventTable@wxFrame@@1UwxEventTable@@B) 1>minimal.obj : error LNK2001: unresolved external symbol "protected: static class wxAppConsole * wxAppConsoleBase::ms_appInstance" (?ms_appInstance@wxAppConsoleBase@@1PAVwxAppConsole@@A) 1>minimal.obj : error LNK2001: unresolved external symbol "class wxMBConv * wxConvLibcPtr" (?wxConvLibcPtr@@3PAVwxMBConv@@A) 1>minimal.obj : error LNK2001: unresolved external symbol "public: static unsigned int const wxString::npos" (?npos@wxString@@2IB) 1>minimal.obj : error LNK2001: unresolved external symbol "char const * const wxStatusLineNameStr" (?wxStatusLineNameStr@@3QBDB) 1>minimal.obj : error LNK2001: unresolved external symbol "class wxPoint const wxDefaultPosition" (?wxDefaultPosition@@3VwxPoint@@B) 1>minimal.obj : error LNK2001: unresolved external symbol "class wxSize const wxDefaultSize" (?wxDefaultSize@@3VwxSize@@B) 1>minimal.obj : error LNK2001: unresolved external symbol "char const * const wxFrameNameStr" (?wxFrameNameStr@@3QBDB) 1>minimal.obj : error LNK2001: unresolved external symbol "bool const wxFalse" (?wxFalse@@3_NB) 1>minimal.obj : error LNK2001: unresolved external symbol "void (__cdecl* wxTheAssertHandler)(class wxString const &,int,class wxString const &,class wxString const &,class wxString const &)" (?wxTheAssertHandler@@3P6AXABVwxString@@H000@ZA) 1>minimal.obj : error LNK2001: unresolved external symbol "int const wxEVT_NULL" (?wxEVT_NULL@@3HB) 1>minimal.obj : error LNK2001: unresolved external symbol "class wxEventTypeTag<class wxCommandEvent> const wxEVT_COMMAND_MENU_SELECTED" (?wxEVT_COMMAND_MENU_SELECTED@@3V?$wxEventTypeTag@VwxCommandEvent@@@@B) 1>minimal.obj : error LNK2001: unresolved external symbol "protected: static class wxAppConsole * (__cdecl* wxAppConsoleBase::ms_appInitFn)(void)" (?ms_appInitFn@wxAppConsoleBase@@1P6APAVwxAppConsole@@XZA) 1>C:\Users\Nebojsa i Nenad\Documents\Visual Studio 2010\Projects\wxWidgets-Minimal\Debug\wxWidgets-Minimal.exe : fatal error LNK1120: 13 unresolved externals遇到这种问题的时候,你就得考虑是不是忘了添加上面的预处理定义了。
4.添加链接库
上面已经添加了库目录,这时候需要再向链接器中添加相应的库名,wxWidgets使用的库名有下面这些:
wxmsw29ud_stc.lib wxmsw29ud_adv.lib wxmsw29ud_core.lib wxbase29ud.lib wxmsw29ud_webview.lib wxscintillad.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib wininet.lib上面的这些库名的添加可以根据自己的需要进行刷选,如果觉得麻烦,那就直接拷贝全部粘贴吧。
至此,配置过程就算结束了。下面就可以进行测试了。
三、代码测试
wxWidgets的example文件夹中存放着样例,下面给出一个简单的测试程序:
// wxWidgets "Hello world" Program // For compilers that support precompilation, includes "wx/wx.h". #include <wx/wxprec.h> #ifndef WX_PRECOMP #include <wx/wx.h> #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: void OnHello(wxCommandEvent& event); void OnExit(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 = new MyFrame( "Hello World", wxPoint(50, 50), wxSize(450, 340) ); frame->Show( true ); return true; } MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame(NULL, wxID_ANY, title, pos, size) { wxMenu *menuFile = new wxMenu; menuFile->Append(ID_Hello, "&Hello...\tCtrl-H", "Help string shown in status bar for this menu item"); menuFile->AppendSeparator(); menuFile->Append(wxID_EXIT); wxMenu *menuHelp = new wxMenu; menuHelp->Append(wxID_ABOUT); wxMenuBar *menuBar = new wxMenuBar; menuBar->Append( menuFile, "&File" ); menuBar->Append( menuHelp, "&Help" ); SetMenuBar( menuBar ); CreateStatusBar(); SetStatusText( "Welcome to wxWidgets!" ); } void MyFrame::OnExit(wxCommandEvent& event) { Close( true ); } void MyFrame::OnAbout(wxCommandEvent& event) { wxMessageBox( "This is a wxWidgets' Hello world sample", "About Hello World", wxOK | wxICON_INFORMATION ); } void MyFrame::OnHello(wxCommandEvent& event) { wxLogMessage("Hello world from wxWidgets!"); }如果创建项目的时候,选择的是windows application,那么直接编译就可以运行,这样整个环境就搭建起来了。
不过话说回来,还是觉得QT的框架更为明了点。
本文的内容部分借鉴文章http://blog.csdn.net/chenjinxian88/article/details/9060161