ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 8.3 选择和选项对话框 在这一小节中,我们来看看那些让你作出选择或者允许你给出选项的对话框,包括:wxColourDialog, wxFontDialog, wxSingleChoiceDialog 和 wxMultiChoiceDialog. wxColourDialog 这个对话框允许用户从标准颜色或者是一个颜色范围中选择一种颜色. 在windows系统上,颜色选择对话框使用的是windows系统提供的原生控件,这个对话框主要包含三个区域,左上角是一个由48中常用颜色组成的区域,左下角是一个拥有16个选项的定制颜色区,用户的应用程序可以自行设置这16种定制的颜色,右边则可以展开用来精确的选择一个颜色.下图演示了这个对话框完全展开以后的样子: ![](img/mhtD2D6%281%29.tmp) 通用的颜色选择对话框如下图所示,可以在GTK+ 1或者X11系统上使用.它包含48个常用颜色和16个可定制颜色,右边包含三个滑条用来选择RGB三原色的值.选好的值用来替换当前选中的定制颜色或者 (如果当前没有选中任何定制颜色的话)第一个定制颜色.和windows系统原生的颜色选择框不同,右边的滑条区域是不可以隐藏的.在Windows平台和其它平台上,你也可以通过wxGenericColourDialog类来使用这个通用颜色选择对话框. ![](img/mhtD2E9%281%29.tmp) 下图演示了GTK+的原生颜色选择对话框: ![](img/mhtD2EC%281%29.tmp) Mac OsX平台上的颜色选择对话框如下图所示: ![](img/mhtD2FE%281%29.tmp) 要使用颜色选择对话框,你可以创建一个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平台上字体选择对话框的样子: ![](img/mhtD301%281%29.tmp) 下图演示了GTK+上的标准字体选择对话框的样子: ![](img/mhtD314%281%29.tmp) 除了上述两个平台以外,其它平台字体选择对话框的样子都很相似,允许用户选择的项目包括字体家族名称,大小,类型,粗细,下划线以及前景颜色等,还包括一个示例区用来显示当前字体的样子.这种字体选择框在各种平台都是可以使用的,类的名字为wxGenericFontDialog. 下图演示了Mac平台上的这种字体选择对话框的样子: ![](img/mhtD317%281%29.tmp) 要使用字体选择对话框,需要传递的参数包括父窗口和一个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给用户提供了一组字符串以便用户可以选择其中的一个.它的外观如下图所示: ![](img/mhtD32A%281%29.tmp) 传递给构造函数的参数包括其父窗口指针,一个消息文本,对话框的标题文本以及一个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很相似,不过它允许用户进行多项选择.这种对话框的外观如下图所示: ![](img/mhtD32D%281%29.tmp) 传递给这种对话框的构造函数的参数包括一个父窗口指针,一个消息文本,对话框标题文本和一个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")); } ```