初识wxWidget——项目结构说明

初识wxWidget——项目结构说明

说明

哈喽,我是杨小乐,一个初入行业的菜鸟,这里简单分享下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的派生类,其中的控件都作为主窗口类的成员变量,在主窗口类的构造函数中初始化。
/*********************************************************************
 * Name:      	main.h
 * Purpose:   	Declares simple wxWidgets application with GUI
 * 				created using wxFormBuilder.
 * Author:    
 * Created:   
 * Copyright: 
 * License:   	wxWidgets license (www.wxwidgets.org)
 * 
 * Notes:		Note that all GUI creation code is declared in
 * 				gui.h source file which is generated by wxFormBuilder.
 *********************************************************************/

#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的派生类的类名实现对类的实例化并进入消息循环。
/*********************************************************************
 * Name:      	main.cpp
 * Purpose:   	Implements simple wxWidgets application with GUI
 * 				created using wxFormBuilder.
 * Author:    
 * Created:   
 * Copyright: 
 * License:   	wxWidgets license (www.wxwidgets.org)
 * 
 * Notes:		Note that all GUI creation code is implemented in
 * 				gui.cpp source file which is generated by wxFormBuilder.
 *********************************************************************/

#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++,极容易语法混淆,要注意彼此间数据类型转换和库文件引用。
原创文章 2 获赞 2 访问量 166

猜你喜欢

转载自blog.csdn.net/yanxiaole_coder/article/details/106089788