1. 程式人生 > >wxWidgets教程(18)——wxWizard與wxWebView使用方法

wxWidgets教程(18)——wxWizard與wxWebView使用方法

一、建立嚮導對話方塊wxWizard

1、建立一個帶有點陣圖的嚮導對話方塊

// 給嚮導對話方塊定義一個ID
#define wxID_WIZARD wxID_HIGHEST + 2
	// 嚮導圖,位於嚮導對話方塊的左側
	wxBitmap bitmap;
	bitmap.CopyFromIcon(wxICON(MAIN_ICON));

	wxWizard wizard;
	wizard.Create(this, wxID_WIZARD, wxT("嚮導設定"), bitmap);
	
	// 設定嚮導圖引數
	wizard.SetBitmapBackgroundColour(wxColour(255,0,0));
	wizard.SetBitmapPlacement(wxCENTER);
	wizard.SetMinimumBitmapWidth(200);
注:這裡有個bug,如果沒有在建構函式中設定點陣圖,那麼將無法設定點陣圖,SetBitmap函式使用不生效。

2、設定嚮導對話方塊中的頁面大小

	// 設定嚮導頁的尺寸大小
	wizard.SetPageSize(wxSize(600, 400));
	wizard.SetSizeHints(wxDefaultSize, wxDefaultSize);
3、新增2個嚮導頁面,並設定好上一頁與下一頁的頁面
	wxWizardPageSimple* page1 = new wxWizardPageSimple(&wizard);
	wxWizardPageSimple* page2 = new wxWizardPageSimple(&wizard);
	page1->SetNext(page2);
	page2->SetPrev(page1);
4、居中執行第一個頁面
	// 居中並執行
	wizard.Centre(wxBOTH);
	wizard.RunWizard(page1);

5、事件響應

wxEVT_WIZARD_PAGE_CHANGED
wxEVT_WIZARD_PAGE_CHANGING
wxEVT_WIZARD_CANCEL
wxEVT_WIZARD_HELP
wxEVT_WIZARD_FINISHED
wxEVT_WIZARD_PAGE_SHOWN
wxEVT_WIZARD_BEFORE_PAGE_CHANGED
這些事件可以傳遞到父視窗,如果你沒有從wxWizard類繼承的話,那麼可以讓wxWizard的父視窗MyFrame的事件表來響應,程式碼如下:
BEGIN_EVENT_TABLE(MyFrame, MainFrame)
	EVT_WIZARD_FINISHED(wxID_WIZARD, MyFrame::OnFinished)
	EVT_WIZARD_CANCEL(wxID_WIZARD, MyFrame::OnCancel)
END_EVENT_TABLE()

void MyFrame::OnFinished(wxWizardEvent& event) {
	wxLogDebug(wxT("完成"));
}

void MyFrame::OnCancel(wxWizardEvent& event) {
	wxLogDebug(wxT("取消"));
}

當然你也可以從wxWizard類繼承一個子類MyWizard,單獨另建一個檔案,事件表都是獨立處理的,而且可以重寫父類wxWizard的方法。

6、修改底部的按鈕文字

// 修改按鈕文字的巨集
#define WIZARD_BTN_TEXT(wizard,itemid,label) ((wxButton*)(wizard->FindItem(itemid)))->SetLabelText(label)

BEGIN_EVENT_TABLE(MyFrame, MainFrame)
	EVT_WIZARD_PAGE_CHANGED(wxID_WIZARD, MyFrame::OnPageChanged)
END_EVENT_TABLE()

void MyFrame::OnPageChanged(wxWizardEvent& event) {
	wxWizard * wizard = reinterpret_cast<wxWizard*>(FindWindowById(wxID_WIZARD));
	WIZARD_BTN_TEXT(wizard, wxID_FORWARD, wizard->HasNextPage(wizard->GetCurrentPage()) ? wxT("下一頁") : wxT("完成"));
	WIZARD_BTN_TEXT(wizard, wxID_CANCEL, wxT("取消"));
	WIZARD_BTN_TEXT(wizard, wxID_BACKWARD, wxT("上一頁"));
}

二、建立web控制元件wxWebView

注:如果頁面中的非同步js呼叫特別多,那麼將會卡GUI介面,這是一個很不好的地方,也說明封裝的不成熟

1、建立一個百度連結的web控制元件

	// 在面板m_panel4上建立一個web控制元件
	wxWebView * webView = wxWebView::New(m_panel4, wxID_ANY, wxT("https://www.baidu.com"));
	// 加入到垂直佈局中
	wxBoxSizer * sizer = new wxBoxSizer(wxVERTICAL);
	sizer->Add(webView,1,wxALL|wxEXPAND,0);
	m_panel4->SetSizer(sizer);
	m_panel4->Layout();
2、更改url
	// 變更url
	webView->LoadURL(wxT("http://www.sina.com.cn"));
3、控制元件比較難用,儘量不要頻繁跳轉,容易出各種問題,最好只用來展示某個頁面而已。