C++GUI之wxWidgets(6)-一步步做zip精灵(1)
目录
- 一步步做zip精灵
- 头文件
- 应用类声明
- 框架类声明
- 创建MyApp实例
- OnInit()
- 事件表
- OnAbout
一步步做zip精灵
头文件
#include <wx/wx.h>
应用类声明
// application class
class ZipApp : public wxApp
{
public:
// function called at the application initialization
virtual bool OnInit();
};
1、每个wxWidgets应用程序都定义一个从wxApp派生的应用程序类。它只有一个实例,该实例表示正在运行的应用,至少派生类应该定义一个OnInit函数,将在wxWidgets准备好开始运行代码时调用
2、OnInit这个虚函数返回true ,将启动事件 主循环。
3、OnInit的实现通常至少创建一个窗口,解释任何命令行参数,为应用程序设置数据,并执行
应用程序所需的任何其他初始化任务。
框架类声明
//frame class
class ZipFrame:public wxFrame{
public:
ZipFrame(const wxString &title);
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
private:
string ver{"0.1"};
DECLARE_EVENT_TABLE();
}
1、框架是包含其他窗口的顶级窗口,通常具有标题栏和菜单栏。框架类声明放在应用类声明之后。
2、框架类有一个构造函数,两个用于链接菜单命令的事件处理程序以及一个宏来告诉wxWidgets这个类处理事件。
创建MyApp实例
1、(1)创建MyApp实例的代码在哪里?wxWidgets执行此操作,需要告诉wxWidgets要创建什么类型的对象。所以需要在实现文件中添加宏:
IMPLEMENT_APP(ZipApp);
(2)如果不指定类,wxWidgets将不知道如何创建新的应用程序对象。此宏还插入代码,检查应用程序和库是否使用相同的构建配置编译,允许wxWidgets可以报告意外的不匹配,这些不匹配可能会导致难以调试的运行时失败。
2、当wxWidgets创建ZipApp对象时,它将结果分配给全局变量wxTheApp。你可以在你的应用程序中使用这个,但它不是很方便,如果您不必将wxApp指针转换为ZipApp。通过在应用程序类声明后插入此宏:
DECLARE_APP(ZipApp);
然后就可以调用函数wxGetApp,该函数返回对MyApp的引用对象 。
即使不使用DECLARE_APP,也可以使用变量wxTheApp调用wxApp函数。
OnInit()
bool ZipApp::OnInit()
{
ZipFrame *frame = new ZipFrame(wxT("zip精灵"));
frame->Show(true);
return true;
}
1、创建一个新类ZipFrame的实例,显示它,并返回true以启动事件循环。与子窗口不同,顶级窗口(如框架和对话框)需要在创建后明确显示。
2、frame标题被传递给包装在wxT()宏中的构造函数。它将字符串和字符文本转换为适当的类型,以允许应用程序以Unicode模式编译。
事件表
BEGIN_EVENT_TABLE(ZipFrame, wxFrame)
EVT_MENU(wxID_ABOUT, ZipFrame::OnAbout)
EVT_MENU(wxID_EXIT, ZipFrame::OnQuit)
END_EVENT_TABLE()
1、放置在类的实现文件中的事件表告诉wxWidgets如何来自用户或其他源的事件被路由到成员函数。
2、这种事件表是一种静态的事件路由方式,不能在运行时更改。
3、用鼠标单击菜单项标识符wxID_EXIT和wxID_ABOUT被路由到函数MyFrame::OnQuit和MyFrame::OnAbout 。
OnAbout
void ZipFrame::OnAbout(wxCommandEvent& event)
{
wxString msg;
msg.Printf(wxT(“欢迎使用zip精灵%s”), ver);
wxMessageBox(msg, wxT("关于zip精灵"),wxOK | wxICON_INFORMATION, this);
}
MyFrame::OnAbout在用户单击“关于”时显示一个消息框菜单项。wxMessageBox接收消息、标题、样式组合和父窗口 。