0,完整实例
#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("Minimal wxWidgets 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;
msg.Printf(wxT("Hello and welcome to %s"), wxVERSION_STRING);
wxMessageBox(msg, wxT("About Minimal"), wxOK | wxICON_INFORMATION, this);
}void MyFrame::OnQuit(wxCommandEvent& event)
{
// 释放主窗口
Close();
}
#include "mondrian.xpm"MyFrame::MyFrame(const wxString& title) : wxFrame(NULL, wxID_ANY, title)
{
// 设置窗口图标
SetIcon(wxIcon(mondrian_xpm));
// 创建菜单条
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!"));
}
这个小例子创建了一个主窗口(是一个wxFrame类的实例),这个主窗口有一个菜单条和一个状态条。菜单条上的菜单按照你的命令显示一个关于窗口或者退出这个小程序。一,应用程序类
每一个wxWidgets程序都需要定义一个wxApp类的子类,并且需要并且只能构造一个这个类的实例,这个实例控制着整个程序的执行。你的这个继承自 wxApp的子类至少需要定义一个OnInit函数,当wxWidgets准备好运行你写的代码的时候,它将会调用这个函数(和一个典型的Win32程序中的main函数或者WinMain函数类似)。你定义这个子类的代码可能和下面的代码类似:
class MyApp : public wxApp
{
public:
virtual bool OnInit();
};
在这个OnInit函数中,你通常应该创建至少一个窗口,对传入的命令行参数进行解析,为应用程序进行数据设置和其它的一些初始化的操作.如果这个函数返回真,wxWidgets将开始事件循环用来处理用户输入并且在必要的情况下处理这些输入。如果OnInit函数返回假, wxWidgets将会释放它内部已经分配的资源,然后结束整个程序的运行。接下来我们看一个最简单的OnInit函数的实现:bool MyApp::OnInit()
{
MyFrame *frame = new MyFrame(wxT("Minimal wxWidgets App"));
frame->Show(true);
return true;
}
你可能还会注意到上面例子中的wxT这个宏,在接下来的例子中,这个宏还会被频繁用到。它的作用是让你的代码兼容Unicode模式。这个宏和另外一个_T宏的作用是完全一样的。使用这个宏也不会带来运行期的性能损失。(你可能还会遇到另外一个类似的"_()"标记,这个标记是用来告诉 wxWidgets将其中的字符串翻译成其它语言的版本.那么创建MyApp的实例的代码在哪里呢?实际上,这是在wxWidgets内部实现的,不过你仍然需要告诉wxWidgets需要创建哪一个App类的实例,所以你还需要增加下面的一个宏:
IMPLEMENT_APP(MyApp)
如果没有实现这个类,wxWidgets就不知道怎样创建一个新的应用程序对象。这个宏除了上述的功能以外,还会检查编译应用程序使用的库文件是否和当前的库文件的版本相匹配,如果没有这种检查,由此而产生的一些运行期的错误可能很难被查出原因。当wxWidgets创建这个MyApp类的实例的时候,会将创建的结果赋值给一个全局变量wxTheApp.你当然可以在你的程序中使用这