wxwidgets学习与使用备忘录一(下载、安装、配置篇)
一、下载:
到wxwidgets官网下载安装包: http://www.wxwidgets.org/downloads,我用的是windows版本,所以下载wxMSW版本的 wxWidgets。
二、安装:
这个没什么好说的,都是按惯例点下一步,我本地是安装到:D:\wxWidgets-2.8.12。
三、配置:
这里事情比较多,也是比较烦人的地方。。。
1、编译:
打开D:\wxWidgets-2.8.12\build\msw\wx.dsw,分别编译debug、release、Unicode debug、Unicode release版本。这个步骤是用来生成wxwidgets开发时用到的各个lib的。
2、设置包含文件路径:
打开vc,点击菜单“工具”-》“选项”-》“项目”-》“vc目录”-》“包含文件”,添加“D:\wxWidgets-2.8.12\lib\vc_lib\mswd”和“D:\wxWidgets-2.8.12\include”。当然,也可以在每个工程里面设置,步骤是工程“属性”-》“c++”-》“常规”-》“附加包含目录”,添加上面的两个路径。两个效果差不多,看个人喜好了。必须注意的是:wxwidgets支持很多编译配置的,如果是release版本,那就把上述路径的“D:\wxWidgets-2.8.12\lib\vc_lib\mswd”换成“D:\wxWidgets-2.8.12\lib\vc_lib\msw”,如果是Unicode版本,那么需要把文件夹名字换成mswu和mswud,以此类推。
3、设置库路径:
打开vc,点击菜单“工具”-》“选项”-》“项目”-》“vc目录”-》“库文件”,添加“D:\wxWidgets-2.8.12\lib\vc_lib”。当然,也可以在每个工程的里面设置,步骤是工程“属性”-》“链接器”-》“常规”-》“附加库目录”,添加“D:\wxWidgets-2.8.12\lib\vc_lib”。
四、hello world:
配置好之后,我们尝试使用wxwidgets建立第一个程序。
1、新建一个空白解决方案:wxwidgets_hello_world。
2、在源文件中添加一个cpp文件:main.cpp,添加以下代码:
#include "wx/wx.h" class MyApp: public wxApp { virtual bool OnInit(); }; class MyFrame: public wxFrame { public: MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); void OnQuit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); DECLARE_EVENT_TABLE() }; enum { ID_Quit = 1, ID_About, }; BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(ID_Quit, MyFrame::OnQuit) EVT_MENU(ID_About, MyFrame::OnAbout) END_EVENT_TABLE() IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { MyFrame *frame = new MyFrame( _("Hello World"), wxPoint(50, 50), wxSize(450, 340) ); frame->Show(true); SetTopWindow(frame); return true; } MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame(NULL, -1, title, pos, size) { wxMenu *menuFile = new wxMenu; menuFile->Append( ID_About, _("&About...") ); menuFile->AppendSeparator(); menuFile->Append( ID_Quit, _("E&xit") ); wxMenuBar *menuBar = new wxMenuBar; menuBar->Append( menuFile, _("&File") ); SetMenuBar( menuBar ); CreateStatusBar(); SetStatusText( _("Welcome to wxWidgets!") ); } void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) { Close(true); } void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) { wxMessageBox( _("This is a wxWidgets Hello world sample"), _("About Hello World"), wxOK | wxICON_INFORMATION, this ); }
3、配置工程属性:
(1)、点击工程“属性”-》“常规”-》“使用托管扩展”,设置为否,否则生成的程序在移动界面时会崩溃。
(2)、点击工程“属性”-》“c++”-》“预处理器”-》“预处理器定义”,改为 WIN32;_DEBUG;__WXMSW__;__WXDEBUG__;_WINDOWS;NOPCH;_USRDLL;
(3)、点击工程“属性”-》“c++”-》“代码生成”-》“运行时库”,改为“多线程调试 DLL (/MDd)”,这个要注意,不然链接报很多错误。
(4)、点击工程“属性”-》“链接器”-》“输入”,添加这些库:
wxmsw28d_core.lib
wxbase28d.lib
wxtiffd.lib
wxjpegd.lib
wxpngd.lib
wxzlibd.lib
wxregexd.lib
wxexpatd.lib
winmm.lib
comctl32.lib
rpcrt4.lib
这里需要注意的是,如果是release版本,把那些文件名最后的“d”换成“r”,如果是Unicode版本,还需要在“d”或者“r”之前添加“u”。
另外,这些库不是必须的,根据不同的程序需求调用,可能可以删掉部分lib,或者需要添加其他lib。
4、编译,运行程序:
如果没什么意外,那么你的第一个hello world产生了,程序效果图如下:
5、一些补充:
(1)、程序没看到入口点函数“main”、“Main”之类的,其实程序的入口点函数是IMPLEMENT_APP(MyApp)。
(2)、wxApp是进程类,MyFrame是窗口类。
(3)、这些是窗口类的事件处理函数表声明:
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_Quit, MyFrame::OnQuit)
EVT_MENU(ID_About, MyFrame::OnAbout)
END_EVENT_TABLE()
(4)、有没有注意到生成的程序图标是默认的不好看?
(a)、新建一个文本文件,改名为“wxwidgets_hellow_world.rc”,里面添加两行:
#include "wx/msw/wx.rc"
hello ICON "hello.ico"
(b)、hello.ico是个icon文件,复制一个或者自己画一个都行。
(c)、将这个资源文件添加到工程的资源文件目录,如下图:
(d)、然后在MyFrame的构造函数开始时添加一行代码:SetIcon(wxICON(hello));
设置程序的icon为我们自己刚定义的。
(e)、重新编译运行,这样你的程序就有自己的icon啦。。。
(5)、d、r、u之间的关系,d表示debug版本、r表示release版本,u表示Unicode版本,选择不同的版本,对应的包含路径和库文件路径也不一样的,如msw、mswd、mswu、mswud分别对应release版本、debug版本、Unicode的release版本、Unicode的debug版本。wxbase28.lib、wxbase28d.lib、wxbase28u.lib、wxbase28ud.lib分别对应release版本、debug版本、Unicode的release版本、Unicode的debug版本。是否使用Unicode版本,在工程“属性”-》“常规”-》“字符集”里面设置。
五、后语:
好了,到现在为止,你已经初步知道怎么使用wxwidgets了,起来走走吧,脖子扭扭屁股扭扭。。。程序猿就该对自己好一点,不然亚健康。。。