我們在使用Windows系統的過程中經常會見到消息對話框,提示我們有異常發生或提出詢問等。因為在軟件開發中經常用到消息對話框,所以MFC提供了兩個函數可以直接生成指定風格的消息對話框,而不需要我們在每次使用的時候都要去創建對話框資源和生成對話框類等。這兩個函數就是CWnd類的成員函數MessageBox()和全局函數AfxMessageBox()。

       一.CWnd::MessageBox()函數和AfxMessageBox()函數的用法

       下面就分別講解兩個函數的用法。

       1.CWnd::MessageBox()函數

       CWnd::MessageBox()的函數原型如下:

       int MessageBox(
           LPCTSTR lpszText,
           LPCTSTR lpszCaption = NULL,
           UINT nType = MB_OK 
       );

       參數說明:

       lpszText:需要顯示的消息字符串。

       lpszCaption:消息對話框的標題字符串。默認值為NULL。取值為NULL時使用默認標題。

       nType:消息對話框的風格和屬性。默認為MB_OK風格,即只有“確定”按鈕。

       nType的取值可以是下面兩個表中任取一個值,也可以是各取一個值的任意組合。即可以指定一個對話框類型,也可以指定一個對話框圖標,還可以兩者都設定。

nType 取值 參數說明
MB_ABORTRETRY 有“終止”、“重試”和“忽略”按鈕
MB_OK 有“確定”按鈕
MB_OKCANCEL 有“確定”和“取消”按鈕
MB_RETRYCANCEL 有“重試”和“取消”按鈕
MB_YESNO 有“是”和“否”按鈕
MB_YESNOCANCEL 有“是”、“否”和“取消”按鈕


對話框類型表

nType 取值 顯示圖標
MB_ICONEXCLAMTION
MB_ICONWARNING
VS2010/MFC編程入門之十六(對話框:消息對話框)
MB_ICONASTERISK
MB_ICONINFORMATION
VS2010/MFC編程入門之十六(對話框:消息對話框)
MB_ICONQUESTION VS2010/MFC編程入門之十六(對話框:消息對話框)
MB_ICONHAND
MB_ICONSTOP
MB_ICONERROR
VS2010/MFC編程入門之十六(對話框:消息對話框)

 對話框圖標表

       如果想要設置nType的值為類型和圖標的組合,可以像這樣取值:MB_OKCANCEL | MB_ICONQUESTION。按位取或就可以了。

       2.AfxMessageBox()函數

       AfxMessageBox()的函數原型為:

       int AfxMessageBox(
           LPCTSTR lpszText,
           UINT nType = MB_OK,
           UINT nIDHelp = 0 
       );

       參數說明:

       lpszText:同CWnd::MessageBox()函數

       nType:CWnd::MessageBox()函數

       nIDHelp:此消息的幫助的上下文ID。默認值為0,取0時表示要使用應用程序的默認幫助上下文。

       二.CWnd::MessageBox()和AfxMessageBox()的返回值

      我們在調用了上面兩個函數后,都可以彈出模態消息對話框。消息對話框關閉后,我們也都可以得到它們的返回值。兩者的返回值就是用戶在消息對話框上單擊的按鈕的ID,可以是以下值:

      IDABORT:單擊“終止”按鈕。
      IDCANCEL:單擊“取消”按鈕。
      IDIGNORE:單擊“忽略”按鈕。
      IDNO:單擊“否”按鈕。
      IDOK:單擊“確定”按鈕。
      IDRETRY:單擊“重試”按鈕。
      IDYES:單擊“是”按鈕。

      三.應用舉例

     我們還是拿前面加法計算器的程序做例子。

       大家是否記得,在模態對話框及其彈出過程中我們修改了CAdditionDlg::OnBnClickedAddButton()函數,在點了“計算”按鈕以后先彈出了一個模態對話框,詢問用戶是否確定要進行加法計算,並通過模態對話框DoModal函數的返回值判斷用戶選擇了“確定”還是“取消”。這些功能很明顯消息對話框完全能夠實現,雞啄米就使用消息對話框來替代原來的模態對話框。

       在非模態對話框的創建及顯示中,雞啄米注釋了模態對話框的相關代碼,加入了非模態對話框的創建和顯示代碼,我們在加入消息對話框之前將非模態對話框的代碼也注釋或刪除掉,確保此函數中不再生成原來的模態對話框或非模態對話框。

       修改后的CAdditionDlg::OnBnClickedAddButton()函數如下:

C++代碼
  1. void CAdditionDlg::OnBnClickedAddButton()   
  2. {   
  3.     // TODO: Add your control notification handler code here   
  4.  
  5.     INT_PTR nRes;   
  6.   
  7.     // 顯示消息對話框   
  8.     nRes = MessageBox(_T("您確定要進行加法計算嗎?"), _T("加法計算器"), MB_OKCANCEL | MB_ICONQUESTION);   
  9.     // 判斷消息對話框返回值。如果為IDCANCEL就return,否則繼續向下執行   
  10.     if (IDCANCEL == nRes)   
  11.         return;   
  12.   
  13.     // 將各控件中的數據保存到相應的變量   
  14.     UpdateData(TRUE);   
  15.   
  16.     // 將被加數和加數的加和賦值給m_editSum   
  17.     m_editSum = m_editSummand + m_editAddend;   
  18.   
  19.     // 根據各變量的值更新相應的控件。和的編輯框會顯示m_editSum的值   
  20.     UpdateData(FALSE);   
  21.     // 設置屬性對話框為向導對話框   
  22.     //sheet.SetWizardMode();   
  23. }  

        編譯運行,在運行結果對話框上點“計算”按鈕彈出以下消息對話框:

VS2010/MFC編程入門之十六(對話框:消息對話框)

       大家也可以將MessageBox函數換為AfxMessageBox()函數,同時參數進行相應修改,運行下看看效果。