创建wxWidgets应用程序

📅 发布时间:2026/7/3 3:44:57 👁️ 浏览次数:
创建wxWidgets应用程序
在本文中我们将了解创建wxWidgets应用程序所需的基础知识。首先创建一个简单的示例程序展示如何显示图标接着通过另一个示例演示事件的使用方法最后探讨wxWidgets应用程序中控件之间的通信机制。一个简单的应用程序首先我们创建一个非常基础的wxWidgets程序。// simple.h #include wx/wx.h class Simple : public wxFrame { public: Simple(const wxString title); }; // simple.cpp #include simple.h Simple::Simple(const wxString title) : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150)) { Centre(); } // main.h #include wx/wx.h class MyApp : public wxApp { public: virtual bool OnInit(); }; // main.cpp #include main.h #include simple.h IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { Simple *simple new Simple(wxT(Simple)); simple-Show(true); return true; }用CMake构建工具须编写CMakeLists.txtcmake_minimum_required(VERSION 3.10) project(simple) if(WIN32) find_package(wxWidgets 3.2 REQUIRED COMPONENTS core base CONFIG) else() find_package(wxWidgets 3.2 REQUIRED COMPONENTS core base) endif() if(wxWidgets_USE_FILE) # not defined in CONFIG mode include(${wxWidgets_USE_FILE}) endif() set(SRC_FILES main.cpp simple.cpp ) # Define the build target for the executable, e.g. windows application. add_executable(${PROJECT_NAME} WIN32 MACOSX_BUNDLE ${SRC_FILES}) target_link_libraries(${PROJECT_NAME} ${wxWidgets_LIBRARIES}) if(MSVC) target_include_directories(${PROJECT_NAME} PUBLIC ${wxWidgets_INCLUDE_DIRS}/msvc) endif() if(CMAKE_SIZEOF_VOID_P EQUAL 8) message(STATUS Configuring for 64-bit build.) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/out) if(NOT MSVC) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/out/${CMAKE_BUILD_TYPE}) endif() else() message(STATUS Configuring for 32-bit build.) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/out/b32) if(NOT MSVC) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/out/b32/${CMAKE_BUILD_TYPE}) endif() endif()现在生成的可执行程序将会放在out文件夹内部。值得一提的是CMake采用Config模式在Windows下构建wxWidgets应用程序更好用而在Linux下这个模式反而更麻烦了。这个非常基础的示例在屏幕上显示了一个小窗口。该窗口位于屏幕中央。Centre(); //这个方法将窗口在屏幕上水平和垂直居中。IMPLEMENT_APP(MyApp) //实现应用程序的代码被隐藏在这个宏后面。这段代码通常是复制粘贴复用的我们一般不需要关心它。运行效果例如在Linux下将显示应用程序图标在本示例中我们为应用程序提供了一个图标。在窗口左上角显示小图标已成为标准做法该图标是程序的图形标识。// icon.h #include wx/wx.h class Icon : public wxFrame { public: Icon(const wxString title); }; // icon.cpp #include icon.h Icon::Icon(const wxString title) : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150)) { SetIcon(wxIcon(wxT(web.xpm))); Centre(); } // main.h #include wx/wx.h class MyApp : public wxApp { public: virtual bool OnInit(); }; // main.cpp #include main.h #include icon.h IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { Icon *icon new Icon(wxT(Icon)); icon-Show(true); return true; }在我们的示例中我们展示了一个小小的网页图标。SetIcon(wxIcon(wxT(web.xpm)));只需一行代码即可显示应用程序图标。XPMX PixMap是一种ASCII图像格式。一个简单的按钮在以下示例中我们将在框架部件上创建一个按钮。我们将展示如何创建一个简单的事件处理器。// button.h #include wx/wx.h class Button : public wxFrame { public: Button(const wxString title); void OnQuit(wxCommandEvent event); }; // button.cpp #include button.h Button::Button(const wxString title) : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(270, 150)) { wxPanel *panel new wxPanel(this, wxID_ANY); wxButton *button new wxButton(panel, wxID_EXIT, wxT(Quit), wxPoint(20, 20)); Connect(wxID_EXIT, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(Button::OnQuit)); button-SetFocus(); Centre(); } void Button::OnQuit(wxCommandEvent WXUNUSED(event)) { Close(true); } // main.h #include wx/wx.h class MyApp : public wxApp { public: virtual bool OnInit(); }; // main.cpp #include main.h #include button.h IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { Button *btnapp new Button(wxT(Button)); btnapp-Show(true); return true; }首先我们创建一个 wxPanel 部件它将被放置在 wxFrame 部件内部。我们创建一个 wxButton 部件将其放置在面板上。我们为按钮使用了预定义的 wxID_EXIT ID这会使按钮上显示一个小的退出图标。按钮的标签是退出(Quit)。按钮被手动定位在坐标 x20y20 处。坐标系的起点位于左上角。当我们点击按钮时会生成一个 wxEVT_COMMAND_BUTTON_CLICKED 事件。我们将该事件连接到 Button 类的 OnQuit 方法。因此当我们点击按钮时就会调用 OnQuit 方法。我们将键盘焦点设置在该按钮上。这样当我们按下回车键时就会触发按钮的点击事件。在 OnQuit 方法内部我们调用了 Close 方法。这将终止我们的应用程序。补充说明在 wxWidgets 框架中调用 Close() 方法会触发 wxEVT_CLOSE_WINDOW 事件该事件的默认处理程序会调用 wxWindow::Destroy() 来销毁窗口。对于应用程序的主窗口来说这会进一步导致整个应用程序退出前提是没有其他顶级窗口存在。这是 wxWidgets 应用程序的标准退出流程之一组件通信了解组件如何在应用程序中进行通信非常重要。请看以下示例。// Panels.h #include wx/wx.h #include wx/panel.h class LeftPanel : public wxPanel { public: LeftPanel(wxPanel *parent); void OnPlus(wxCommandEvent event); void OnMinus(wxCommandEvent event); wxButton *m_plus; wxButton *m_minus; wxPanel *m_parent; int count; }; class RightPanel : public wxPanel { public: RightPanel(wxPanel *parent); void OnSetText(wxCommandEvent event); wxStaticText *m_text; }; const int ID_PLUS 101; const int ID_MINUS 102; // Panels.cpp #include wx/stattext.h #include Communicate.h LeftPanel::LeftPanel(wxPanel * parent) : wxPanel(parent, -1, wxPoint(-1, -1), wxSize(-1, -1), wxBORDER_SUNKEN) { count 0; m_parent parent; m_plus new wxButton(this, ID_PLUS, wxT(), wxPoint(10, 10)); m_minus new wxButton(this, ID_MINUS, wxT(-), wxPoint(10, 60)); Connect(ID_PLUS, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(LeftPanel::OnPlus)); Connect(ID_MINUS, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(LeftPanel::OnMinus)); } void LeftPanel::OnPlus(wxCommandEvent WXUNUSED(event)) { count; Communicate *comm (Communicate *) m_parent-GetParent(); comm-m_rp-m_text-SetLabel(wxString::Format(wxT(%d), count)); } void LeftPanel::OnMinus(wxCommandEvent WXUNUSED(event)) { count--; Communicate *comm (Communicate *) m_parent-GetParent(); comm-m_rp-m_text-SetLabel(wxString::Format(wxT(%d), count)); } RightPanel::RightPanel(wxPanel * parent) : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(270, 150), wxBORDER_SUNKEN) { m_text new wxStaticText(this, -1, wxT(0), wxPoint(40, 60)); } // Communicate.h #include Panels.h #include wx/wxprec.h class Communicate : public wxFrame