# 8.3 選擇和選項對話框
在這一小節中,我們來看看那些讓你作出選擇或者允許你給出選項的對話框,包括:wxColourDialog, wxFontDialog, wxSingleChoiceDialog 和 wxMultiChoiceDialog.
wxColourDialog
這個對話框允許用戶從標準顏色或者是一個顏色范圍中選擇一種顏色.
在windows系統上,顏色選擇對話框使用的是windows系統提供的原生控件,這個對話框主要包含三個區域,左上角是一個由48中常用顏色組成的區域,左下角是一個擁有16個選項的定制顏色區,用戶的應用程序可以自行設置這16種定制的顏色,右邊則可以展開用來精確的選擇一個顏色.下圖演示了這個對話框完全展開以后的樣子:

通用的顏色選擇對話框如下圖所示,可以在GTK+ 1或者X11系統上使用.它包含48個常用顏色和16個可定制顏色,右邊包含三個滑條用來選擇RGB三原色的值.選好的值用來替換當前選中的定制顏色或者 (如果當前沒有選中任何定制顏色的話)第一個定制顏色.和windows系統原生的顏色選擇框不同,右邊的滑條區域是不可以隱藏的.在Windows平臺和其它平臺上,你也可以通過wxGenericColourDialog類來使用這個通用顏色選擇對話框.

下圖演示了GTK+的原生顏色選擇對話框:

Mac OsX平臺上的顏色選擇對話框如下圖所示:

要使用顏色選擇對話框,你可以創建一個wxColourDialog局部變量,傳遞的參數包括父窗口指針和一個wxColourData 指針,后者用來設置一些默認數據,然后調用ShowModal函數,當這個函數返回時,通過GetColourData函數獲取用戶對 wxColourData所做的更改.
wxColourData的成員函數
SetChooseFull定義在windows平臺上,顏色選擇對話框應該是完全展開的方式顯示.否則將只顯示左邊的部分.GetChooseFull函數則用來獲取Bool格式的這個選項的值.
SetColour用來設置默認的顏色, GetColour函數用來返回用戶當前選擇的顏色.
SetCustomColour使用一個0到15之間的索引和一個wxColour類型的顏色值來設置顏色選擇對話框的定制顏色.使用GetCustomColour函數返回當前的可定制范圍的顏色值,這個值可能在用戶操作顏色對話框的過程中被改變.
wxColourDialog使用舉例
下面是一個使用wxColourDialog的例子,它將首先設置wxColourData的各種參數,包括16個灰階色彩的定制顏色.如果用戶沒有取消這個對話框,就用用戶選擇的顏色來設置當前的背景色.
```
#include "wx/colordlg.h"
wxColourData data;
data.SetChooseFull(true);
for (int i = 0; i < 16; i++)
{
wxColour color(i*16, i*16, i*16);
data.SetCustomColour(i, color);
}
wxColourDialog dialog(this, &data);
if (dialog.ShowModal() == wxID_OK)
{
wxColourData retData = dialog.GetColourData();
wxColour col = retData.GetColour();
myWindow->SetBackgroundColour(col);
myWindow->Refresh();
}
```
wxFontDialog
wxFontDialog可以讓用戶來選擇一個字體(在某些平臺上,還可以選擇字體的顏色).
在Windows平臺上,使用的是windows系統提供的原生控件,這個控件給用戶的選擇包括字體的名稱,點大小,類型,粗細,下劃線,中劃線等屬性以及字體的前景顏色.一個白色區域還顯示了當前選擇字體的樣子.注意在windows的字體轉換到wxWidgets的字體過程中,中劃線屬性將被忽略,字體名稱則被相應的字體家族名稱取代. 而在GTK+平臺上,使用的是GTK+的標準字體對話框,這個對話框不允許選擇字體前景顏色.
下圖演示了windows平臺上字體選擇對話框的樣子:

下圖演示了GTK+上的標準字體選擇對話框的樣子:

除了上述兩個平臺以外,其它平臺字體選擇對話框的樣子都很相似,允許用戶選擇的項目包括字體家族名稱,大小,類型,粗細,下劃線以及前景顏色等,還包括一個示例區用來顯示當前字體的樣子.這種字體選擇框在各種平臺都是可以使用的,類的名字為wxGenericFontDialog. 下圖演示了Mac平臺上的這種字體選擇對話框的樣子:

要使用字體選擇對話框,需要傳遞的參數包括父窗口和一個wxFontData對象,然后調用其ShowModal函數并且測試其返回值是否為wxID_OK,然后從對話框中獲取wxFontData數據,然后視需要調用其GetChosenFont和GetChosenColour函數.
wxFontData的成員函數
EnableEffects函數允許windows平臺上的字體選擇對話框或者通用版本的字體選擇對話框顯示顏色和下劃線屬性控制.在GTK版本上則沒有任何效果.GetEnableEffects函數則用來判斷當前是否設置了這個標志. 不過即使禁止了這個標志,字體顏色選項還是會被保留.
SetAllowSymbols允許選擇符號字體(僅適用于Windows), GetAllowSymbols則返回這個選項的當前設置值.
SetColour設置默認字體顏色, GetColour則返回當前用戶選擇的顏色.
SetInitialFont返回對話框被創建時候的默認字體. GetChosenFont則返回用戶選擇的字體(wxFont).
SetShowHelp用來指示應該在字體對話框上顯示幫助按鈕(僅適用于Windows). GetShowHelp則返回這個選項的當前設置.
SetRange設置用戶可以選擇的字體大小的范圍, 默認值(0, 0)表示任何大小的字體都可以被選擇.僅適用于windows.
字體選擇使用舉例
在下面的例子中,應用程序使用字體選擇對話框返回的字體在窗口上繪畫.
```
#include "wx/fontdlg.h"
wxFontData data;
data.SetInitialFont(m_font);
data.SetColour(m_textColor);
wxFontDialog dialog(this, &data);
if (dialog.ShowModal() == wxID_OK)
{
wxFontData retData = dialog.GetFontData();
m_font = retData.GetChosenFont();
m_textColor = retData.GetColour();
// 更新當前窗口以便使用當前選擇的字體和顏色進行重繪
myWindow->Refresh();
}
```
wxSingleChoiceDialog
wxSingleChoiceDialog給用戶提供了一組字符串以便用戶可以選擇其中的一個.它的外觀如下圖所示:

傳遞給構造函數的參數包括其父窗口指針,一個消息文本,對話框的標題文本以及一個wxArrayString類型的字符串選項列表.其中最后一個參數可以使用一個大小和一個C類型的字符串指針的指針(wxChar**)代替.
SetSelection用來在對話框顯示之前設置一個默認的選項,使用GetSelection(返回當前選項的索引)或者GetStringSelection(返回對應的字符串)來在對話框關閉以后獲取用戶的選擇.
你還可以在這種對話框的構造函數中傳遞一組char*類型的客戶區數據,在對話框被關閉以后,使用GetSelectionClientData函數獲得和用戶選項對應的客戶區數據.
wxSingleChoiceDialog使用舉例
```
#include "wx/choicdlg.h"
const wxArrayString choices;
choices.Add(wxT("One"));
choices.Add(wxT("Two"));
choices.Add(wxT("Three"));
choices.Add(wxT("Four"));
choices.Add(wxT("Five"));
wxSingleChoiceDialog dialog(this,
wxT("This is a small sample\nA single-choice convenience dialog"),
wxT("Please select a value"),
choices);
dialog.SetSelection(2);
if (dialog.ShowModal() == wxID_OK)
wxMessageBox(dialog.GetStringSelection(), wxT("Got string"));
```
wxMultiChoiceDialog
wxMultiChoiceDialog和wxSingleChoiceDialog很相似,不過它允許用戶進行多項選擇.這種對話框的外觀如下圖所示:

傳遞給這種對話框的構造函數的參數包括一個父窗口指針,一個消息文本,對話框標題文本和一個wxArrayString類型的選項列表. 和wxSingleChoiceDialog一樣,最后一個參數可以使用字符串指針的列表wxChar**和數量代替.和 wxSingleChoiceDialog不同的是,不可以在構造函數中提供客戶區數據.
使用函數SetSelections還設置默認選中的選項,其參數為wxArrayInt類型,代表一個整數數組.使用GetSelections來獲取用戶的選擇,返回值也為wxArrayInt類型.
wxMultiChoiceDialog使用舉例
```
#include "wx/choicdlg.h"
const wxArrayString choices;
choices.Add(wxT("One"));
choices.Add(wxT("Two"));
choices.Add(wxT("Three"));
choices.Add(wxT("Four"));
choices.Add(wxT("Five"));
wxMultiChoiceDialog dialog(this,
wxT("A multi-choice convenience dialog"),
wxT("Please select several values"),
choices);
if (dialog.ShowModal() == wxID_OK)
{
wxArrayInt selections = dialog.GetSelections();
wxString msg;
msg.Printf(wxT("You selected %u items:\n"),
selections.GetCount());
for ( size_t n = 0; n < selections.GetCount(); n++ )
{
msg += wxString::Format(wxT("\t%d: %d (%s)\n"),
n, selections[n],
choices[selections[n]].c_str());
}
wxMessageBox(msg, wxT("Got selections"));
}
```
- 第一章 介紹
- 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 全書小結