# 8.1信息對話框
在這一小節中,我們來看看以下四種用來提供信息的對話框:wxMessageDialog, wxProgressDialog, wxBusyInfo, and wxShowTip.
wxMessageDialog
這種對話框顯示一個消息和一組按鈕,按鈕可以為OK, Cancel, Yes或者No,還可以有一個可選的圖標,用來顯示一個驚嘆號或者一個問號.消息文本中還可以包含換行符"\n".
wxMessageDialog::ShowModal函數的返回值用來表征哪個按鈕被按下了.
下圖顯示了wxMessageDialog在windows平臺上的樣子:

在GTK+平臺上:

在Mac平臺上:

要創建一個這種對話框,你需要提供父窗口指針,要顯示的消息,可選的標題,類型和位置參數,然后調用ShowModal函數顯示這個對話框,然后判斷這個函數的返回值進行進一步的動作.
其中的類型參數是一個比特位列表,其值如下表所示:
| wxOK | 顯示一個OK按鈕. |
|:--- |:--- |
| wxCANCEL | 顯示一個Cancel按鈕. |
| wxYES_NO | 顯示Yes和No按鈕. |
| wxYES_DEFAULT | 設置Yes為默認按鈕. 和wxYES_NO一起使用.這是wxYES_NO類型的默認行為. |
| wxNO_DEFAULT | 設置No按鈕為默認按鈕,和wxYES_NO一起使用. |
| wxICON_EXCLAMATION | 顯示一個驚嘆號. |
| wxICON_ERROR | 顯示一個錯誤圖標. |
| wxICON_HAND | 和wxICON_ERROR相同. |
| wxICON_QUESTION | 顯示一個問號. |
| wxICON_INFORMATION | 顯示一個信息圖標. |
| wxSTAY_ON_TOP | 在windows平臺上,這個對話框將在所有的窗口(包括那些其它應用程序的窗口)之上. |
wxMessageDialog使用舉例
```
#include "wx/msgdlg.h"
wxMessageDialog dialog( NULL, wxT("Message box caption"),
wxT("Message box text"),
wxNO_DEFAULT|wxYES_NO|wxCANCEL|wxICON_INFORMATION);
switch ( dialog.ShowModal() )
{
case wxID_YES:
wxLogStatus(wxT("You pressed \"Yes\""));
break;
case wxID_NO:
wxLogStatus(wxT("You pressed \"No\""));
break;
case wxID_CANCEL:
wxLogStatus(wxT("You pressed \"Cancel\""));
break;
default:
wxLogError(wxT("Unexpected wxMessageDialog return code!"));
}
```
wxMessageBox
你可以使用更方便的wxMessageBox函數,它的參數為一個消息文本,標題文本,類型和父窗口.例如:
```
if (wxYES == wxMessageBox(wxT("Message box text"),
wxT("Message box caption"),
wxNO_DEFAULT|wxYES_NO|wxCANCEL|wxICON_INFORMATION,
parent))
{
return true;
}
```
要注意wxMessageBox的返回值和wxMessageDialog::ShowModal的返回值是不一樣的,前者返回wxOK, wxCANCEL, wxYES或wxNO,而后者返回wxID_OK, wxID_CANCEL, wxID_YES或 wxID_NO.
wxProgressDialog
wxProgressDialog可以用來顯示一個短的消息文本和一個進度條用來指示用戶還需要等待多久.它還可以顯示一個Cancel 按鈕用來中止正在進行的處理,還可以顯示已經過去的時間,估計剩余的時間和估計全部的時間.這個對話框是wxWidgets在各個平臺上自己實現的.下圖顯示了這個對話框在windows上的樣子:

你既可以用全局變量或者new函數來創建這種對話框,也可以直接使用局部變量創建這種對話框,需要傳遞的參數包括:標題,消息文本,進度條的最大值,父窗口和類型.
類型的值如下表所示:
| wxPD_APP_MODAL | 設置為模式對話框.如果沒有設置這個類型,對話框為非模式對話框,意味著除了其父窗口以外,應用程序中其它的窗口還可以輸入數據. |
|:--- |:--- |
| wxPD_AUTO_HIDE | 導致這個進度條對話框在進度達到最大值的時候自動消失. |
| wxPD_CAN_ABORT | 告訴對話框顯示一個取消按鈕,當用戶點擊這個按鈕以后,下次調用對話框的Update函數將會返回失敗. |
| wxPD_ELAPSED_TIME | 顯示已逝去時間標簽. |
| wxPD_ESTIMATED_TIME | 顯示估計全部時間標簽. |
| wxPD_REMAINING_TIME | 顯示估計剩余時間標簽. |
在進度對話框被創建以后,其父窗口將被禁用,如果設置了wxPD_APP_MODAL類型,則應用程序中其它的窗口也將被禁用.應用程序應用調用Update函數來更新進度條以及提示信息,如果設置了時間顯示標簽,則它們的值將被自動計算并在每次調用Update的時候刷新.
如果設置了wxPD_AUTO_HIDE類型,對話框會在進度達到最大值的時候自動隱藏,你應該自己根據其創建方式釋放這個對話框.對于由于用戶點擊取消按鈕而導致Update失敗的情況,如果你愿意,你可以使用Resume函數還恢復中止的進度條.
wxProgressDialog使用舉例
```
#include "wx/progdlg.h"
void MyFrame::ShowProgress()
{
static const int max = 10;
wxProgressDialog dialog(wxT("Progress dialog example"),
wxT("An informative message"),
max, // range
this, // parent
wxPD_CAN_ABORT |
wxPD_APP_MODAL |
wxPD_ELAPSED_TIME |
wxPD_ESTIMATED_TIME |
wxPD_REMAINING_TIME);
bool cont = true;
for ( int i = 0; i <= max; i++ )
{
wxSleep(1);
if ( i == max )
cont = dialog.Update(i, wxT("That's all, folks!"));
else if ( i == max / 2 )
cont = dialog.Update(i, wxT("Only a half left (very long message)!"));
else
cont = dialog.Update(i);
if ( !cont )
{
if ( wxMessageBox(wxT("Do you really want to cancel?"),
wxT("Progress dialog question"),
wxYES_NO | wxICON_QUESTION) == wxYES )
break;
dialog.Resume();
}
}
if ( !cont )
wxLogStatus(wxT("Progress dialog aborted!"));
else
wxLogStatus(wxT("Countdown from %d finished"), max);
}
```
wxBusyInfo
wxBusyInfo其實不是一個對話框不過它的表現和對話框非常相似,當這個對象被創建的時候,屏幕上將顯示一個窗口以及一條讓用戶耐心等待的消息,這個窗口將存在于wxBusyInfo的整個生命周期.在windows平臺上,它的長相類似下面的樣子:

wxBusyInfo也可以以全局和局部的方式創建,需要傳遞給構造函數的參數包括一個消息文本和一個父窗口.
wxBusyInfo使用舉例
在下面的例子中,首先使用wxWindowDisabler對象禁用應用程序當前創建的所有的窗口,然后顯示了一個wxBusyInfo窗口:
```
#include "wx/busyinfo.h"
wxWindowDisabler disableAll;
wxBusyInfo info(wxT("Counting, please wait..."), parent);
for (int i = 0; i < 1000; i++)
{
DoCalculation();
}
```
wxShowTip
許多應用程序都會在程序啟動的時候顯示一個附加的窗口,用來給出一些如何使用這個應用程序的提示信息,那些不愿閱讀沉悶的文檔的人會非常喜歡這樣的學習方式的.
啟動提示窗口在windows平臺上的樣子如下圖所示:

和大多數對話框不同,這個對話框是使用wxShowTip函數顯示的,傳遞的參數為一個父窗口指針,一個指向wxTipProvider 對象的指針和一個可選的bool參數用來指示是否顯示一個復選框,以便用戶可以選擇是否在應用程序啟動的時候顯示這個提示框.而函數的返回值則為用戶的選擇.
你必須實現一個wxTipProvider的派生類,實現其中的GetTip函數才可以使用wxShowTip函數,幸運的是, wxWidgets已經實現了一個這樣的基于文本文件的類.你可以直接使用wxCreateFileTipProvider函數,傳遞以文本文件(每行一個提示文本)路徑和默認選擇索引來創建一個這樣的類.
應用程序應負責在wxTipProvider對象不需要的時候釋放這個對象.
wxShowTip使用舉例
```
#include "wx/tipdlg.h"
void MyFrame::ShowTip()
{
static size_t s_index = (size_t)-1;
if ( s_index == (size_t)-1 )
{
// 隨機化...
srand(time(NULL));
// ...選擇一個提示
s_index = rand() % 5;
}
// 傳遞一個提示文件以及提示索引
wxTipProvider *tipProvider =
wxCreateFileTipProvider(wxT("tips.txt"), s_index);
m_showAtStartup = wxShowTip(this, tipProvider, true);
delete tipProvider;
}
```
- 第一章 介紹
- 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 全書小結