首先必須包含wxWidgets的頭文件。
1、可以在一個文件一個文件的基礎上完成(如wx/window.h)
2、使用一個全局包含(wx/wx.h),其中包括大多數(shù)常用的頭文件(雖然不是所有的頭文件,因為wxWidgets的頭文件太多,無法拉入所有的頭文件)。
對于支持預編譯頭文件的平臺,如WX_PRECOMP所示,這個全局頭文件wx/wx.h已經(jīng)包含在wx/wxprec.h中,所以我們可以只需要包含wx/wxprec.h。
#include#ifndef WX_PRECOMP
#include#endif
事件實際上,每個應用都應該定義一個派生自wxApp的新類。通過重寫wxApp的OnInit()虛方法,程序可以被初始化,例如創(chuàng)建一個新的主窗口。
現(xiàn)在程序如下了
#include#ifndef WX_PRECOMP
#include#endif
// application class
class MyApp : public wxApp
{public:
virtual bool OnInit();
};
主窗口是通過從wxFrame派生一個類并在構造函數(shù)中為其提供一個菜單和一個狀態(tài)欄來創(chuàng)建的。此外,任何希望響應“事件”(如鼠標單擊、菜單消息或按鈕)的類都必須使用下面的宏聲明一個事件表。
class MyFrame : public wxFrame
{public:
MyFrame();
private:
void OnHello(wxCommandEvent& event);
void OnExit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
};
最后,對這類事件的響應是通過“事件處理程序”完成的,它只是函數(shù)(或功能詞,如果使用c++ 11則包括lambdas),接受與被處理事件對應的類型的事件參數(shù),例如wxCommandEvent用于來自簡單控件的事件,如按鈕、文本字段和菜單項。
對三個菜單項做出反應:自定義的“Hello”,以及“Exit”和“About”項(任何程序通常都應該實現(xiàn)后兩者)。注意,這些處理程序不需要是虛擬的或公共的。
為了能夠?qū)Σ藛蚊钭龀龇磻?,它必須被賦予一個唯一的標識符,可以定義為const變量或enum元素。后者經(jīng)常被使用,因為通常需要許多這樣的常量:
enum
{ID_Hello = 1
};
不需要為“About”和“Exit”定義標識符,因為wxWidgets已經(jīng)預先定義了標準值,如wxID_ABOUT和wxID_EXIT。您應該盡可能地使用它們,因為它們可以由特定的平臺以特殊的方式處理。
main入口函數(shù)和所有程序一樣,必須有一個“main”函數(shù)。在wxWidgets下,main是在wxIMPLEMENT_APP()宏中實現(xiàn)的,它創(chuàng)建指定類的應用程序?qū)嵗㈤_始運行GUI事件循環(huán)。它可以簡單地這樣使用:
wxIMPLEMENT_APP(MyApp);
如上所述,wxApp::OnInit()在啟動時被調(diào)用,應該用來初始化程序,可能會顯示一個“啟動畫面”并創(chuàng)建主窗口(或幾個)。默認情況下,框架是隱藏創(chuàng)建的,以允許在顯示它們之前創(chuàng)建子窗口。因此,我們需要顯式地顯示它們。最后,從這個方法返回true,表示成功初始化:
bool MyApp::OnInit()
{MyFrame *frame = new MyFrame();
frame->Show(true);
return true;
}
現(xiàn)在程序如下了
#include#ifndef WX_PRECOMP
#include#endif
// application class
class MyApp : public wxApp
{public:
virtual bool OnInit();
};
wxIMPLEMENT_APP(MyApp);
bool MyApp::OnInit()
{MyFrame *frame = new MyFrame();
frame->Show(true);
return true;
}
在主窗口(或稍后)的構造函數(shù)中,創(chuàng)建了一個包含菜單項的菜單,以及一個將顯示在主窗口底部的狀態(tài)欄。兩者都必須綁定到具有各自調(diào)用的幀。
MyFrame::MyFrame()
: wxFrame(NULL, wxID_ANY, "Hello World")
{wxMenu *menuFile = new wxMenu;
menuFile->Append(ID_Hello, "&Hello...\tCtrl-H",
"Help string shown in status bar for this menu item");
menuFile->AppendSeparator();
menuFile->Append(wxID_EXIT);
wxMenu *menuHelp = new wxMenu;
menuHelp->Append(wxID_ABOUT);
wxMenuBar *menuBar = new wxMenuBar;
menuBar->Append(menuFile, "&File");
menuBar->Append(menuHelp, "&Help");
SetMenuBar(menuBar);
CreateStatusBar();
SetStatusText("Welcome to wxWidgets!");
』
下面是2個菜單項
wxMenu *menuFile = new wxMenu;
menuFile->Append(ID_Hello, "&Hello...\tCtrl-H",
"Help string shown in status bar for this menu item");
menuFile->AppendSeparator();
menuFile->Append(wxID_EXIT);
wxMenu *menuHelp = new wxMenu;
menuHelp->Append(wxID_ABOUT);
SetMenuBar(menuBar);
狀態(tài)欄CreateStatusBar();
SetStatusText("Welcome to wxWidgets!");
注意,我們不需要為標準菜單項wxID_ABOUT和wxID_EXIT指定標簽——它們將被賦予標準(甚至正確翻譯)標簽和標準加速器,以適應當前平臺,使我們的程序行為更加本機。因此,您應該盡可能重用標準id(參見Stock Items)。
事件處理程序我們還必須將我們的事件處理程序連接到我們想在其中處理的事件。為此,我們調(diào)用Bind()將所有帶有指定ID的菜單事件(由wxEVT_MENU事件類型標識)發(fā)送到給定函數(shù)。傳遞給Bind()的參數(shù)為
1、事件類型,例如wxEVT_MENU, wxEVT_BUTTON, wxEVT_SIZE,或wxWidgets使用的許多其他事件之一。
2、一個指針,指向要調(diào)用的方法和要調(diào)用它的對象。在本例中,我們只需調(diào)用自己的函數(shù),并將this指針傳遞給對象本身。我們可以調(diào)用另一個對象的方法,或者非成員函數(shù)的方法——實際上,任何可以用wxCommandEvent調(diào)用的對象都可以在這里使用。
3、一個可選標識符,允許我們只選擇wxEVT_MENU類型的一些事件,即來自具有給定ID的菜單項的事件,而不是在提供的處理程序中處理所有事件。這主要用于菜單項,很少用于其他類型的事件。
Bind(wxEVT_MENU, &MyFrame::OnHello, this, ID_Hello);
Bind(wxEVT_MENU, &MyFrame::OnAbout, this, wxID_ABOUT);
Bind(wxEVT_MENU, &MyFrame::OnExit, this, wxID_EXIT);
下面是標準的事件處理程序?qū)崿F(xiàn)。OnExit()通過調(diào)用Close()關閉主窗口。參數(shù)true表示其他窗口沒有否決權,例如在詢問“您真的想關閉嗎?”之后。如果沒有其他主窗口,應用程序?qū)⑼顺觥?/p>
void MyFrame::OnExit(wxCommandEvent& event)
{Close(true);
}
MyFrame::OnAbout()將顯示一個包含一些文本的小窗口。在本例中是一個典型的“關于”窗口,其中包含有關程序的信息。
void MyFrame::OnAbout(wxCommandEvent& event)
{wxMessageBox("This is a wxWidgets Hello World example",
"About Hello World", wxOK | wxICON_INFORMATION);
}
自定義菜單命令處理程序的實現(xiàn)可以執(zhí)行程序需要執(zhí)行的任何任務,在這種情況下,我們將簡單地顯示來自它的一條消息,以適合Hello World示例:
void MyFrame::OnHello(wxCommandEvent& event)
{wxLogMessage("Hello world from wxWidgets!");
}
在c++ 11程序中,使用未命名的lambdas而不是函數(shù)作為事件處理程序是很方便的,特別是在處理來自控件的事件時,因為這允許將創(chuàng)建控件的代碼和處理其事件的代碼放在同一個位置。例如,在這里,我們可以用just替換wxID_EXIT處理程序
Bind(wxEVT_MENU, [=](wxCommandEvent&) {Close(true); }, wxID_EXIT);
全部程序如下
// wxWidgets "Hello World" Program
// For compilers that support precompilation, includes "wx/wx.h".
#include#ifndef WX_PRECOMP
#include#endif
class MyApp : public wxApp
{public:
virtual bool OnInit();
};
class MyFrame : public wxFrame
{public:
MyFrame();
private:
void OnHello(wxCommandEvent& event);
void OnExit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
};
enum
{ID_Hello = 1
};
wxIMPLEMENT_APP(MyApp);
bool MyApp::OnInit()
{MyFrame *frame = new MyFrame();
frame->Show(true);
return true;
}
MyFrame::MyFrame()
: wxFrame(NULL, wxID_ANY, "Hello World")
{wxMenu *menuFile = new wxMenu;
menuFile->Append(ID_Hello, "&Hello...\tCtrl-H",
"Help string shown in status bar for this menu item");
menuFile->AppendSeparator();
menuFile->Append(wxID_EXIT);
wxMenu *menuHelp = new wxMenu;
menuHelp->Append(wxID_ABOUT);
wxMenuBar *menuBar = new wxMenuBar;
menuBar->Append(menuFile, "&File");
menuBar->Append(menuHelp, "&Help");
SetMenuBar( menuBar );
CreateStatusBar();
SetStatusText("Welcome to wxWidgets!");
Bind(wxEVT_MENU, &MyFrame::OnHello, this, ID_Hello);
Bind(wxEVT_MENU, &MyFrame::OnAbout, this, wxID_ABOUT);
Bind(wxEVT_MENU, &MyFrame::OnExit, this, wxID_EXIT);
}
void MyFrame::OnExit(wxCommandEvent& event)
{Close(true);
}
void MyFrame::OnAbout(wxCommandEvent& event)
{wxMessageBox("This is a wxWidgets Hello World example",
"About Hello World", wxOK | wxICON_INFORMATION);
}
void MyFrame::OnHello(wxCommandEvent& event)
{wxLogMessage("Hello world from wxWidgets!");
}
運行結果如下
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧