初识wxWidget——项目结构说明
- 说明
- gui.h
- gui.cpp
- main.h
- main.cpp
- 附注
说明
哈喽,我是杨小乐,一个初入行业的菜鸟,这里简单分享下wxWidget的初步认识,如有错误,欢迎指正。
一个wxWidget+FormBuilder的简单项目,包括以下几个部分,如图:
include里一般放头文件,头文件里放各种引用的库文件。
resources里放的gui.fbp,也就是FormBuilder的可视化界面。
src一般是实现文件 .cpp
gui.h
界面定义文件:这里代码省略了引用的一些头文件,因为用类codelite集成开发环境,会自动载入。
//定义主窗体类 class Frame declaration
class MainFrameBase : public wxFrame
{
private:
protected: //定义控件 widget declaration
wxMenuBar* m_menuBar;
wxMenu* m_menuFile;
wxStatusBar* m_statusBar;
// Virtual event handlers, overide them in your derived class
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();
};
gui.cpp
界面实现文件:这里是纯图形实现,最好不要有函数功能的具体实现,因为一旦在FormBuilder里更改界面或增加控件,就会刷新gui.cpp。所以要采取界面和实现分离的设计。
#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 );
wxBoxSizer* mainSizer;
mainSizer = new wxBoxSizer( wxVERTICAL );
this->SetSizer( mainSizer );
this->Layout();
m_statusBar = this->CreateStatusBar( 1, wxST_SIZEGRIP, wxID_ANY );
this->Centre( wxBOTH );
// Connect Events,动态事件连接
this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainFrameBase::OnCloseFrame ) );
this->Connect( menuFileExit->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnExitClick ) );
}
MainFrameBase::~MainFrameBase() //析构函数,C++用法
{
// Disconnect Events,释放事件连接
this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainFrameBase::OnCloseFrame ) );
this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnExitClick ) );
}
main.h
主程序的头文件:
- 在进入消息循环之前,创建主窗口的工作通过在wxApp的派生类中重新实现wxApp的虚函数OnInit来完成。主窗口通常是wxFrame或wxDialog的派生类,其中的控件都作为主窗口类的成员变量,在主窗口类的构造函数中初始化。
#ifndef __main__ //防止重复定义main.h
#define __main__
// main wxWidgets header file
#include <wx/wx.h>
// gui classes generated by wxFormBuilder
#include "gui.h"
////////////////////////////////////////////////////////////////////////////////
// application class declaration 主应用程序定义
////////////////////////////////////////////////////////////////////////////////
class MainApp : public wxApp //相当于主入口,初始化
{
public:
virtual bool OnInit();
};
// declare global static function wxGetApp()
DECLARE_APP(MainApp)
////////////////////////////////////////////////////////////////////////////////
// main application frame declaration
////////////////////////////////////////////////////////////////////////////////
class MainFrame : public MainFrameBase 重继承主窗体,重定义
{
public:
MainFrame( wxWindow *parent );
virtual ~MainFrame();
protected:
// protected event handlers
virtual void OnCloseFrame( wxCloseEvent& event );
virtual void OnExitClick( wxCommandEvent& event );
};
#endif //__main__
main.cpp
主体功能函数实现文件:
- wxWidget程序封装了main函数和消息循环。通常情况下,整个程序通过继承wxApp类并用全局宏wxIMPLEMENT_APP,传入wxApp的派生类的类名实现对类的实例化并进入消息循环。
#include "main.h"
// initialize the application
IMPLEMENT_APP(MainApp);
////////////////////////////////////////////////////////////////////////////////
// application class implementation
////////////////////////////////////////////////////////////////////////////////
bool MainApp::OnInit()
{
SetTopWindow( new MainFrame( NULL ) ); //设为顶层窗体
GetTopWindow()->Show(); //显示
// true = enter the main loop
return true;
}
////////////////////////////////////////////////////////////////////////////////
// main application frame implementation //具体事件函数的实现
////////////////////////////////////////////////////////////////////////////////
MainFrame::MainFrame(wxWindow *parent) : MainFrameBase( parent )
{
}
MainFrame::~MainFrame()
{
}
void MainFrame::OnCloseFrame(wxCloseEvent& event)
{
Destroy();
}
void MainFrame::OnExitClick(wxCommandEvent& event)
{
Destroy();
}
附注
- codlite快捷键:
编译: F7
DebRun: F5 - 注意:wxWidget和C++,极容易语法混淆,要注意彼此间数据类型转换和库文件引用。