wxWidgets+程序的启动流程

本节介绍一下程序的启动流程,并给出一个可执行的最小示例。

1. wxWidgets程序的启动流程

一个最简单的wxWidget核心程序中的启动流程如下:

总共分为五步:

  1. 通过进入winMain函数,初始化一些数据结构。然后创建一个自定义的App类的实例。通过宏IMPLEMENT_APP(MyApp)这个宏来实现。这个宏里实现了WinMain入口函数,并且对指定的App类进行实例化。
  2. 调用实例化的App类的OnInit函数。通常会在OnInit函数创建一个自定义的派生类对象MyFrame。
  3. 在MyFrame的构造函数中调用其父类wxFrame的构造函数,创建一个窗口。然后给这个窗口增加图标、标题、菜单栏、状态栏等。
  4. 在App的OnInit函数返回true。
  5. wxWidgets开始事件循环(OnInit返回为真才会开启事件循环,否则程序会直接退出),等待事件发生并分发事件。

2. 可运行的最小程序

代码如下:

#include "wx/wx.h"

// 定义应用程序类
class MyApp : public wxApp
{
public:
    // 这个函数将会在程序启动的时候被调用
    virtual bool OnInit();
};

// 定义主窗口类
class MyFrame : public wxFrame
{
public:
    // 主窗口类的构造函数
    MyFrame(const wxString& title);

    // 事件处理函数
    void OnQuit(wxCommandEvent& event);
    void OnAbout(wxCommandEvent& event);

private:
    // 声明事件表
    DECLARE_EVENT_TABLE()
};

// 有了这一行就可以使用 MyApp& wxGetApp()了
DECLARE_APP(MyApp)

// 告诉wxWidgets主应用程序是哪个类
IMPLEMENT_APP(MyApp)

// 初始化程序
bool MyApp::OnInit()
{
    // 创建主窗口
    MyFrame* frame = new MyFrame(wxT("牛爷爷的App"));

    // 显示主窗口
    frame->Show(true);

    // 开始事件处理循环
    return true;
}

// MyFrame类的事件表
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
    EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
    EVT_MENU(wxID_EXIT,  MyFrame::OnQuit)
END_EVENT_TABLE()

void MyFrame::OnAbout(wxCommandEvent& event)
{
    wxString msg;
auto oldtext = GetStatusBar()->GetStatusText(1);
SetStatusText("About status", 1);

msg.Printf(wxT("Hello and welocme to %s"),
	wxVERSION_STRING);
wxMessageBox(msg, wxT("About Minimal"),
	wxOK | wxICON_INFORMATION, this);

SetStatusText(oldtext, 1);
}

void MyFrame::OnQuit(wxCommandEvent& event)
{
    // 释放主窗口
    Close();
}



MyFrame::MyFrame(const wxString& title)
       : wxFrame(NULL, wxID_ANY, title)
{


    // 创建菜单条
    wxMenu *fileMenu = new wxMenu;

    // 添加“关于”菜单项
    wxMenu *helpMenu = new wxMenu;
    helpMenu->Append(wxID_ABOUT, wxT("&About...\tF1"),
                     wxT("Show about dialog"));

    fileMenu->Append(wxID_EXIT, wxT("E&xit\tAlt-X"),
                     wxT("Quit this program"));

    // 将菜单项添加到菜单条中
    wxMenuBar *menuBar = new wxMenuBar();
    menuBar->Append(fileMenu, wxT("&File"));
    menuBar->Append(helpMenu, wxT("&Help"));

    // ...然后将菜单条放置在主窗口上
    SetMenuBar(menuBar);

    // 创建一个状态条来让一切更有趣些。
    CreateStatusBar(2);
    SetStatusText(wxT("Welcome to wxWidgets!"));
    SetStatusText(wxT("我是你牛爷爷啊!"));
}

程序的运行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值