1. 示例文件
在CodeLite中创建一个WorkSpace,再在WorkSpace中创建一个Project,加入以下两个文件:
文件:SimplewxWidgets.cpp
/* 名称: SimplewxWidgets.cpp
* 目的: 一个简单的wxWidget示例
*/
#include <wx/wx.h>
// 定义应用程序类
class MyApp: public wxApp
{
public:
// 这个函数将会在程序启动时被调用
virtual bool OnInit();
};
// 定义主窗口类
class MyFrame: public wxFrame
{
public:
// 主窗口类的构造函数
MyFrame(const wxString& title);
// 事件处理函数
void OnQuit(wxCommandEvent& e);
void OnAbout(wxCommandEvent& e);
private:
// 声明事件表
DECLARE_EVENT_TABLE()
};
// 有了这一行就可以使用 MyApp& wxGetApp()了
DECLARE_APP(MyApp)
// 告诉主应用程序是哪个类wxWidgets
IMPLEMENT_APP(MyApp)
// 初始化程序
bool MyApp::OnInit()
{
// 创建主窗口
MyFrame *frame = new MyFrame(wxT("简单wxWidget应用程序"));
// 显示主窗口
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& e)
{
wxString msg;
msg.Printf(wxT("你好!欢迎来到%s"), wxVERSION_STRING);
wxMessageBox(msg, wxT("关于"), wxOK | wxICON_INFORMATION, this);
}
void MyFrame::OnQuit(wxCommandEvent& e)
{
// 释放主窗口
Close();
}
#include "mondrian.xpm"
MyFrame::MyFrame(const wxString& title)
:wxFrame(NULL, wxID_ANY, title)
{
// 设置窗口图标
SetIcon(wxIcon(mondrian_xpm));
// 创建文件菜单项
wxMenu *fileMenu = new wxMenu;
fileMenu->Append(wxID_EXIT, wxT("退出(&X)\tAlt-X"), wxT("退出本应用程序"));
// 创建帮助菜单项
wxMenu *helpMenu = new wxMenu;
helpMenu->Append(wxID_ABOUT, wxT("关于(&A)...\tF1"), wxT("显示关于对话框"));
// 将菜单项添加到菜单条中
wxMenuBar *menuBar = new wxMenuBar();
menuBar->Append(fileMenu, wxT("文件(&F)"));
menuBar->Append(helpMenu, wxT("帮助(&H)"));
//然后将菜单条设置在主窗口上
SetMenuBar(menuBar);
// 创建一个状态条来让一切更有趣些
CreateStatusBar(2);
SetStatusText(wxT("欢迎使用wxWidgets!"), 1);
}
文件: mondrian.xpm
/* XPM */
static char *mondrian_xpm[] = {
/* columns rows colors chars-per-pixel */
"32 32 6 1",
" c Black",
". c Blue",
"X c #00bf00",
"o c Red",
"O c Yellow",
"+ c Gray100",
/* pixels */
" ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" ",
" ++++++ ++++++++++++++++++ .... ",
" ++++++ ++++++++++++++++++ .... ",
" ++++++ ++++++++++++++++++ .... ",
" ++++++ ++++++++++++++++++ .... ",
" ++++++ ++++++++++++++++++ .... ",
" ++++++ ++++++++++++++++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" "
};
2. 本示例基本要素
- 一个应用程序类。在这里是从wxApp类派生的子类MyApp,该子类定义了一个OnInit函数,当wxWidgets准备好运行你写的代码的时候,它将会调用这个函数。
- 一个窗口类。用来响应UI操作。
- 事件处理表。所谓事件表,是一组位于类的实现文件(.cpp文件)中的宏,用来告诉wxWidgets来自用户或者其它地方的事件应该怎样和类的成员函数对应起来。
3. 一般执行过程
- 依照系统平台的不同,不同的main函数或者winmain函数或者其它类似的函数被调用(这个函数是由wxWidgets内部提供的,而不是由应用程序提供的)。wxWidgets 初始化它自己的数据结构并且创建一个MyApp的实例.
- wxWidgets调用MyApp::OnInit函数, 这个函数会创建一个MyFrame的实例.
- MyFrame的构造函数通过它的基类wxFrame的构造函数创建一个窗口,然后给这个窗口增加图标,菜单栏和状态栏.
- MyApp::OnInit函数显示主窗口并且返回真.
- wxWidgets开始事件循环,等待事件发生并且将事件分发给相应的处理过程.
参考:
使用wxWidgets进行跨平台程序开发(中文版) 第二章