前面幾節(jié)雞啄米講了
屬性頁(yè)對(duì)話框,我們可以根據(jù)所講內(nèi)容方便的建立自己的屬性頁(yè)對(duì)話框。本節(jié)講解Windows系統(tǒng)中最常用最簡(jiǎn)單的一類(lèi)對(duì)話框--消息對(duì)話框。
我們?cè)谑褂肳indows系統(tǒng)的過(guò)程中經(jīng)常會(huì)見(jiàn)到消息對(duì)話框,提示我們有異常發(fā)生或提出詢(xún)問(wèn)等。因?yàn)樵谲浖_(kāi)發(fā)中經(jīng)常用到消息對(duì)話框,所以MFC提供了兩個(gè)函數(shù)可以直接生成指定風(fēng)格的消息對(duì)話框,而不需要我們?cè)诿看问褂玫臅r(shí)候都要去創(chuàng)建對(duì)話框資源和生成對(duì)話框類(lèi)等。這兩個(gè)函數(shù)就是CWnd類(lèi)的成員函數(shù)MessageBox()和全局函數(shù)AfxMessageBox()。
一.CWnd::MessageBox()函數(shù)和AfxMessageBox()函數(shù)的用法
下面雞啄米就分別講解兩個(gè)函數(shù)的用法。
1.CWnd::MessageBox()函數(shù)
CWnd::MessageBox()的函數(shù)原型如下:
int MessageBox(
LPCTSTR lpszText,
LPCTSTR lpszCaption = NULL,
UINT nType = MB_OK
);
參數(shù)說(shuō)明:
lpszText:需要顯示的消息字符串。
lpszCaption:消息對(duì)話框的標(biāo)題字符串。默認(rèn)值為NULL。取值為NULL時(shí)使用默認(rèn)標(biāo)題。
nType:消息對(duì)話框的風(fēng)格和屬性。默認(rèn)為MB_OK風(fēng)格,即只有“確定”按鈕。
nType的取值可以是下面兩個(gè)表中任取一個(gè)值,也可以是各取一個(gè)值的任意組合。即可以指定一個(gè)對(duì)話框類(lèi)型,也可以指定一個(gè)對(duì)話框圖標(biāo),還可以?xún)烧叨荚O(shè)定。
nType 取值 參數(shù)說(shuō)明
MB_ABORTRETRY 有“終止”、“重試”和“忽略”按鈕
MB_OK 有“確定”按鈕
MB_OKCANCEL 有“確定”和“取消”按鈕
MB_RETRYCANCEL 有“重試”和“取消”按鈕
MB_YESNO 有“是”和“否”按鈕
MB_YESNOCANCEL 有“是”、“否”和“取消”按鈕
對(duì)話框類(lèi)型表
nType 取值 顯示圖標(biāo)
MB_ICONEXCLAMTION
MB_ICONWARNING
MB_ICONASTERISK
MB_ICONINFORMATION
MB_ICONQUESTION
MB_ICONHAND
MB_ICONSTOP
MB_ICONERROR
對(duì)話框圖標(biāo)表
如果想要設(shè)置nType的值為類(lèi)型和圖標(biāo)的組合,可以像這樣取值:MB_OKCANCEL | MB_ICONQUESTION。按位取或就可以了。
2.AfxMessageBox()函數(shù)
AfxMessageBox()的函數(shù)原型為:
int AfxMessageBox(
LPCTSTR lpszText,
UINT nType = MB_OK,
UINT nIDHelp = 0
);
參數(shù)說(shuō)明:
lpszText:同CWnd::MessageBox()函數(shù)
nType:CWnd::MessageBox()函數(shù)
nIDHelp:此消息的幫助的上下文ID。默認(rèn)值為0,取0時(shí)表示要使用應(yīng)用程序的默認(rèn)幫助上下文。
二.CWnd::MessageBox()和AfxMessageBox()的返回值
我們?cè)谡{(diào)用了上面兩個(gè)函數(shù)后,都可以彈出模態(tài)消息對(duì)話框。消息對(duì)話框關(guān)閉后,我們也都可以得到它們的返回值。兩者的返回值就是用戶(hù)在消息對(duì)話框上單擊的按鈕的ID,可以是以下值:
IDABORT:?jiǎn)螕簟敖K止”按鈕。
IDCANCEL:?jiǎn)螕簟叭∠卑粹o。
IDIGNORE:?jiǎn)螕簟昂雎浴卑粹o。
IDNO:?jiǎn)螕簟胺瘛卑粹o。
IDOK:?jiǎn)螕簟按_定”按鈕。
IDRETRY:?jiǎn)螕簟爸卦嚒卑粹o。
IDYES:?jiǎn)螕簟笆恰卑粹o。
三.應(yīng)用舉例
我們還是拿前面加法計(jì)算器的程序做例子。
大家是否記得,在
模態(tài)對(duì)話框及其彈出過(guò)程中我們修改了CAdditionDlg::OnBnClickedAddButton()函數(shù),在點(diǎn)了“計(jì)算”按鈕以后先彈出了一個(gè)模態(tài)對(duì)話框,詢(xún)問(wèn)用戶(hù)是否確定要進(jìn)行加法計(jì)算,并通過(guò)模態(tài)對(duì)話框DoModal函數(shù)的返回值判斷用戶(hù)選擇了“確定”還是“取消”。這些功能很明顯消息對(duì)話框完全能夠?qū)崿F(xiàn),雞啄米就使用消息對(duì)話框來(lái)替代原來(lái)的模態(tài)對(duì)話框。
在
非模態(tài)對(duì)話框的創(chuàng)建及顯示中,雞啄米注釋了模態(tài)對(duì)話框的相關(guān)代碼,加入了非模態(tài)對(duì)話框的創(chuàng)建和顯示代碼,我們?cè)诩尤胂?duì)話框之前將非模態(tài)對(duì)話框的代碼也注釋或刪除掉,確保此函數(shù)中不再生成原來(lái)的模態(tài)對(duì)話框或非模態(tài)對(duì)話框。
修改后的CAdditionDlg::OnBnClickedAddButton()函數(shù)如下:
C++代碼
void CAdditionDlg::OnBnClickedAddButton()
{
// TODO: Add your control notification handler code here
INT_PTR nRes;
// 顯示消息對(duì)話框
nRes = MessageBox(_T("您確定要進(jìn)行加法計(jì)算嗎?"), _T("加法計(jì)算器"), MB_OKCANCEL | MB_ICONQUESTION);
// 判斷消息對(duì)話框返回值。如果為IDCANCEL就return,否則繼續(xù)向下執(zhí)行
if (IDCANCEL == nRes)
return;
// 將各控件中的數(shù)據(jù)保存到相應(yīng)的變量
UpdateData(TRUE);
// 將被加數(shù)和加數(shù)的加和賦值給m_editSum
m_editSum = m_editSummand + m_editAddend;
// 根據(jù)各變量的值更新相應(yīng)的控件。和的編輯框會(huì)顯示m_editSum的值
UpdateData(FALSE);
// 設(shè)置屬性對(duì)話框?yàn)橄驅(qū)?duì)話框
//sheet.SetWizardMode();
}
編譯運(yùn)行,在運(yùn)行結(jié)果對(duì)話框上點(diǎn)“計(jì)算”按鈕彈出以下消息對(duì)話框:
大家也可以將MessageBox函數(shù)換為AfxMessageBox()函數(shù),同時(shí)參數(shù)進(jìn)行相應(yīng)修改,運(yùn)行下看看效果。
消息對(duì)話框就講到這里了。在以后的軟件開(kāi)發(fā)中用到它的頻率很高,希望大家慢慢熟悉并掌握它。有問(wèn)題歡迎回雞啄米博客交流或加入我們的編程入門(mén)群。