視窗解析
視窗繪制
當一個視窗需要重繪的時候,它将收到兩個事件,wxEVT_ERASE_BACKGROUND事件用于通知應用程式重新繪制背景, wxEVT_PAINT則用于通知重新繪制前景。
顔色和字型
每一個視窗都有一個前景色和一個背景色。預設的背景擦除函數會使用背景色來清除視窗背景,如果沒有設定背景色,則會使用目前的系統皮膚推 薦的顔色進行背景的清除。前景色則相對來說很少被用到。
改變大小
當一個視窗的大小,無論是來自使用者還是應用程式本身的原因,發生變化時,它将收到一個wxEVT_SIZE事件。如果這個視窗擁有子窗 口,它們可能需要被重新放置和重新計算大小。處理這種情況推薦的方法是使用sizer類。大多數已經确定的視窗類都有一個預設的大小和位置,這需要你在建立這些視窗的時候使用wxDefaultSize和 wxDefaultPosition這兩個特殊的值。
輸入
正變成活動狀 态的視窗會收到wxEVT_SET_FOCUS事件,而正失去焦點的視窗會收到wxEVT_KILL_FOCUS事件。
空閑事件處理和使用者界面更新
所有的視窗(除非特殊聲明)都将收到空閑事件wxEVT_IDLE,這個事件是在所有其它的事件都已經被處理完以後發出的。使用EVT_IDLE事件映射宏來處理。其中一個特殊的空閑時間操作就是進行使用者界面更新,在這個操作中所有的視窗都可以定義一個函數來更新自己的狀态。這個函數将會被周期性的 在系統空閑時調用。而EVT_UPDATE_UI(id, func)這個宏則通常不需要作什麼事情。
視窗的建立和删除
一般來說,視窗都是在堆上使用new方法建立的。大多數的視窗類都可以通過兩種方法被建立:單步建立和兩步建立。
使用一步建立的方法:wxButton* button = new wxButton(parent, wxID_OK);
除非是frame或者dialog視窗,對于别的視窗,都必須在構造函數中傳入一個非空的父視窗。這會自動把這個新視窗作為這個父視窗的子視窗。當父視窗被釋放的時候,它的所有的子視窗也将被釋放。
兩步建立的意思是說,你先使用預設的構造函數建立一個執行個體,然後再使用這個執行個體Create方法實際建立這個對象。Create的參數和前面使用的構造函數的參數完全相同。
wxButton* button = new wxButton;
button->Create(parent, wxID_OK);
視窗在你調用Create函數的時候會收到wxEVT_CREATE事件,你可以對這個事件進行進一步的處理。
使用兩步建立的原因是什麼呢?第一個原因是有時侯你可能想在晚些時候,在真正需要的時候才完整的建立視窗。另外一個原因是你希望在調用 Create函數之前設定視窗的某些屬性值。
視窗是通過調用其Destroy函數(對于頂層視窗來說)或者delete函數(對于其子視窗來說)來釋放的。wxEVT_DESTROY事件會在視窗剛剛要被釋放之前被調用。實際上,子視窗是被自動釋放的,是以delete函數是很少直接被手動調用的。
視窗類型
視窗擁有一個類型和一個擴充類型。視窗類型是設定視窗建立時的行為和外觀的一種簡潔的方法。這些類型的值被設定成可以使用類似比特位的方法操作,例如下面的例子:
wxCAPTION | wxMINIMIZE_BOX | wxMAXIMIZE_BOX | wxTHICK_FRAME
視窗類概覽
基本視窗類
wxWindow. 這是所有視窗類的基類。
wxControl. 所有控件(比如wxButton)的基類.
wxControlWithItems. 是那些擁有多個子項目的控件的基類.
頂層視窗類
頂層視窗類通常指那些獨立的位于桌面上的類。
wxFrame. 一個可以包含其他視窗,并且大小可變的視窗類。
wxMDIParentFrame. 是一個可以管理其他Frame類的類.
wxMDIChildFrame. 是一個可以被其父視窗管理的frame類.
wxDialog. 是一種可變大小的用于給使用者提供選項的視窗類.
wxPopupWindow. 是一種暫态的隻有很少修飾的頂層視窗.
容器視窗類
容器視窗類可以管理其他視窗
wxPanel. 這是一個給其它視窗提供布局的視窗.
wxNotebook. 可以實用TAB頁面進行切換的視窗.
wxScrolledWindow. 可以有滾動條的視窗.
wxSplitterWindow. 可以管理兩個子視窗的一種特殊視窗類.
非靜态控件視窗類
這些控件是使用者可以操作或者編輯的。
wxButton. 一種擁有一個标簽的按鈕控件.
wxBitmapButton. 一種擁有圖檔和标簽的按鈕控件.
wxChoice. 擁有一個下拉清單的選擇控件.
wxComboBox. 擁有一組選項的可編輯的選擇控件.
wxCheckBox. 擁有一個複選框的控件,複選框有選中和未選中兩種狀态.
wxListBox. 擁有一組可選擇的字元串項目的清單框.
wxRadioBox. 擁有一組選項的單選框.
wxRadioButton. 單選框.
wxScrollBar. 滾動條控件。
wxSpinButton. 一個擁有增加和減小兩個選項的按鈕.
wxSpinCtrl. 擁有一個文本編輯框和一個wxSpinButton用來編輯整數.
wxSlider. 這個控件用來在一個固定的範圍内選擇一個整數.
wxTextCtrl. 單行或者多行的文本編輯框.
wxToggleButton. 兩态按鈕.
靜态控件
這些控件提供不能被最終使用者編輯的靜态資訊
wxGauge. 用來顯式數量的控件.
wxStaticText. 文字标簽控件.
wxStaticBitmap. 用來顯示一幅靜态圖檔.
wxStaticLine. 用來顯式靜态的一行.
wxStaticBox. 用來在别的控件周圍顯示一個靜态的方框.
控件條
控件條通常在Frame視窗中使用,用來為資訊或者指令的通路提供快捷操作
wxMenuBar. wxFrame上的菜單條.
wxToolBar. 工具條.
wxStatusBar. 狀态條用來在程式運作過程中顯示運作期資訊.
基礎視窗類
視窗類wxWindow
wxWindow視窗類既是一個重要的基類,也是一個你可以直接在代碼中使用的類。
構造函數原型如下:
wxWindow(wxWindow* parent,
wxWindowID id,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxString& name = wxT("panel"));
視窗類型
如果在建立視窗的時候你沒有指定視窗的邊框類型,那麼在不同的平台上将會有不同的邊框類型的預設值。在windows平台上,控件邊框的預設值為 wxSUNKEN_BORDER,意為使用目前系統風格的邊框。你可以使用類似wxNO_BORDER這樣的值來覆寫系統的預設值。
wxSIMPLE_BORDER | 在視窗周圍顯示一個瘦邊框. |
wxDOUBLE_BORDER | 顯示一個雙層邊框. |
wxSUNKEN_BORDER | 顯示一個凹陷的邊框,或者使用目前視窗風格設定. |
wxRAISED_BORDER | 顯示一個凸起的邊框. |
wxSTATIC_BORDER | 顯示一個适合靜态控件的邊框. 隻支援Windows平台. |
wxNO_BORDER | 不顯示任何邊框. |
wxTRANSPARENT_WINDOW | 定義一個透明視窗 (意思是這個視窗不接收paint事件).隻支援windows平台. |
wxTAB_TRAVERSAL | 使用這個類型允許非Dialog視窗支援使用TAB進行周遊. |
wxWANTS_CHARS | 使用這個類型來允許視窗接收包括回車和TAB在内的所有的鍵盤事件。TAB用來在Dialog類型的視窗中周遊各控件。如果沒有設定這個類型,這些特殊的按鍵事件将不會被産生。 |
wxFULL_REPAINT_ON_RESIZE | 在預設情況下,在視窗客戶區大小發生改變時,wxWidgets并不會重畫整個客戶區。設定這個類型将使得wxWidgets改變這種預設的作法,而保持整個客戶區的重新整理 |
wxVSCROLL | 顯示垂直滾動條. |
wxHSCROLL | 顯示水準滾動條. |
wxALWAYS_SHOW_SB | 如果一個視窗有滾動條,那麼在不需要滾動條的時候(當視窗足夠大不需要使用滾動條的時候),禁止滾條而不隐藏滾動條。這個類型目前隻支援Windows平台和wxWidgets的wxUniversal版本. |
wxCLIP_CHILDREN | 隻支援Windows平台,用于消除由于擦除子視窗的背景而引起的閃铄. |
視窗的擴充類型,這些擴充類型不能直接和類型混用,而要使用wxWindow::SetExtraStyle函數來進行設定。
wxWS_EX_VALIDATE_RECURSIVELY | 在預設情況下,Validate,transferDataToWindow,和transferDataFromWindow隻在視窗的直接子視窗上才可以使用。如果設定了這個擴充類型,那麼将可以遞歸的在各個子視窗上使用。 |
wxWS_EX_BLOCK_EVENTS | wxCommandEvents事件将會在無法在目前事件表中找到比對的時候在其父視窗中嘗試比對,設定這個擴充屬性可以阻止這個行為。Dialog類型的視窗預設設定了這個類型,但是如果SetExtraStyle被應用程式類調用過的話,預設設定可能被覆寫. |
wxWS_EX_TRANSIENT | 不要使用這個視窗作為其它視窗的父視窗.這個類型一定隻能用于瞬間視窗;否則,如果使用它作為一個dialog或者frame類型視窗的父視窗,如果父視窗在子視窗之前釋放,可能導緻系統崩潰。 |
wxWS_EX_PROCESS_IDLE | 這個視窗應該處理所有的idle事件,包括那些設定了wxIDLE_PROCESS_SPECIFIED模式的idle事件。 |
wxWS_EX_PROCESS_UI_UPDATES | 這個視窗将處理所有的Ui重新整理事件,包括那些設定了wxUPDATE_UI_PROCESS_SPECIFIED的UI重新整理事件。參考第9章獲得和界面重新整理有關的更多的内容. |
視窗事件
EVT_WINDOW_CREATE(func) | 用于處理wxEVT_CREATE事件, 這個事件在視窗剛剛被産生的時候生成,處理函數的參數類型是wxWindowCreateEvent. |
EVT_WINDOW_DESTROY(func) | 用于處理wxEVT_DELETE事件,在這個視窗即将被删除的時候産生,處理函數的參數類型是wxWindowDestroyEvent. |
EVT_PAINT(func) | 用于處理wxEVT_PAINT事件,在視窗需要被重新整理的時候産生.處理函數的參數類型是wxPaintEvent. |
EVT_ERASE_BACKGROUND(func) | 用于處理wxEVT_ERASE_BACKGROUND事件,在視窗背景需要被更新的時候産生. 處理函數的參數是wxEraseEvent. |
EVT_MOVE(func) | 用于處理wxEVT_MOVE事件, 在視窗移動的時候産生.處理函數的參數類型是wxMoveEvent. |
EVT_SIZE(func) | 用于處理wxEVT_SIZE事件, 在視窗大小發生變化以後産生.處理函數的參數類型是wxSizeEvent. |
EVT_SET_FOCUS(func)EVT_KILL_FOCUS(func) | 用于處理wxEVT_SET_FOCUS和wxEVT_KILL_FOCUS事件,在視窗得到或者失去鍵盤焦點的時候産生. 處理函數參數類型是wxFocusEvent. |
EVT_SYS_COLOUR_CHANGED(func) | 用于處理wxEVT_SYS_COLOUR_CHANGED事件,當使用者在控制台裡更改了系統顔色的時候産生(隻支援windows平台). 處理函數參數類型為wxSysColourChangedEvent. |
EVT_IDLE(func) | 用于處理wxEVT_IDLE事件,在空閑事件産生.處理函數參數類型位wxIdleEvent. |
EVT_UPDATE_UI(func) | 用于處理wxEVT_UPDATE_UI事件,在系統空閑時間産生用來給視窗一個更新自己的機會. |
wxWindow類的成員函數
函數太多了,需要時再查詢吧。
wxControl類
wxControl是一個虛類。它繼承自wxWindow,用來作為控件的基類: 所謂控件指的是那些可以顯示資料項并且通常需要響應滑鼠或者鍵盤事件的那些視窗類.
wxControlWithItems類
wxControlWithItems也是一個虛類,用來作為wxWidgets的一些包含多個資料項的控件(比如wxListBox, wxCheckListBox,wxChoice和wxComboBox等)的基類。使用這個基類的目的為了給這些具有相似功能的控件提供一緻的API函 數。
wxControlWithItems的資料項擁有一個字元串和一個和這個字元串綁定的可選的客戶資料。客戶資料可以是兩種類型,要麼是無類型指針(void*),這意味這這個控件隻幫忙存儲客戶資料但是永遠不會使用客戶資料。另外一種是有類型(wxClientData)指針,對于後一種情況,客戶資料會在控件被釋放或者資料項被清除的時候被自動釋放。同一個控件的所有資料項必須擁有同樣的客戶區資料類型:要麼是前者,要麼是後者。客戶區資料的類型是在第一次調用Append函數或者,SetClientData函數或者SetClientObject函數的時候被确定的。如果要使用有類型指針客戶資料,你應該自定義一個繼承自wxClientData的類,然後将它的執行個體指針傳遞給Append函數或者 SetClientObject函數。