# 4.6 非靜態控件
非靜態控件指的是那些可以響應鼠標和鍵盤事件的類似wxButton和wxListBox之類的控件。這里我們會對其中最基本的那些進行一些描述。更高級的內容被安排在第12章,你可以參考附錄E中的方法從網上下載或者創建你自己的更高級的控件。
wxButton
wxButton控件看上去象是一個物理上可以按下的按鈕,它擁有一個文本標簽,是用戶界面中最常用的一個元素,它可以被放置在對話框,或者面板(wxPanel)或者幾乎任何其它的窗口中。當用戶點擊按鈕的時候,會產生一個命令類型的事件。
下面是創建按鈕的一個簡單的例子:
```
#include "wx/button.h"
wxButton* button = new wxButton(panel, wxID_OK, wxT("OK"),
wxPoint(10, 10), wxDefaultSize);
```
下圖演示了按鈕在Windows Xp系統上的默認外觀:

wxWidgets創建的按鈕的默認大小是依靠靜態函數wxButton::GetDefaultSize指定的,這個函數在不同的平臺上返回不同的值。不過你可以通過給按鈕指定wxBU_EXACTFIT類型來使其產生剛好符合其標簽尺寸的大小。
wxButton的窗口類型
| wxBU_LEFT | 標簽文本作對齊. 僅適用于Windows和GTK+平臺. |
|:--- |:--- |
| wxBU_TOP | 標簽文本上對齊. 僅適用于Windows和GTK+平臺. |
| wxBU_RIGHT | 標簽文本右對齊。僅適用于Windows和GTK+. |
| wxBU_BOTTOM | 標簽文本對齊按鈕底部. 僅適用于Windows和GTK+平臺. |
| wxBU_EXACTFIT | 不使用默認大小創建按鈕,而是按照其標簽文本的大小來創建按鈕. |
| wxNO_BORDER | 創建一個平面按鈕。僅適用于Windows和GTK+平臺. |
wxButton的事件
wxButton可以創建類型為wxCommandEvent的事件,如下表所示:
| | |
| --- | --- |
| EVT_BUTTON(id,func) | 用于處理wxEVT_COMMAND_BUTTON_CLICKED事件,在用戶用左鍵單擊按鈕的時候產生. |
wxButton的成員函數
wxButton的成員函數
SetLabel和GetLabel函數用來操作按鈕標簽文本.你可以使用"&"前導符來指示用于這個按鈕的快捷鍵,僅適用于Windows和GTK+平臺. SetDefault將按鈕設置為其父窗口的默認按鈕,這樣用戶按回車鍵就相當于用左鍵點擊了這個按鈕.
wxButton的標簽
你可以使用一個前導符"&"來指定其后的字符為這個按鈕的快捷鍵,不過這個操作僅適用于Windows和GTK+的版本,在其它的平臺上,這個前導符將被簡單的忽略。
在某些系統,尤其是GTK+系統中,例如確定或者新建這樣的標準按鈕的標簽以及附帶顯示的一些小圖片都被進行了默認的定義。在wxWidgets中,通常 你只需要指定這個按鈕的標識符為系統預定義的標識符,那么這些預定義的標簽和小圖片將被顯示,不過,指定和默認值不同的標簽文本以及小圖片的操作都是允許 的。
推薦的對于這些預定義按鈕的使用方法如下,你只需要指定預定義的標識符,不需要指定標簽文本,或者指定標簽文本為空字符串:
```
wxButton* button = new wxButton(this, wxID_OK);
```
wxWidgets會各種平臺提供合適的標簽,在上面的例子中,在windows或者Mac OSX平臺上,將使用字符串"&OK",而在GTK+系統中,會使用當前語言下的OK按鈕標簽。然后如果你提供了自己的標簽文本, wxWidgets將會按照你的指示辦事:
```
wxButton* button = new wxButton(this, wxID_OK, wxT("&Apply"));
```
這會導致無論在哪種平臺上,這個按鈕都將覆蓋標準標識符的定義,使用"Apply"作為這個按鈕的標簽。
你可以使用wxGetStockLabel函數(需要包含wx/stockitem.h這個頭文件)來獲得某個預定義窗口標識符的標簽,使用窗口標識符和true(如果你希望在返回的結果中包含前導符(&))作為參數.
下表列出了預定義標識符和其默認標簽的對應關系。
| 預定義標識符 | 預定義標簽 |
| --- | --- |
| wxID_ADD | "Add" |
| wxID_APPLY | "&Apply" |
| wxID_BOLD | "&Bold" |
| wxID_CANCEL | "&Cancel" |
| wxID_CLEAR | "&Clear" |
| wxID_CLOSE | "&Close" |
| wxID_COPY | "&Copy" |
| wxID_CUT | "Cu&t" |
| wxID_DELETE | "&Delete" |
| wxID_FIND | "&Find" |
| wxID_REPLACE | "Rep&lace" |
| wxID_BACKWARD | "&Back" |
| wxID_DOWN | "&Down" |
| wxID_FORWARD | "&Forward" |
| wxID_UP | "&Up" |
| wxID_HELP | "&Help" |
| wxID_HOME | "&Home" |
| wxID_INDENT | "Indent" |
| wxID_INDEX | "&Index" |
| wxID_ITALIC | "&Italic" |
| wxID_JUSTIFY_CENTER | "Centered" |
| wxID_JUSTIFY_FILL | "Justified" |
| wxID_JUSTIFY_LEFT | "Align Left" |
| wxID_JUSTIFY_RIGHT | "Align Right" |
| wxID_NEW | "&New" |
| wxID_NO | "&No" |
| wxID_OK | "&OK" |
| wxID_OPEN | "&Open" |
| wxID_PASTE | "&Paste" |
| wxID_PREFERENCES | "&Preferences" |
| wxID_PRINT | "&Print" |
| wxID_PREVIEW | "Print previe&w" |
| wxID_PROPERTIES | "&Properties" |
| wxID_EXIT | "&Quit" |
| wxID_REDO | "&Redo" |
| wxID_REFRESH | "Refresh" |
| wxID_REMOVE | "Remove" |
| wxID_REVERT_TO_SAVED | "Revert to Saved" |
| wxID_SAVE | "&Save" |
| wxID_SAVEAS | "Save &As..." |
| wxID_STOP | "&Stop" |
| wxID_UNDELETE | "Undelete" |
| wxID_UNDERLINE | "&Underline" |
| wxID_UNDO | "&Undo" |
| wxID_UNINDENT | "&Unindent" |
| wxID_YES | "&Yes" |
| wxID_ZOOM_100 | "&Actual Size" |
| wxID_ZOOM_FIT | "Zoom to &Fit" |
| wxID_ZOOM_IN | "Zoom &In" |
| wxID_ZOOM_OUT | "Zoom &Out" |
wxBitmapButton
和普通按鈕唯一不同的地方在于,它將顯示一個小圖片而不是標簽文本。
下面演示了創建一個圖片按鈕的方法:
```
#include "wx/bmpbuttn.h"
wxBitmap bitmap(wxT("print.xpm"), wxBITMAP_TYPE_XPM);
wxBitmapButton* button = new wxBitmapButton(panel, wxID_OK,
bitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW);
```
以及在Windows平臺上的顯示效果:

圖片按鈕通常只需要指定一個擁有透明背景的圖片,wxWidgets將會在任何狀態的時候都使用這個圖片,不過如果你愿意,你可以給不同的按鈕狀態指定不同的圖片,比如選中狀態,釋放按鈕狀態以及不可用狀態等。
XPM圖片格式是推薦的圖片格式,因為它可以很容易的提供透明相關的信息以及可以被包含在C++代碼中。不過加載別的格式的圖片也是可以的,比如常見的JPEG,PNG,GIF以及BMP格式。
wxBitmapButton的窗口類型
| wxBU_AUTODRAW | 如果指定了這個類型,圖片按鈕將只會使用標簽圖片以系統默認的方式自動被繪制,它將包含邊框和3D的外觀。如果沒有指定這個類型,圖片按鈕將按照不同狀態提供的不同的圖片來進行繪制. 這個類型僅適用于Windows和Mac OS. |
|:--- |:--- |
| wxBU_LEFT | 圖片左對齊. 在Mac OS上忽略這個類型. |
| wxBU_TOP | 圖片頂端對齊. Mac OS不適用. |
| wxBU_RIGHT | 圖片右對齊. Mac OS不適用. |
| wxBU_BOTTOM | 圖片底端對齊. Mac OS不適用. |
wxBitmapButton事件
圖片按鈕的事件和wxButton完全相同.
wxBitmapButton的成員函數
SetBitmapLabel和GetBitmapLabel用來操作按鈕的主要標簽圖片. 你還可以使用SetBitmapFocus, SetBitmapSelected, 和SetBitmapDisabled函數來設置按鈕被激活,被按下以及被禁用狀態下對應的圖片。
SetDefault將按鈕設置為其父窗口的默認按鈕,這樣用戶按回車鍵就相當于用左鍵點擊了這個按鈕.
wxChoice
選擇控件由一個只讀的文本區域組成,這個區域的文本通過對一個附屬的下拉列表框中值進行選擇來進行賦值。這個下拉列表框是默認不可見的,只有在用戶用鼠標點擊下拉按鈕以后才會顯示。
創建一個選擇控件的代碼如下,其中的參數含義依次為:父窗口,標識符,位置,大小,窗口類型以及文本選項。
```
#include "wx/choice.h"
wxArrayString strings;
strings.Add(wxT("One"));
strings.Add(wxT("Two"));
strings.Add(wxT("Three"));
wxChoice* choice = new wxChoice(panel, ID_COMBOBOX,
wxDefaultPosition, wxDefaultSize, strings);
```
在大多數平臺上,除了文本區域的文本是只讀的以外,選擇控件和wxComboBox(如下圖所示)是非常相似的。在GTK+平臺上,選擇控件是一個擁有一 個下拉菜單的按鈕。你可以用過設置wxComboBox窗口的只讀屬性來模擬選擇控件,以便能夠使得在選項過多的時候使用滾動條。

wxChoice的窗口類型
wxChoice控件沒有特別的窗口類型.
wxChoice的事件
wxChoice控件產生wxCommandEvent類型的事件,如下表所示:
| | |
| --- | --- |
| VT_CHOICE(id,func) | 用于處理wxEVT_COMMAND_CHOICE_SELECTED事件,當有用戶通過列表選擇某個選項的時候產生. |
wxChoice的成員函數
wxChoice相關的成員函數都是前面介紹過的wxControlWithItems類的函數,如: Clear, Delete, FindString, GetClientData, GetClientObject, SetClientData, SetClientObject, GetCount, GetSelection, SetSelection, GetString, SetString, GetStringSelection, SetStringSelection, Insert, 和IsEmpty.
wxComboBox
ComboBox是一個單行編輯框和一個列表框的組合,用來允許用戶以和下拉框中的文本沒有關系的方式設置或者獲取編輯框中的文本。其中 的單行文本域可以是只讀的,在這種情況下就和選擇控件非常相似了。和選擇控件一樣,通常列表框是隱藏的,除非用戶單擊了編輯框旁邊的小按鈕。這個控件的目 的在提供一種緊湊的方法給用戶,使他們既可以自己輸入文本,也可以很方便的選擇預定義好的文本。
創建一個ComboBox的方法和創建選擇控件的方法很類似,如下所示:
```
#include "wx/combobox.h"
wxArrayString strings;
strings.Add(wxT("Apple"));
strings.Add(wxT("Orange"));
strings.Add(wxT("Pear"));
strings.Add(wxT("Grapefruit"));
wxComboBox* combo = new wxComboBox(panel, ID_COMBOBOX,
wxT("Apple"), wxDefaultPosition, wxDefaultSize,
strings, wxCB_DROPDOWN);
```
wxComboBox的窗口類型
| wxCB_SIMPLE | 列表框永遠顯示. 僅適用于Windows平臺. |\
|:--- |:--- |
| wxCB_DROPDOWN | 列表框下拉顯示. |
| wxCB_READONLY | 和wxCB_DROPDOWN的含義相同,只不過編輯框的文本只能通過列表框進行選擇,即使在應用程序的代碼里,也不允許編輯框中的文本不存在于列表框內。 |
| wxCB_SORT | 列表框中的選項自動按照子母順序排序. |
wxComboBox的事件
wxComboBox產生的是wxCommandEvent類型的事件,如下表所示:
| EVT_TEXT(id, func) | 用來處理wxEVT_COMMAND_TEXT_UPDATED事件,當編輯框內文本變化時產生. |
|:--- |:--- |
| EVT_COMBOBOX(id, func) | 用來處理wxEVT_COMMAND_COMBOBOX_SELECTED事件,當用戶通過列表框選擇一個選項的時候產生. |
wxComboBox的成員函數
除了wxControlWithItems的成員函數以外,額外的成員函數還包括:
Copy函數將編輯框中的文本拷貝到剪貼板, Cut函數除了作Copy函數的動作,還將編輯框中的文本清空, Paste函數則把剪貼板內的文本復制到編輯框中。
GetInsertionPoint函數返回當前編輯框中插入點的位置(長整型),SetInsertionPoint則用來設置這個位置.SetInsertionPointEnd用來將其設置到編輯框末尾。
GetLastPosition返回編輯框中的最后位置。
GetValue函數用來返回編輯框中的文本,SetValue則用來設置它.如果combobox擁有wxCB_READONLY類型,則參數中的文本必須在列表框內,否則在發表版本中,這條語句將被忽略,而在調試版本中,則會出現一個告警。
SetSelection用來設置文本框中的一部分為選中狀態,Replace則將文本框中的某一部分由給定的參數取代。Remove則移除文本框中的給定部分.
請同時參考wxControlWithItems類的這些成員函數: Clear, Delete, FindString, GetClientData, GetClientObject, SetClientData, SetClientObject, GetCount, GetSelection, SetSelection, GetString, SetString, GetStringSelection, SetStringSelection, Insert, 和IsEmpty.
wxCheckBox
CheckBox是一個通常擁有兩種狀態:選中或者未選中的控件。通常情況下,如果是選中的狀態,則控件上顯示一個小的叉號或者對號。通 常這個控件還包含一個標簽,這個標簽可以顯示在控件的左邊,也可以顯示在控件的右邊。CheckBox控件甚至還可以有第三個狀態,姑且稱之為混合狀態或 者不確定狀態。一個典型的用法是在安裝程序中,對于某個組件來說除了要安裝和不要安裝兩種狀態以后,還可以有必須安裝這種狀態。
下面是創建CheckBox的例子代碼:
```
#include "wx/checkbox.h"
wxCheckBox* checkbox = new wxCheckBox(panel, ID_CHECKBOX,
wxT("&Check me"), wxDefaultPosition, wxDefaultSize);
checkBox->SetValue(true);
```
以及在windows平臺上控件的樣子:

以及另外的一個三態的wxCheckBox第三態的樣子:

wxCheckBox的窗口類型
| wxCHK_2STATE | 創建一個二態選擇框,這是默認類型. |
|:--- |:--- |
| wxCHK_3STATE | 創建一個三態選擇框. |
| wxCHK_ALLOW_3RD_STATE_FOR_USER | 默認情況下,用戶是不能設置第三種狀態的,第三種狀態只能在程序中通過代碼來設置,使用這個類型可使得用戶也可以通過鼠標設置第三態. |
| wxALIGN_RIGHT | 使標簽顯示在選擇框的左邊. |
wxCheckBox的事件
wxCheckBox產生wxCommandEvent類型的事件,如下表所示:
| | |
| --- | --- |
| EVT_CHECKBOX(id, func) | 用于處理 wxEVT_COMMAND_CHECKBOX_CLICKED事件, 當wxCheckBox的選擇狀態改變時產生. |
wxCheckBox的成員函數
SetLabel和GetLabel用來設置選擇框的標簽文本. 在Windows和GTK+平臺上,可以通過"&"前導字符設置快捷鍵.
GetValue和SetValue用來操作Bool型的當前選擇狀態. 使用Get3StateValue和Set3StateValue來操作三種狀態wxCHK_UNCHECKED, wxCHK_CHECKED,或wxCHK_UNDETERMINED.
Is3State用于檢測是否是三態選擇框。
IsChecked用于檢測當前是否為選中狀態。
wxListBox 和 wxCheckListBox
wxListBox用來從一組基于0索引的字符串列表中選擇一個或者多個。這一組備選的字符串列表顯示在一個滾動窗口中,選中的文本被高 亮顯示.列表框可以是單選的,這種情況下,如果一個選項被選中,以前被選中的選項就自動變為未選中狀態,也可以是多選框,這種狀態下,對某個選項的點擊只 會導致這個選項的選中狀態進行切換。
使用下面的代碼創建一個列表框:
```
#include "wx/listbox.h"
wxArrayString strings;
strings.Add(wxT("First string"));
strings.Add(wxT("Second string"));
strings.Add(wxT("Third string"));
strings.Add(wxT("Fourth string"));
strings.Add(wxT("Fifth string"));
strings.Add(wxT("Sixth string"));
wxListBox* listBox = new wxListBox(panel, ID_LISTBOX,
wxDefaultPosition, wxSize(180, 80), strings, wxLB_SINGLE);
```
在windows下的樣子:

wxCheckListBox是wxListBox的派生類,繼承了它的功能,另外它還在每個選項上額外顯示一個復選框. 這個類包含在頭文件wx/checklst.h中,下圖演示了wxCheckListBox控件在windows上的樣子:

如果有很多選項要顯示,你可以考慮使用wxVListBox。這是一個虛的列表框類,它用來顯示每個選項的方法是你在繼承自這個類的派生類中實現的OnDrawItem函數和OnMeasureItem函數,而它的事件映射宏的格式則和wxListBox的一模一樣。
wxHtmlListBox就是一個wxVListBox的派生類,它提供了顯示復雜選項的一種簡單的方法。你需要定義一個 wxHtmlListBox的派生類,然后在其OnGetItem函數中,為每個選項定義一段HTML文本,然后wxHtmlListBox則按照這段 HTML文本來顯示各個選項。下圖演示了光盤例子samples/htlbox在Windows Xp上的效果,在這個例子中,通過重載OnDrawSeparator函數實現不同選項的不同顯示。

wxListBox和wxCheckListBox的窗口類型
| wxLB_SINGLE | 單選列表. |
|:--- |:--- |
| wxLB_MULTIPLE | 多選列表. |
| wxLB_EXTENDED | 擴展選擇選項,用戶可以通過Shift鍵或者鼠標以及其它一些鍵盤綁定進行快速多選. |
| wxLB_HSCROLL | 創建水平滾動條如果選項的值過長. Windows only. |
| wxLB_ALWAYS_SB | 總顯示垂直滾動條. |
| wxLB_NEEDED_SB | 只在需要的時候顯示垂直滾動條. |
| wxLB_SORT | 所有選項自動按照子母順序排序. |
wxListBox的wxCheckListBox事件
wxListBox和wxCheckListBox產生的事件類型wxCommandEvent類型的事件.
| EVT_LISTBOX(id, func) | 用于處理wxEVT_COMMAND_LISTBOX_SELECTED事件,當用戶選擇某個選項的時候產生. |
|:--- |:--- |
| EVT_LISTBOX_DCLICK(id, func) | 用于處理wxEVT_COMMAND_LISTBOX_DOUBLECLICKED事件, 當某個選項被雙擊的時候產生. |
| EVT_CHECKLISTBOX (id, func) | 用于處理wxEVT_COMMAND_CHECKLISTBOX_TOGGLED事件,當wxCheckListBox的某個選項的選中狀態發生改變的時候產生。 |
wxListBox 成員函數
Deselect不選則某個選項。 GetSelections使用wxArrayInt類型返回一組選中的索引。 InsertItems用來插入一組選項,參數可以是個數和C++的wxString數組,以及插入點的組合,也可以是wxArrayString對象和插入點的組合.
Selected用來判斷某個選項是否被選中。
Set用來清除選項并且用參數中的選項組重置選項。參數可以是個數和C++的wxString數組,以及插入點的組合,也可以是wxArrayString對象和插入點的組合.
SetFirstItem將某個選項設置為第一個可見的選項。
SetSelection和SetStringSelection用索引或者字符創值的方式指定某個選項的選中狀態。
請同時參考wxControlWithItems的下列成員函數: Clear, Delete, FindString, GetClientData, GetClientObject, SetClientData, SetClientObject, GetCount, GetSelection, GetString, SetString, GetStringSelection, Insert, 和IsEmpty.
wxCheckListBox的成員函數
除了wxListBox的成員函數以外,wxCheckListBox還另外擁有下面的函數:
Check函數使用選項索引和一個bool值作為參數也控制選項的選中狀態。
IsChecked用來判斷某個選項是否為選中狀態。
wxRadioBox
Radio Box用來在一組相關但是互斥的選項中進行選擇。通常顯示為一個可以擁有一個文本標簽的靜態框中的一組垂直的或者水平的選項按鈕。
這些選項按鈕的排列方式取決于構造函數中的兩個參數,欄數和方向窗口有關的類型,方向有關的窗口類型包括wxRA_SPECIFY_COLS(默認值)和 wxRA_SPECIFY_ROWS,舉例來說,如果你的radio box共有8個選項,欄數為2,方向為wxRA_SPECIFY_COLS,那么這些選項將會以兩列四行的方式顯示,而假如方向為 wxRA_SPECIFY_ROWS,則顯示為四列兩行。
下面演示了怎樣創建一個有三欄的RadioBox:
```
#include "wx/radiobox.h"
wxArrayString strings;
strings.Add(wxT("&One"));
strings.Add(wxT("&Two"));
strings.Add(wxT("T&hree"));
strings.Add(wxT("&Four "));
strings.Add(wxT("F&ive "));
strings.Add(wxT("&Six "));
wxRadioBox* radioBox = new wxRadioBox(panel, ID_RADIOBOX,
wxT("Radiobox"), wxDefaultPosition, wxDefaultSize,
strings, 3, wxRA_SPECIFY_COLS);
```
以及它在windows系統中的樣子:

wxRadioBox的窗口類型
wxRadioBox額外的窗口類型如下表所示:
| wxRA_SPECIFY_ROWS | 橫向分欄. |
|:--- |:--- |
| wxRA_SPECIFIY_COLS | 縱向分欄. |
wxRadioBox事件
wxRadioBox產生wxCommandEvent類型的事件,如下表所示:
| | |
| --- | --- |
| EVT_RADIOBOX(id, func) | 用來處理wxEVT_COMMAND_RADIOBOX_SELECTED事件,當用戶點擊選項的時候產生. |
wxRadioBox成員函數
Enable選中(或不選)某個選項.
FindString查找匹配的選項,返回這個選項的索引或者wxNOT_FOUND.
GetCount返回選項的總數。
GetString和SetString用來操作某個選項的標簽文本. GetLabel和SetLabel則用來操作整個radio box的標簽.
GetSelection返回基于0的選中的選項的索引. GetStringSelection則返回選中的選項的標簽文本. SetSelection和SetStringSelection則用來設置對應的選項,通過這兩個函數進行設置時不會發送任何事件。
Show函數用來顯示或者隱藏某個特定的選項或者整個radio box控件。
wxRadioButton
一個radio按鈕通常用來表示一組相關但是互斥的選項中的一個,它擁有一個按鈕和一個文本標簽,這個按鈕的外觀通常是一個圓形。
radio按鈕有兩種狀態:選中和未選中。你可以創建一組radio按鈕來代替前面介紹的radiobox控件,這樣作的方法是,給第一個radio按鈕 指定wxRB_GROUP類型,然后直到另外一個組被創建,或者沒有同級的子控件的時候,這個組才結束,組中的控件既可以是radio按鈕,也可以是別的 控件。
為什么要代替radiobox呢,其中一個原因是有時候你需要使用更復雜的布局,例如,你可能希望給每一個radio按鈕增加一個額外的描述或者增加一個額外的窗口控件,又或者你不希望在一組radio周圍顯示一個靜態的邊框等。

下面是創建一組(兩個按鈕的代碼):
```
#include "wx/radiobut.h"
wxRadioButton* radioButton1 = new wxRadioButton (panel,
ID_RADIOBUTTON1, wxT("&Male"), wxDefaultPosition,
wxDefaultSize, wxRB_GROUP);
radioButton1->SetValue(true);
wxRadioButton* radioButton2 = new wxRadioButton (panel,
ID_RADIOBUTTON2, wxT("&Female"));
//用于水平放置兩個按鈕的布局控件使用的代碼
wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
sizer->Add(radioButton1, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
sizer->Add(radioButton2, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
parentSizer->Add(sizer, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
```
wxRadioButton的窗口類型
| wxRB_GROUP | 用來標識一組radio按鈕的開始. |
|:--- |:--- |
| wxRB_USE_CHECKBOX | 使用checkbox的按鈕取代radio按鈕(僅適用于Palm OS). |
wxRadioButton的事件
wxRadioButton產生wxCommandEvent類型的事件,如下表所示:
| | |
| --- | --- |
| EVT_RADIOBUTTON(id, func) | 用于處理wxEVT_COMMAND_RADIOBUTTON_SELECTED事件,當用戶點擊某個radio按鈕的時候產生。 |
wxRadioButton的成員函數
GetValue和SetValue使用bool類型來操作radio按鈕的狀態.
wxScrollBar
wxScrollBar用來單獨的增加一個滾動條,這個滾動條和某些窗口自動增加的兩個滾動條是有區別的,但是它們處理事件的方式是一樣的。滾動條主要有下面四個屬性:范圍(range),滑塊大小,頁大小和當前位置。
范圍的含義指的是和這個滾動條綁定的窗口的邏輯單位的大小。比如一個表格有15行,那么和這個表格綁定的滾動條的范圍就可以設置為15。
滑塊大小通常用來反映當前可視部分的大小,還用表格來作為例子,如果因為窗口大小的原因表格只能顯示5行,那么滾動條的滑塊大小就可以設置成5。如果滑塊大小大于或者等于范圍,在多數平臺上,這個滾動條將自動隱藏。
頁大小指的是當滾動條執行翻頁命令時需要滾動的單位數目。
當前位置指的是滑塊當前所處的位置。
使用下面的代碼來創建一個滾動條,其中構造函數的參數含義依次為父窗口,標識符,位置,大小和窗口類型:
```
#include "wx/scrolbar.h"
wxScrollBar* scrollBar = new wxScrollBar(panel, ID_SCROLLBAR,
wxDefaultPosition, wxSize(200, 20), wxSB_HORIZONTAL);
```
在windows平臺上,顯示結果如下圖所示:

創建一個滾動條以后,可以使用SetScrollbar函數來設置它的屬性。前面在介紹wxScrolledWindow的時候已經介紹這個函數的用法。
wxScrollBar的窗口類型
| wxSB_HORIZONTAL | 指定滾動條為水平方向. |
|:--- |:--- |
| wxSB_VERTICAL | 指定滾動條為垂直方向. |
wxScrollBar的事件
wxScrollBar產生wxScrollEvent類型的事件。你可以使用EVT_COMMAND_SCROLL...事件映射宏加 窗口標識符來攔截由特定滾動條產生的相關事件,或者使用EVT_SCROLL...不帶窗口標識符的事件映射宏來攔截除了本窗口以外來自其他的窗口的滾動 條事件。使用EVT_SCROLL(func)可以響應所有的滾動條事件。在附錄I?事件類型和相關宏?中詳細列舉了所有的滾動事件,你也可以參考手冊中 的相關內容。
wxScrollBar的成員函數
Getrange返回范圍大小.
GetPageSize返回頁大小.通常這個大小和滑塊大小相同。
GetThumbPosition和SetThumbPosition用來操作滑塊當前位置.
GetThumbLength返回滑塊或者當前可是區域的大小.
SetScrollbar 用來設置滾動條的所有屬性.比如滑塊位置(邏輯單位),滑塊大小,范圍,頁大小以及一個可選的bool參數用來指示是否立即更新滾動條的顯示。
wxSpinButton
wxSpinButton擁有兩個小的按鈕用來表示上下或者左右.這個控件通常和一個文本編輯框控件一起使用,以用來增加或者減少某個值。為了方便移植, 應該盡可能使用wxSpinCtrl來代替wxSpinButton,因為不是所有的平臺都支持wxSpinButton.
這個控件(以及wxSpinCtrl)所支持的值的范圍是平臺相關的,但是至少在-32768到32768之間,
使用下面的代碼來創建一個wxSpinButton,其中構造函數的參數的含義分別為:父窗口,標識符,位置,大小以及窗口類型:
```
#include "wx/spinbutt.h"
wxSpinButton* spinButton = new wxSpinButton(panel, ID_SPINBUTTON,
wxDefaultPosition, wxDefaultSize, wxSP_VERTICAL);
```
在windows平臺上,顯示的結果如下圖所示:

wxSpinButton的窗口類型
下表列出了wxSpinButton的窗口類型
| wxSP_HORIZONTAL | spin按鈕為左右方向. 不支持wxGTK. |
|:--- |:--- |
| wxSP_VERTICAL | spin按鈕為上下垂直方向. |
| wxSP_ARROW_KEYS | 用戶可以使用方向鍵來改變相關值. |
| wxSP_WRAP | 將最大值和最小值首尾相連,比如最小值的更小的下一個值將是最大值. |
wxSpinButton的事件
wxSpinButton產生wxSpinEvent類型的事件, 如下表所示:
| EVT_SPIN(id, func) | 用來處理wxEVT_SCROLL_THUMBTRACK事件, 當上下(或左右)按鈕被點擊的時候產生. |
|:--- |:--- |
| EVT_SPIN_UP(id, func) | 用來處理wxEVT_SCROLL_LINEUP事件,當向上(或者向左)的按鈕被點擊的時候產生. |
| EVT_SPIN_DOWN(id, func) | 用來處理wxEVT_SCROLL_LINEDOWN事件,當向下(或者向右)按鈕被點擊的額時候產生. |
wxSpinButton的成員函數
GetMax返回設置的最大值. GetMin返回設置的最小值. GetValue和SetValue用來操作當前值. SetRange用來設置最大和最小值.
wxSpinCtrl
wxSpinCtrl是wxTextCtrl和wxSpinButton控件的組合。當用戶點擊wxSpinButton的向上或者向下按鈕的時候,wxTextCtrl中的值將會隨之變化。用戶也可以直接在wxTextCtrl中輸入他想要的值。
下面的代碼用來創建一個值范圍在0到100之間,初始值為5的wxSpinCtrl。
```
#include "wx/spinctrl.h"
wxSpinCtrl* spinCtrl = new wxSpinCtrl(panel, ID_SPINCTRL,
wxT("5"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS,
0, 100, 5);
```
在windows平臺上的顯示效果如下圖所示:

wxSpinCtrl的窗口類型
| wxSP_ARROW_KEYS | 用戶可以通過方向鍵改變相關值. |
|:--- |:--- |
| wxSP_WRAP | 將最大值和最小值首尾相連. |
wxSpinCtrl事件
wxSpinCtrl產生wxSpinEvent類型的事件,如下表所示. 你也可以使用EVT_TEXT事件映射宏來處理其文本框的文本更新事件,處理函數的額參數類型為wxCommandEvent.
| EVT_SPIN(id, func) | Handles a wxEVT_SCROLL_THUMBTRACK event, generated whenever the up or down arrow is clicked. |
|:--- |:--- |
| EVT_SPIN_UP(id, func) | Handles a wxEVT_SCROLL_LINEUP event, generated when the up arrow is clicked. |
| EVT_SPIN_DOWN(id, func) | Handles a wxEVT_SCROLL_LINEDOWN event, generated when the down arrow is clicked. |
| EVT_SPINCTRL(id, func) | Handles all events generated for the wxSpinCtrl. |
wxSpinCtrl成員函數
GetMax返回設置的最大值. GetMin返回設置的最小值. GetValue和SetValue用來操作當前值. SetRange用來設置最大值和最小值.
wxSlider
slider控件擁有一個滑條和一個滑塊,可以通過移動滑條上的滑塊來改變控件的當前值.
使用下面的代碼創建一個取值范圍為0到40,初始位置為16的wxSlider.
```
#include "wx/slider.h"
wxSlider* slider = new wxSlider(panel, ID_SLIDER, 16, 0, 40,
wxDefaultPosition, wxSize(200, -1),
wxSL_HORIZONTAL|wxSL_AUTOTICKS|wxSL_LABELS);
```
在windows平臺上顯示的外觀如下所示:

wxSlider的窗口類型
| wxSL_HORIZONTAL | 顯示水平方向的滑條. |
|:--- |:--- |
| wxSL_VERTICAL | 顯示垂直方向的滑條. |
| wxSL_AUTOTICKS | 顯示刻度標記. |
| wxSL_LABELS | 顯示最大、最小以及當前值的標簽. |
| wxSL_LEFT | 對于垂直滑條,將刻度顯示在左面. |
| wxSL_RIGHT | 對于垂直滑條,將刻度顯示在右面. |
| wxSL_TOP | 對于水平滑條,刻度顯示在上面. 默認值為顯示在底部. |
| wxSL_SELRANGE | 允許用戶通過滑條選擇一個范圍.僅適用于Windows. |
wxSlider的事件
wxSlider產生wxCommandEvent類型的事件,如下表所示,但是如果你希望更好的控制,你可以使用EVT_COMMAND_SCROLL_...宏,其處理函數的參數類型為wxScrollEvent,參見附錄I.
| | |
| --- | --- |
| EVT_SLIDER(id, func) | 用于處理wxEVT_COMMAND_SLIDER_UPDATED事件,當用戶移動滑塊的時候產生. |
wxSlider的成員函數
ClearSel用來在設置了wxSL_SELRANGE類型的滑條上清除選擇區域. ClearTicks則用來清除刻度,僅適用于windows系統.
GetLineSize和SetLineSize用來操作移動單位,這個移動單位用來在用戶使用方向鍵操作滑塊的時候使用. GetPageSize和SetPageSize也用來操作移動單位,這個單位在用戶用鼠標點擊滑條的任一邊的時候使用.
GetMax返回當前設置的最大值.
GetMin返回當前設置的最小值.
GetSelEnd和GetSelStart用來返回選擇區域的起點和終點; SetSelection用來設置選擇區域的起點和終點. 這些函數都只適用于Windows.
GetThumbLength和SetThumbLength用來操作滑塊的大小.
GetTickFreq和SetTickFreq用來操作滑條上刻度的密度.SetTick用來設置刻度的位置。這些函數僅適用于Windows.
GetValue返回滑條的當前值, SetValue用來設置滑條的當前值.
SetRange用來設置滑條的最大值和最小值.
wxTextCtrl
文本控件是用來顯示和編輯文本的控件,它支持單行和多行的文本編輯。在某些平臺上,支持給文本控件中的文本設置一些簡單的格式和風格。在windows平臺,GTK+平臺以及Mac OS X平臺上通過使用wxTextAttr類來設置和獲取文本的當前格式。
使用下面的代碼創建一個支持多行文本的文本框控件:
```
#include "wx/textctrl.h"
wxTextCtrl* textCtrl = new wxTextCtrl(panel, ID_TEXTCTRL,
wxEmptyString, wxDefaultPosition, wxSize(240, 100),
wxTE_MULTILINE);
```
在windows平臺上,多行文本框控件的外觀如下:

多行文本框允許使用以"\n"分割的一組文本行的方式來處理一段文本,即使在非Unix的平臺上,使用"\n"作為分割符也是允許的。這使得你可以忽略平 臺之間換行符的差異。不過,作為代價,你將不能直接使用那些GetInsertionPoint函數或者GetSelection函數返回的索引,作為 GetValue返回的字符串中的索引,因為在前者返回的索引中,操作系統可能會進行了一點點的偏移以便對應上平臺使用的"\r\n"換行符,就象 windows平臺上的那樣。
如果你想從上面例子的函數的返回值中得到一個子字符串應該怎么辦呢?你可以使用GetRange函數。它們返回的索引可以被用于它們自 己別的成員函數,比如SetInsertionPoint或者SetSelection。總而言之,不要將用多行文本框的成員函數返回的索引直接用于它的 內容字符串的索引,但是可以將其用于其它成員函數作為參數。
多行文本框支持設置文本格式:你可以為部分文本設置單獨的文本顏色和字體。在windows平臺上,這需要窗口使用wxTE_RICH 窗口類型。你可以在插入文本之前使用SetDefaultStyle函數,或者在插入文本以后使用SetStyle來改變已經存在于文本框中的文本的格 式。前者更有效率。
無論在哪種情況下,如果指定的格式中的部分格式是沒有被指定的,則默認格式中相應的值將被使用,如果沒有默認的格式,那個文本控件自己的屬性將會被使用。
在下面的代碼中,第二次調用SetDefaultStyle不會改變文本的前景顏色(仍然是紅色),最后一次調用SetDefaultStyle則不會改變文本的背景顏色(仍然是灰色的)。
```
text->SetDefaultStyle(wxTextAttr(*wxRED));
text->AppendText(wxT("Red text\n"));
text->SetDefaultStyle(wxTextAttr(wxNullColour, *wxLIGHT_GREY));
text->AppendText(wxT("Red on gray text\n"));
text->SetDefaultStyle(wxTextAttr(*wxBLUE));
text->AppendText(wxT("Blue on gray text\n"));
```
wxTextCtrl的窗口類型
| wxTE_PROCESS_ENTER | 這個控件將會產生wxEVT_COMMAND_TEXT_ENTER事件.如果沒有設置這個類型,回車鍵將會或者被空家內部處理,或者被dialog窗口用來遍歷所有子窗口. |
|:--- |:--- |
| wxTE_PROCESS_TAB | 這個控件將會在TAB鍵被按下的時候處理wxEVT_CHAR事件,否則TAB鍵用來在dialog的所有子窗口之間遍歷. |
| wxTE_MULTILINE | 支持多行文本. |
| wxTE_PASSWORD | 文本將會以"*"顯示. |
| wxTE_READONLY | 文本只讀. |
| wxTE_RICH | 在Windows下使用富文本編輯控件. 這將允許控件存儲超過64KB的文本;并且垂直滾動條自動在需要的時候顯示.這個類型在別的平臺上將被忽略. |
| wxTE_RICH2 | 在Windows下使用富文本編輯控件的2.0或者3.0版本; 垂直滾動條將始終被顯示. 在其它平臺忽略這個類型. |
| wxTE_AUTO_URL | 高亮顯示URL字符串,并且在其被點擊的時候產生wxTextUrlEvents事件. 在windows平臺上需要設置wxTE_RICH類型.僅適用于Windows和GTK+平臺. |
| wxTE_NOHIDESEL | 默認情況下,在windows平臺上,如果文本框當前沒有得到焦點,將不會高亮顯示文本框中文本的選中部分,使用這個類型可以使其即使在文本框沒有獲得焦點的時候,被選部分也會高亮顯示。其它平臺則忽略這個類型。 |
| wxHSCROLL | 顯示水平滾動條,這樣就不需要文本自動換行了. 在GTK+平臺上無效. |
| wxTE_LEFT | 文本框中的文本左對齊 (默認). |
| wxTE_CENTRE | 文本框中的文本居中對齊. |
| wxTE_RIGHT | 文本框中的文本右對齊. |
| wxTE_DONTWRAP | 等同于wxHSCROLL類型. |
| wxTE_LINEWRAP | 如果文本行的長度超出可以顯示的部分,則允許在文本行的任何位置換行,目前只支持wxUniversal版本. |
| wxTE_WORDWRAP | 如果文本行的長度超出可以顯示的部分,則允許在文本行的單詞邊界位置換行,目前只支持wxUniversal版本. |
| wxTE_NO_VSCROLL | Removes the vertical scrollbar. No effect on GTK+. |
wxTextCtrl的事件
wxTextCtrl主要產生wxCommandEvent類型的事件,如下表所示:
| EVT_TEXT(id, func) | 用于處理wxEVT_COMMAND_TEXT_UPDATED事件,文本框內文本值改變的時候產生. |
|:--- |:--- |
| EVT_TEXT_ENTER(id, func) | 用于處理wxEVT_COMMAND_TEXT_ENTER事件,在用戶按下回車鍵的時候產生并且文本框設置了wxTE_PROCESS_ENTER窗口類型. |
| EVT_TEXT_MAXLEN(id, func) | 用于處理wxEVT_COMMAND_TEXT_MAXLEN事件,當用戶試圖輸入的文本長度超過SetMaxLength設置的長度的時候產生.僅適用于Windows和GTK+平臺. |
wxTextCtrl的成員函數
AppendText將文本添加在文本框最后, WriteText在當前的插入點插入文本. SetValue清除文本框中的當前文本然后賦值,賦值后IsModified函數返回False.在所有這些函數中,如果文本框支持多行文本,則可以使 用換行符。需要注意這些函數都會產生文本更新事件.
GetValue函數返回文本框的所有文本,如果是多行文本類型,則其中可以包含換行符. GetLineText返回其中一行. GetRange返回某個位置范圍內的文本。
Copy函數拷貝選中的文本到剪貼板. Cut除了Copy以外還清除選中的文本. Paste則將剪貼板上的文本替換當前的選中文本,在用戶界面刷新事件處理函數中,你還可以使用CanCopy, CanCut和CanPaste函數。
Clear清除所有文本.產生文本更新事件。
DiscardEdits復位內部的?已修改?標記,就好像文本框的文本已經被保存了那樣。
EmulateKeyPress用來模擬按鍵輸入,以便在文本框中進行某些修改.
GetdefaultStyle和SetDefaultStyle用來操作當前的默認文本格式. GetStyle返回某個位置文本的當前格式,SetStyle則用來設置某個范圍內的文本格式e.
GetInsertionPoint和SetInsertionPoint函數用來操作新文本的插入點. GetLastPosition用來返回當前文本的最末位置,SetInsertionPointEnd用來將插入點設置在文本最末。
GetLineLength返回某個特定行的字符創長度。
GetNumberOfLines返回總行數。
GetStringSelection返回當前選中的文本。如果當前沒有選中任何文本,則返回空字符串。GetSelection返回當前選中部分的索引. SetSelection則用兩個整數參數來設置當前的選中部分。
IsEditable返回當前控件是否可以被編輯. SetEditable用來設置控件的可編輯狀態以便讓其只讀或者可編輯. IsModified當文本框內的文本已經被編輯過的時候返回True. IsMultiline用來檢測當前文本框是否是多行文本框。
LoadFile將文件內容讀入文本框, SaveFile將文本框內容存入文件.
PositionToXY將象素值轉換成文本的行號和位置, 而XYToPosition則剛好相反。
Remove刪除給定區域的文本,. Replace則替換給定區域的文本。
ShowPosition使得文本控件顯示包含給定位置的部分。
Undo撤消最近一次編輯, Redo重復最近一次編輯. 在某些平臺上,這些操作可能什么也不作. 你可以用CanUndo和CanRedo來測試當前的平臺是否支持撤消和重做動作。
wxToggleButton
wxToggleButton在用戶點擊以后保持按下狀態.換句話說,除了長的象按鈕,它其實更可以說是一個wxCheckBox.
創建wxToggleButton的代碼如下:
```
#include "wx/tglbtn.h"
wxToggleButton* toggleButton = new wxToggleButton(panel, ID_TOGGLE,
wxT("&Toggle label"), wxDefaultPosition, wxDefaultSize);
toggleButton->SetValue(true);
```
下圖則顯示了其在windows平臺上的樣子:

wxToggleButton的窗口類型
wxToggleButton沒有特別的窗口類型.
wxToggleButton事件
wxToggleButton產生wxCommandEvent類型的事件。
| | |
| --- | --- |
| EVT_TOGGLEBUTTON(id, func) | 用于處理wxEVT_COMMAND_TOGGLEBUTTON_CLICKED事件, 用戶點擊該按鈕的時候產生. |
wxToggleButton的成員函數
SetLabel和GetLabel用來操作按鈕上的標簽. 在windows和GTK+平臺上你可以使用"&"前導符來指定一個加速鍵.
GetValue和SetValue用來獲取和設置按鈕的狀態。
- 第一章 介紹
- 1.1 為什么要使用wxWidgets?
- 1.2 wxWidgets的歷史
- 1.3 wxWidgets社區
- 1.4 wxWidgets和面向對象編程
- 1.5 wxWidgets的體系結構
- 1.6 許可協議
- 第一章小結
- 第二章 開始使用
- 2.1 一個小例子
- 2.2 應用程序類
- 2.3 Frame窗口類
- 2.4 事件處理函數
- 2.5 Frame窗口的構造函數
- 2.6 完整的例子
- 2.7 wxWidgets程序一般執行過程
- 2.8 編譯和運行程序
- 第二章小結
- 第三章 事件處理
- 3.1 事件驅動編程
- 3.2 事件表和事件處理過程
- 3.3 過濾某個事件
- 3.4 掛載事件表
- 3.5 動態事件處理方法
- 3.6 窗口標識符
- 3.7 自定義事件
- 第三章小結
- 第四章 窗口的基礎知識
- 4.1 窗口解析
- 4.2 窗口類概覽
- 4.3 基礎窗口類
- 4.4 頂層窗口
- 4.5 容器窗口
- 4.6 非靜態控件
- 4.7 靜態控件
- 4.8 菜單
- 4.9 控制條
- 第四章小結
- 第五章繪畫和打印
- 5.1 理解設備上下文
- 5.2 繪畫工具
- 5.3 設備上下文中的繪畫函數
- 5.4 使用打印框架
- 5.5 使用wxGLCanvas繪制三維圖形
- 第五章小節
- 第六章處理用戶輸入
- 6.1 鼠標輸入
- 6.2 處理鍵盤事件
- 6.3 處理游戲手柄事件
- 第六章小結
- 第七章使用布局控件進行窗口布局
- 7.1 窗口布局基礎
- 7.2 窗口布局控件
- 7.3 使用布局控件進行編程
- 7.4 更多關于布局的話題
- 第七章小結
- 第八章使用標準對話框
- 8.1信息對話框
- 8.2 文件和目錄對話框
- 8.3 選擇和選項對話框
- 8.4 輸入對話框
- 8.5 打印對話框
- 第八章小結
- 第九章創建定制的對話框
- 9.1 創建定制對話框的步驟
- 9.2 一個例子:PersonalRecordDialog
- 9.3 在小型設備上調整你的對話框
- 9.4 一些更深入的話題
- 9.5 使用wxWidgets資源文件
- 第九章小結
- 第十章使用圖像編程
- 10.1 wxWidgets中圖片相關的類
- 10.2 使用wxBitmap編程
- 10.3 使用wxIcon編程
- 10.4 使用wxCursor編程
- 10.5 使用wxImage編程
- 10.6 圖片列表和圖標集
- 10.7 自定義wxWidgets提供的小圖片
- 第十章小結
- 第十一章剪貼板和拖放操作
- 11.1 數據對象
- 11.2 使用剪貼板
- 11.3 實現拖放操作
- 第十一章小結
- 第十二章高級窗口控件
- 12.1 wxTreeCtrl
- 12.2 wxListCtrl
- 12.3 wxWizard
- 12.4 wxHtmlWindow
- 12.5 wxGrid
- 12.6 wxTaskBarIcon
- 12.7 編寫自定義的控件
- 第十二章小結
- 第十三章數據結構類
- 13.1 為什么沒有使用STL?
- 13.2 字符串類型
- 13.3 wxArray
- 13.4 wxList和wxNode
- 13.5 wxHashMap
- 13.6 存儲和使用日期和時間
- 13.7 其它常用的數據類型
- 第十三章小結
- 第十四章文件和流操作
- 14.1 文件類和函數
- 14.2 流操作相關類
- 第十四章小結
- 第十五章內存管理,調試和錯誤處理
- 15.1 內存管理基礎
- 15.2 檢測內存泄漏和其它錯誤
- 15.3 構建自防御的程序
- 15.4 錯誤報告
- 15.5 提供運行期類型信息
- 15.6 使用wxModule
- 15.7 加載動態鏈接庫
- 15.8 異常處理
- 15.9 調試提示
- 第十五章小結
- 第十六章編寫國際化程序
- 16.1 國際化介紹
- 16.2 從翻譯說起
- 16.3 字符編碼和Unicode
- 16.4 數字和日期
- 16.5 其它媒介
- 16.6 一個小例子
- 第十六章小結
- 第十七章編寫多線程程序
- 17.1 什么時候使用多線程,什么時候不要使用
- 17.2 使用wxThread
- 17.3 用于線程同步的對象
- 17.4 多線程的替代方案
- 第十七章小結
- 第十八章使用wxSocket編程
- 18.1 Socket類和功能概覽
- 18.2 Socket及其基本處理介紹
- 18.3 Socket標記
- 18.4 使用Socket流
- 18.5 替代wxSocket
- 第十八章小結
- 第十九章使用文檔/視圖框架
- 19.1 文檔/視圖基礎
- 19.2 文檔/視圖框架的其它能力
- 19.3 實現Undo/Redo的策略
- 第十九章小結
- 第二十章完善你的應用程序
- 20.1 單個實例和多個實例
- 20.2 更改事件處理機制
- 20.3 降低閃爍
- 20.4 實現聯機幫助
- 20.5 解析命令行參數
- 20.6 存儲應用程序資源
- 20.7 調用別的應用程序
- 20.8 管理應用程序設置
- 20.9 應用程序安裝
- 20.10 遵循用戶界面設計規范
- 20.11 全書小結