本节将会手动编写创建一个最简单的wxWidgets程序,该程序不做任何事情,只是一个窗体。写的比较细,包括部分源码及运行原理,希望可以彻底理解!
一般情况下,有菜单工具栏的是Frame,没有的是Dialog。当然这是一般情况,因为你完全可以把Dialog做成Frame样子。Frame一般用做主窗体,可以有菜单、工具栏、状态栏。Dialog用做模式窗口,可以返回不同的值,比如打开个设置对话框、确认对话框等等。用一个图片来说明:
wxWidgets(以下简称wx)程序必需包涵一个顶级窗体,而wx只有两个顶级窗体就是wxFrame和wxDialog,所以我们和程序里面必需有一个wxFrame或是wxDialog。
以我们的经验,C/C++的入口就是main函数。wx中入口函数当然也是main,只是main函数已经在wx库中被定义好了,不需要再重新定义了。可以从源码wx/app.h中找到main函数被定义在宏wxIMPLEMENT_WXWIN_MAIN中:
#define wxIMPLEMENT_WXWIN_MAIN_CONSOLE int main(int argc, char **argv) { wxDISABLE_DEBUG_SUPPORT(); return wxEntry(argc, argv); }
上面的IMPLEMENT_APP宏接受一个wxApp在类型,即OurApp必需是wxApp类型或wxApp的派生类型,所以我们先定义一个继承自wxApp的类OurApp:
#include <wx/wx.h> class OurApp: public wxApp { }; IMPLEMENT_APP(OurApp)wxApp实际是在wx/app.h中声明的,也可以使用#include <wx/app.h>,wx/wx.h中包括了大部分常用的wx头文件,在后面的程序中如果你不知道该include谁,最简单的办法就是include wx/wx.h
IMPLEMENT_APP中会调用wxApp的OnInit方法,窗体的初始化工作应该放在这里进行:
// Called before OnRun(), this is a good place to do initialization -- if // anything fails, return false from here to prevent the program from // continuing. The command line is normally parsed here, call the base // class OnInit() to do it. virtual bool OnInit();我们只需在OurApp中实现这个方法即可:
#include <wx/wx.h> class OurApp: public wxApp { bool OnInit() { //init } }; IMPLEMENT_APP(OurApp)返回true代表正常,后续的OnRun和OnExit会被调用;返回false程序将退出
先看wxFrame构造函数声明:
wxFrame::wxFrame( wxWindow * parent, wxWindowID id, const wxString & title, const wxPoint & pos = wxDefaultPosition, const wxSize & size = wxDefaultSize, long style = wxDEFAULT_FRAME_STYLE, const wxString & name = wxFrameNameStr )最简单的方案,我们可以只提供三个参数:parent, id, title
wxFrame* frame = new wxFrame(NULL, wxID_ANY, "Our First App"));parent是NULL, 没有父窗体(因为它是顶级窗体),wxID_ANY(其实就是-1)表示让wx安排一个ID(wx中的各控件用ID来识别)
So,终于可以合成出完成的一个程序了:
#include <wx/wx.h> class OurApp : public wxApp { bool OnInit() { wxFrame* frame = new wxFrame(NULL, wxID_ANY, "Our First App"); frame->Show(); return true; } }; IMPLEMENT_APP(OurApp)frame->Show()就不解释了,太明显了!
编译、运行就O了:
原文:http://blog.csdn.net/wanghui5767260/article/details/22386043