wxWidgets教程01:第一个程序 HelloWorld

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


1. Frame和Dialog的区别


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

wxWidgets教程01:第一个程序 HelloWorld_第1张图片


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 

class OurApp: public wxApp
{

};

IMPLEMENT_APP(OurApp)
wxApp实际是在wx/app.h中声明的,也可以使用#include ,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 

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

wxWidgets教程01:第一个程序 HelloWorld_第2张图片





你可能感兴趣的:(C/C++,wxWidgets)