翻译自wxWidgets官网手册
首先,用全局包含的方式将wxWidgets的头文件wx/wx.h包含进来。这个头文件包含了常用的大多数头文件。对于支持预编译头文件的平台(由WX_PRECOMP进行标识),该全局头文件已被wx/wxprec.h包含了,因此只包含这个头文件就可以了。像下面那样。
// wxWidgets "Hello world" Program
// For compilers that support precompilation, includes "wx/wx.h".
#include <wx/wxprec.h>
#ifndef WX_PRECOMP //如果不支持预编译头文件
#include <wx/wx.h>//就将wx/wx.h文件包含进来
#endif
每个窗口应用程序应该新定义一个类,这个类是继承自wxApp类的派生类。通过重写基类wxApp中的OnInit()虚方法,这个应用程序可以被初始化。比如创建一个新的主窗口。
class Myapp: public wxApp
{
public:
virtual bool OnInit();
};
主窗口是通过从wxFrame派生出新类来创建的,在构造函数中给出菜单栏和状态栏。需要对事件作出响应的类必须用宏声明一个事件表。
最后,响应这些事件的方法要在handlers里去完成。
class MyFrame: public wxFrame
{
public:
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
private:
void OnHello(wxCommandEvent& event);
void OnExit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
wxDECLARE_EVENT_TABLE();
};
为了对一个菜单命令进行响应,必须对这个命令设置唯一标识,可以通过定义一个常量或枚举元素来设置。通过枚举元素的方式是最常用的。
enum
{
ID_Hello = 1
};
无需为About和Exit定义标识。下面就要完成一个事件表,在这个事件表里,相关事件将与它们各自的处理函数相关联。
常见的事件与事件处理函数的关联已经有了预定义的宏。如果wxID_ANY被设置为了ID,已有的事件处理函数将被调用来处理任何指定类型的事件,这样就可以在事件表中为所有的菜单命令或按钮命令只添加一个入口就够了。
wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_Hello, MyFrame::OnHello)
EVT_MENU(wxID_EXIT, MyFrame::OnExit)
EVT_MENU(ID_ABOUT, MyFrame::OnAbout)
wxEND_EVENT_TABLE()
所有程序都必须有一个主函数。在wxWidgets里,主函数用宏的方式来实现,创建了一个程序的实例并启动程序。
wxIMPLEMENT_APP(MyApp)
wxApp::OnInit()在启动程序的时候被调用,用以对程序进行初始化,可能是显示一个启动画面,同时创建主窗口。方法返回true时表明成功初始化。
bool MyApp::OnInit()
{ MyFrame *frame = new MyFrame("Hello World", wxPoint(50,50), wxSize(450, 340));
frame->Show(true);
return true;
}
在主窗口的构造函数中,我们创建了一个有菜单项的菜单以及一个在主窗口底部显示的状态栏。它们都要跟框架里各自的调用相关联。
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size):wxFrame(NULL, wxID_ANY, title, pos, size)//在定义派生类的构造函数时,调用基类的构造函数
{
wxMenu *menuFile = new wxMenu;
menuFile->Append(ID_Hello, "&Hello...\tCtrl-H", "Help string shown in status bar for this menu item");
menuFile->AppendSeparator();
menuFile->Append(wxID_EXIT);
wxMenu *menuHelp = new wxMenu;
menuHelp->Append(wxID_ABOUT);
wxMenuBar *menuBar = new wxMenuBar;
menuBar->Append(menuFile, "&File");
menuBar->Append(menuHelp, "Help");
SetMenuBar(menuBar);
CreateStatusBar();
SetStatusText("Welcome to wxWidgets");
}
需要注意的是我们无需为标准的菜单项wxID_ABOUT和wxID_EXIT指定标识。
下面是事件处理函数的标准实现。
MyFrame::OnExit() 通过调用Close()方法来关闭主窗口。参数true表明其他的窗口不能阻止关闭的行为。如果没有其它的主窗口,程序就会退出。
void MyFrame::OnExit(wxCommandEvent& event)
{
Close(true);
}
MyFrame::OnAbout()会显示一个小窗口,小窗口里有些文本信息。
void MyFrame::OnAbout(wxCommandEvent& event)
{
wxMessageBox("This is a wxWidgets' Hello world sample", "About Hello World", wxOK | wxICON_INFORMATION);
}
自定义菜单命令处理函数的实现可以执行程序需要的任何任务。
void MyFrame::OnHello(wxCommandEvent& event)
{
wxLogMessage("Hello world from wxWidgets!");
}
以下是完整的源程序:
// wxWidgets "Hello world" Program
// For compilers that support precompilation, includes "wx/wx.h".
#include <wx/wxprec.h>
#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif
class MyApp: public wxApp
{
public:
virtual bool OnInit();
};
class MyFrame: public wxFrame
{
public:
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
private:
void OnHello(wxCommandEvent& event);
void OnExit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
wxDECLARE_EVENT_TABLE();
};
enum
{
ID_Hello = 1
};
wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_Hello, MyFrame::OnHello)
EVT_MENU(wxID_EXIT, MyFrame::OnExit)
EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
wxEND_EVENT_TABLE()
wxIMPLEMENT_APP(MyApp);
bool MyApp::OnInit()
{
MyFrame *frame = new MyFrame( "Hello World", wxPoint(50, 50), wxSize(450, 340) );
frame->Show( true );
return true;
}
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
: wxFrame(NULL, wxID_ANY, title, pos, size)
{
wxMenu *menuFile = new wxMenu;
menuFile->Append(ID_Hello, "&Hello...\tCtrl-H",
"Help string shown in status bar for this menu item");
menuFile->AppendSeparator();
menuFile->Append(wxID_EXIT);
wxMenu *menuHelp = new wxMenu;
menuHelp->Append(wxID_ABOUT);
wxMenuBar *menuBar = new wxMenuBar;
menuBar->Append( menuFile, "&File" );
menuBar->Append( menuHelp, "&Help" );
SetMenuBar( menuBar );
CreateStatusBar();
SetStatusText( "Welcome to wxWidgets!" );
}
void MyFrame::OnExit(wxCommandEvent& event)
{
Close( true );
}
void MyFrame::OnAbout(wxCommandEvent& event)
{
wxMessageBox( "This is a wxWidgets' Hello world sample",
"About Hello World", wxOK | wxICON_INFORMATION );
}
void MyFrame::OnHello(wxCommandEvent& event)
{
wxLogMessage("Hello world from wxWidgets!");
}