日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

wxWidgets学习 (1) -- Hello World 详解

發(fā)布時間:2025/3/21 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 wxWidgets学习 (1) -- Hello World 详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

wxWidgets 是一個跨平臺的 C++ GUI 框架,和 qt 其實是一類東西。
簡單介紹一下wxWidgets的優(yōu)點:
一、原生界面
wx 不像 java swing 這樣,在所有平臺都使用相同的外觀,也不像qt那樣靠模仿平臺外觀達到“以假亂真”的效果,wx就是對平臺API的封裝。
二、完全免費
使用wxWidgets編寫軟件,不論是個人還是商業(yè)用途,都是完全免費的,假如你修改了wxWidgets的代碼,則必須公開出來。
三、可移植性和發(fā)布
這兩點放在一起說,因為它們的共同點都是可以很方便的把程序拿到其他設備上使用。跨平臺就是一份代碼,不需要修改就能在其他平臺上編譯成可執(zhí)行文件運行。發(fā)布方便是指可以編譯成單個可執(zhí)行文件并靜態(tài)鏈接,用戶只需下載一個exe,不需要附加一堆dll,也不需要什么特殊的運行環(huán)境。我測試過編譯好的exe可以在win2003, xp, win7 和 win10運行。
四、其他
wxWidgets相對其他框架來說可能比較小眾,但是不用擔心,wxWidgets社區(qū)非常活躍,github上托管的項目每天都會更新,也有非常棒的官方文檔。
缺點:
環(huán)境部署比較麻煩,程序體積相對原生api編譯的程序大得多,沒有非常好用的可視化開發(fā)環(huán)境。


關(guān)于開發(fā)環(huán)境部署,這里不會詳細介紹,按照 官網(wǎng) 的教程來做就可以了,上面的步驟非常詳細。我用的是MinGW32位編譯器,wxWidgets 3.0.4版本,我的編譯指令是這樣的:

mingw32-make.exe -j4 -f makefile.gcc SHARED=0 MONOLITHIC=1 BUILD=release

-j4 使用4個cpu,SHARED=0 是靜態(tài)鏈接。


下面步入正題,Hello World 程序的分析。
Hello world 例程是官方教程里的第一個程序,可以作為以后編寫其他程序的框架。
下面是使用32位mingw編譯的同一個exe(7MB)在不同版本windows上運行的結(jié)果




官方例程 Hello world 詳解

首先,必須包含wxWidgets的頭文件,可以只包含用到的類,也可以像新手教程那樣包含wx/wx.h這個頭文件,它內(nèi)部包含了大多數(shù)常用的頭文件。在支持預編譯的系統(tǒng)上,可以使用wx/wxprec.h加快編譯速度。

#include <wx/wxprec.h> #ifndef WX_PRECOMP #include <wx/wx.h> #endif // WX_PRECOMP

創(chuàng)建一個wxWidgets的第一步,是派生wxApp類,并重寫OnInit函數(shù)

class MyApp : public wxApp { public:virtual bool OnInit(); };

接下來,創(chuàng)建主窗口類,從 wxFrame 派生出子類。主窗口有菜單按鈕,底部狀態(tài)欄。在窗口類里聲明了構(gòu)造函數(shù)和三個菜單的點擊事件。wxDECLARE_EVENT_TABLE 是一個宏,聲明這個宏使得主窗口能夠響應“事件”(比如鼠標雙擊按鈕或點擊菜單)。

class MyFrame : public wxFrame { public:// 構(gòu)造函數(shù)設置標題、窗口坐標,窗口尺寸MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size);private:// 響應菜單點擊事件void OnHello(wxCommandEvent &event);void OnExit(wxCommandEvent &event);void OnAbout(wxCommandEvent &event);// 聲明這個宏會創(chuàng)建一個類內(nèi)的靜態(tài)事件表(static event table)// 在實現(xiàn)文件中,使用 wxBEGIN_EVENT_TABLE 和 wxEND_EVENT_TABLE 宏// 添加一些 EVT_xxx 宏來捕獲事件wxDECLARE_EVENT_TABLE(); };

關(guān)于事件綁定的一點疑問:我在其他教程里了解到,可以用 Bind 函數(shù)為控件綁定事件,類似這樣
button->Bind(wxEVT_BUTTON, &MyApp::on_button_clicked(), this);
但是我在自己的開發(fā)環(huán)境里嘗試這樣做卻報錯了,說是找不到這個函數(shù),即使使用最新版wxWidgets也是如此,不知道原因。

下一步,為了響應菜單事件,必須給每個菜單指定一個獨一無二的“ID”

const int ID_Hello = 1; // Hello 菜單的ID,必須是唯一的值

另外兩個菜單分別是“退出”和“幫助”,這兩個是默認菜單,無需指定ID,使用默認的即可。
有了控件ID,就可以實現(xiàn)事件表(event table)了

wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)EVT_MENU(ID_Hello, MyFrame::OnHello)EVT_MENU(wxID_EXIT, MyFrame::OnExit)EVT_MENU(wxID_ABOUT, MyFrame::OnAbout) wxEND_EVENT_TABLE()

這些宏的作用是把三個菜單各自的點擊事件轉(zhuǎn)發(fā)(routed)到主窗口類 MyFrame 中定義的處理函數(shù)中。
所有常用的事件都有預定義的宏,如 EVT_MENU。如果控件ID設置為 wxID_ANY 則處理函數(shù)會被調(diào)用,不論點擊的是哪個菜單。

wxWidgets的主函數(shù)在 wxIMPLEMENT_APP 宏內(nèi)調(diào)用

wxIMPLEMENT_APP(MyApp);

接下來是先前定義的成員函數(shù)的實現(xiàn)

/** 函數(shù)實現(xiàn)部分 **/// OnInit的主要工作是創(chuàng)建主窗口 bool MyApp::OnInit() {// 創(chuàng)建 MyFrame 窗口,設置標題,窗口位置,窗口大小MyFrame *frame = new MyFrame("Hello world", wxPoint(50,50), wxSize(450, 340));frame->Show(true); // 顯示窗口return true; // 返回true表示繼續(xù)進程,false表示立即終止程序 }// 主窗口構(gòu)造函數(shù),調(diào)用 wxFrame 構(gòu)造函數(shù)時第一個參數(shù)是空指針,表示沒有父窗口 MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): wxFrame(nullptr, wxID_ANY, title, pos, size) {wxMenu *menuFile = new wxMenu; // File 菜單// File菜單添加Hello子菜單,支持ALT+H加速鍵和CTRL+H快捷鍵menuFile->Append(ID_Hello,"&Hello...\tCtrl-H","光標移動到Hello菜單上底部狀態(tài)欄顯示的文字");menuFile->AppendSeparator(); // 水平分割線menuFile->Append(wxID_EXIT); // 退出子菜單wxMenu *menuHelp = new wxMenu; // Help 菜單menuHelp->Append(wxID_ABOUT); // “關(guān)于”子菜單wxMenuBar *menuBar = new wxMenuBar; // 菜單欄控件menuBar->Append(menuFile, "&File");menuBar->Append(menuHelp, "&Help");SetMenuBar(menuBar); // 設置菜單欄CreateStatusBar(); // 創(chuàng)建底部狀態(tài)欄SetStatusText("歡迎使用 wxWidgets!"); // 設置狀態(tài)欄文字 }void MyFrame::OnExit(wxCommandEvent &event) {Close(true); // 關(guān)閉主窗口,true表示無需詢問,如果沒有其他主窗口,應用程序?qū)⑼顺?}// 點擊“關(guān)于”,彈出消息對話框 void MyFrame::OnAbout(wxCommandEvent &event) {wxMessageBox("This is a wxWidgets's Hello world sample","About Hello World",wxOK | wxICON_INFORMATION); }// 點擊Hello菜單,彈出日志對話框 void MyFrame::OnHello(wxCommandEvent &event) {wxLogMessage("Hello world from wxWidgets!"); }

以上是 Hello world 的全部內(nèi)容,我個人感覺這個框架相比直接擼Windows API 還是簡單多了。
下面是 Hello world 完整代碼

#include <wx/wxprec.h> #ifndef WX_PRECOMP #include <wx/wx.h> #endif // WX_PRECOMPclass MyApp : public wxApp { public:virtual bool OnInit(); };class MyFrame : public wxFrame { public:// 構(gòu)造函數(shù)設置標題、窗口坐標,窗口尺寸MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size);private:// 響應菜單點擊事件void OnHello(wxCommandEvent &event);void OnExit(wxCommandEvent &event);void OnAbout(wxCommandEvent &event);// 聲明這個宏會創(chuàng)建一個類內(nèi)的靜態(tài)事件表(static event table)// 在實現(xiàn)文件中,使用 wxBEGIN_EVENT_TABLE 和 wxEND_EVENT_TABLE 宏// 添加一些 EVT_xxx 宏來捕獲事件wxDECLARE_EVENT_TABLE(); };const int ID_Hello = 1; // Hello 菜單的ID,必須是唯一的值wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)EVT_MENU(ID_Hello, MyFrame::OnHello)EVT_MENU(wxID_EXIT, MyFrame::OnExit)EVT_MENU(wxID_ABOUT, MyFrame::OnAbout) wxEND_EVENT_TABLE()wxIMPLEMENT_APP(MyApp);/** 函數(shù)實現(xiàn)部分 **/// OnInit的主要工作是創(chuàng)建主窗口 bool MyApp::OnInit() {// 創(chuàng)建 MyFrame 窗口,設置標題,窗口位置,窗口大小MyFrame *frame = new MyFrame("Hello world", wxPoint(50,50), wxSize(450, 340));frame->Show(true); // 顯示窗口return true; // 返回true表示繼續(xù)進程,false表示立即終止程序 }// 主窗口構(gòu)造函數(shù),調(diào)用 wxFrame 構(gòu)造函數(shù)時第一個參數(shù)是空指針,表示沒有父窗口 MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): wxFrame(nullptr, wxID_ANY, title, pos, size) {wxMenu *menuFile = new wxMenu; // File 菜單// File菜單添加Hello子菜單,支持ALT+H加速鍵和CTRL+H快捷鍵menuFile->Append(ID_Hello,"&Hello...\tCtrl-H","光標移動到Hello菜單上底部狀態(tài)欄顯示的文字");menuFile->AppendSeparator(); // 水平分割線menuFile->Append(wxID_EXIT); // 退出子菜單wxMenu *menuHelp = new wxMenu; // Help 菜單menuHelp->Append(wxID_ABOUT); // “關(guān)于”子菜單wxMenuBar *menuBar = new wxMenuBar; // 菜單欄控件menuBar->Append(menuFile, "&File");menuBar->Append(menuHelp, "&Help");SetMenuBar(menuBar); // 設置菜單欄CreateStatusBar(); // 創(chuàng)建底部狀態(tài)欄SetStatusText("歡迎使用 wxWidgets!"); // 設置狀態(tài)欄文字 }void MyFrame::OnExit(wxCommandEvent &event) {Close(true); // 關(guān)閉主窗口,true表示無需詢問,如果沒有其他主窗口,應用程序?qū)⑼顺?}// 點擊“關(guān)于”,彈出消息對話框 void MyFrame::OnAbout(wxCommandEvent &event) {wxMessageBox("This is a wxWidgets's Hello world sample","About Hello World",wxOK | wxICON_INFORMATION); }// 點擊Hello菜單,彈出日志對話框 void MyFrame::OnHello(wxCommandEvent &event) {wxLogMessage("Hello world from wxWidgets!"); }

總結(jié)

以上是生活随笔為你收集整理的wxWidgets学习 (1) -- Hello World 详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。