wxWidgets教程01:第一个程序 HelloWorld

本节将会手动编写创建一个最简单的wxWidgets程序,该程序不做任何事情,只是一个窗体。写的比较细,包括部分源码及运行原理,希望可以彻底理解!

1. Frame和Dialog的区别

一般情况下,有菜单工具栏的是Frame,没有的是Dialog。当然这是一般情况,因为你完全可以把Dialog做成Frame样子。Frame一般用做主窗体,可以有菜单、工具栏、状态栏。Dialog用做模式窗口,可以返回不同的值,比如打开个设置对话框、确认对话框等等。用一个图片来说明:


wxWidgets(以下简称wx)程序必需包涵一个顶级窗体,而wx只有两个顶级窗体就是wxFrame和wxDialog,所以我们和程序里面必需有一个wxFrame或是wxDialog。

2. 程序入口

以我们的经验,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(app)宏调用了wxIMPLEMENT_WXWIN_MAIN并且完成了许多wx初始化的工作,所以在我们的程序中,只需加上 IMPLEMENT_APP(OurApp)作为入口即可,预处理器会自动替换……

3. 初始化

上面的 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程序将退出

4. 创建Frame

前面说到,我们必需至少有一个Frame或Dialog,这里我们将创建wxFrame

先看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来识别)

5. 合成

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了:

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章