上一节我们通过CodeLite的模板建立了一个wxWidgets的GUI项目wxFrame1,这个工程包含了四个文件:gui.h、gui.cpp、main.h、main.cpp。
gui.h和gui.cpp中声明和实现了MainFrameBase类,该类继承于wxFrame类
main.h和main.cpp中声明和实现了MainFrame类,该类继承于MainFrameBase类
在MainFrameBase类中实现与窗体界面相关的代码,在MaianFrame类中实现事件处理的相关代码,这样将窗体界面和事件处理在逻辑上剥离。
先来看看gui.h和gui.cpp的完整源代码,省事点,直接在原来代码上加注释
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Feb 8 2009)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#ifndef __gui__
#define __gui__
//引用必备的头文件
#include <wx/intl.h>
#include <wx/string.h>
#include <wx/bitmap.h>
#include <wx/image.h>
#include <wx/icon.h>
#include <wx/menu.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/sizer.h>
#include <wx/statusbr.h>
#include <wx/frame.h>
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// Class MainFrameBase
///////////////////////////////////////////////////////////////////////////////
class MainFrameBase : public wxFrame
{
private:
protected:
//菜单栏
wxMenuBar* m_menuBar;
//主菜单
wxMenu* m_menuFile;
//状态栏
wxStatusBar* m_statusBar;
// Virtual event handlers, overide them in your derived class
//虚事件处理函数,这里直接用event.Skip()忽略掉
virtual void OnCloseFrame( wxCloseEvent& event ) { event.Skip(); }
virtual void OnExitClick( wxCommandEvent& event ) { event.Skip(); }
public:
//主窗体构造函数
MainFrameBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("wxMiniApp"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 500,300 ), long style = wxCLOSE_BOX|wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
~MainFrameBase();
};
#endif //__gui__
下面是gui.cpp的源码
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Feb 8 2009)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#include "gui.h"
///////////////////////////////////////////////////////////////////////////
//在这个函数里实现主窗体和其中控件的创建和初始化
MainFrameBase::MainFrameBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
//创建菜单栏
m_menuBar = new wxMenuBar( 0 );
//创建顶级菜单
m_menuFile = new wxMenu();
//创建一个菜单项,--退出功能
wxMenuItem* menuFileExit;
menuFileExit = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("E&xit") ) + wxT('/t') + wxT("Alt+X"), wxEmptyString, wxITEM_NORMAL );
//将刚刚创建的菜单项添加到顶级菜单中
m_menuFile->Append( menuFileExit );
//将刚刚创建的顶级菜单添加到菜单栏中
m_menuBar->Append( m_menuFile, _("&File") );
//将创建的菜单栏与主窗体关联
this->SetMenuBar( m_menuBar );
//创建boxsize控件
wxBoxSizer* mainSizer;
mainSizer = new wxBoxSizer( wxVERTICAL );
//将刚刚创建的boxsizer与主窗体关联
this->SetSizer( mainSizer );
this->Layout();
//创建状态条控件
m_statusBar = this->CreateStatusBar( 1, wxST_SIZEGRIP, wxID_ANY );
this->Centre( wxBOTH );
// Connect Events
//将窗体中事件与事件处理函数关联
//这里的事件处理函数均在main.cpp中实现
//将窗体关闭事件与OnCloseFrame()函数关联
this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainFrameBase::OnCloseFrame ) );
this->Connect( menuFileExit->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnExitClick ) );
}
MainFrameBase::~MainFrameBase()
{
// Disconnect Events
//解除事件与其处理函数的关联
this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainFrameBase::OnCloseFrame ) );
this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnExitClick ) );
}