在軟件中我們經常會彈出個小窗口,給一點點提示.這就會用到消息對話框.
在Win32 API程序中只有MessageBox這一種用法.
而在MFC中就有三各方法:
1.調用API中的MessageBox;
2.調用CWnd的成員函數MessageBox;
3.調用全局函數AfxMessageBox;
MFC中MessageBox的用法
一 函數原型及參數
function MessageBox(hWnd: HWND; Text, Caption: PChar; Type: Word): Integer;
hWnd:對話框父窗口句柄,對話框顯示在Delphi窗體內,可使用窗體的Handle屬性,否則可用0,使其直接作爲桌面窗口的子窗口。
Text:欲顯示的信息字符串。
Caption:對話框標題字符串。
Type:對話框類型常量。
該函數的返回值爲整數,用於對話框按鈕的識別。
2、類型常量
對話框的類型常量可由按鈕組合、缺省按鈕、顯示圖標、運行模式四種常量組合而成。
(1)按鈕組合常量
MB_OK = $00000000; //一個確定按鈕
MB_OKCANCEL = $00000001; //一個確定按鈕,一個取消按鈕
MB_ABORTRETRYIGNORE = $00000002; //一個異常終止按鈕,一個重試按鈕,一個忽略按鈕
MB_YESNOCANCEL = $00000003; //一個是按鈕,一個否按鈕,一個取消按鈕
MB_YESNO = $00000004; //一個是按鈕,一個否按鈕
MB_RETRYCANCEL = $00000005; //一個重試按鈕,一個取消按鈕
(2)缺省按鈕常量
MB_DEFBUTTON1 = $00000000; //第一個按鈕爲缺省按鈕
MB_DEFBUTTON2 = $00000100; //第二個按鈕爲缺省按鈕
MB_DEFBUTTON3 = $00000200; //第三個按鈕爲缺省按鈕
MB_DEFBUTTON4 = $00000300; //第四個按鈕爲缺省按鈕
(3)圖標常量
MB_ICONHAND = $00000010; //“×”號圖標
MB_ICONQUESTION = $00000020; //“?”號圖標
MB_ICONEXCLAMATION = $00000030; //“!”號圖標
MB_ICONASTERISK = $00000040; //“i”圖標
MB_USERICON = $00000080; //用戶圖標
MB_ICONWARNING = MB_ICONEXCLAMATION; //“!”號圖標
MB_ICONERROR = MB_ICONHAND; //“×”號圖標
MB_ICONINFORMATION = MB_ICONASTERISK; //“i”圖標
MB_ICONSTOP = MB_ICONHAND; //“×”號圖標
(4)運行模式常量
MB_APPLMODAL = $00000000; //應用程序模式,在未結束對話框前也能切換到另一應用程序
MB_SYSTEMMODAL = $00001000; //系統模式,必須結束對話框後,才能做其他操作
MB_TASKMODAL = $00002000; //任務模式,在未結束對話框前也能切換到另一應用程序
MB_HELP = $00004000; //Help Button
3、函數返回值
0 //對話框建立失敗
IDOK = 1 //按確定按鈕
IDCANCEL = 2 //按取消按鈕
IDABOUT = 3 //按異常終止按鈕
IDRETRY = 4 //按重試按鈕
IDIGNORE = 5 //按忽略按鈕
IDYES = 6 //按是按鈕
IDNO = 7 //按否按鈕
二 用法
1. MessageBox("這是一個最簡單的消息框!");
2. MessageBox("這是一個有標題的消息框!","標題");
3. MessageBox("這是一個確定取消的消息框!","標題", MB_OKCANCEL );
4. MessageBox("這是一個警告的消息框!","標題", MB_ICONEXCLAMATION );
5. MessageBox("這是一個兩種屬性的消息框!","標題",
MB_ICONEXCLAMATION|MB_OKCANCEL );
6. if(MessageBox("一種常用的應用","標題
" ,MB_ICONEXCLAMATION|MB_OKCANCEL)==IDCANCEL)
return;
注意:
以上消息框的用法是在CWnd的子類中的應用,如果不是,則要MessageBox(NULL,"ddd","ddd",MB_OK);或MessageBox(hWnd,"ddd","ddd",MB_OK); hWnd爲某窗口的句柄,或者直接用AfxMessageBox。
二、在MessageBox中顯示變量的值
CString string;
string.format("%d%s",m_age, m_address); //將變量組裝到字符串中
MessageBox(string,"消息框標題",消息框類型);
Win32 API 中MessageBox
舉個簡單例子
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPre,PSTR szCmdLine, int iCmdShow){
MessageBox(NULL,TEXT("hello world."),TEXT("Title"),0);//TEXT跟在MFC中常用的_T()一樣,表示unicode字符
return 0;
}
消息對話框函數定義如下
MessageBox( HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);
參數hWnd窗口句柄,一般用的較少.這例子中也沒有涉及窗口就直接寫NULL.
參數lpText是消息對話框中顯示的內容
參數lpCaption是對話框的標題
參數uType,指定對話框按鈕,圖標.
按鈕類型如下
這都是些在WinUser.h中定義的宏.MB是MessageBox Button的簡稱,後面的文字就表示有幾個按鈕,按鈕上顯示啥字.
比如MB_YESNOCANCEL 就是顯示3個按鈕,分別是yes, no , cancel
MB_OK
MB_OKCANCEL
MB_ABORTRETRYIGNORE
MB_YESNOCANCEL
MB_YESNO
MB_RETRYCANCEL
MB_CANCELTRYCONTINUE
圖標顯示
另外我還會常在對話框上面看到一個問號和警告的一些圖標,可以通過如下宏指定
MB_ICONWARNING
MB_ICONERROR
MB_ICONINFORMATION
MB_ICONSTOP
默認焦點
現在按鈕圖標都有了你可能還會想到如果有幾個按鈕那默認的焦點是在哪個按鈕.可以通過如下宏
MB_DEFBUTTON1
MB_DEFBUTTON2
MB_DEFBUTTON3
MB_DEFBUTTON4
數字代表從左到右按鈕的位置
上面講了按鈕,圖標,默認焦點的三個宏,但怎麼一起用呢 ?通過|這個符號把它們組合起來就是.舉例
MessageBox(NULL,TEXT("hello world."),TEXT("Title"),MB_OKCANCEL|MB_ICONINFORMATION|MB_DEFBUTTON1);
對話框函數返回值
最後你可能還會想如果用戶點不同的按鈕,我們怎麼得到用戶的選擇信息呢? 很簡單,就是通過函數MessageBox的返回值就判斷.函數會有如下返回值
IDOK
IDCANCEL
IDABORT
IDRETRY
IDIGNORE
IDYES
IDNO
所以可以這樣來判斷
if( MessageBox(NULL,TEXT("hello world."),TEXT("Title"),MB_OKCANCEL) == IDOK)
{
}
AfxMessageBox用法
AfxMessageBox是MFC對MessageBox的封裝.它有兩個不同的重載函數.
1) int AFXAPI AfxMessageBox(UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp = (UINT)-1)
其中nIDPrompt是字符串資源ID,也就是你在String Table中定義的字符串. nType跟前面MessageBox中的完全一樣. hIDHelp是跟幫助信息相關的.它這裏來個(UINT)-1,把一個-1轉成無符號類型.我實在沒搞懂啥意思,我都懷疑是不是它們寫錯了.應該直接寫個0. 反正在這裏默認值0也就表示使用默認的幫助文檔信息.
使用舉例AfxMessageBox(IDS_MSG)
2) int AFXAPI AfxMessageBox(LPCTSTR lpszText, UINT nType = MB_OK,UINT nIDHelp = 0);
其中的lpszText是指定對話框要顯示的內容.我們發現封裝好處就是使用更簡單,這裏之所以簡單是因爲用到了默認參數,用戶使用時不用老指定一堆參數.
不過我們發現有點扯蛋的事封裝到最後竟然連指定對話框標題的參數都給能沒了.你沒法再去指定了,只能默認顯示應用程序名字了.我估計當初那些寫代碼來封裝的人肯定也糾結了番,這title名字嘛給默認指定一個啥纔好啊? 估計肯定不會有滿意的名字,最後乾脆把這參數弄沒了,去動態獲取程序名字做標題了.
CWnd的MessageBox
只能繼承自CWnd的類才能使用該函數:
int MessageBox(LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType = MB_OK)
我們發現它也只是稍微封裝了下API的MessageBox,只是少了個HWnd的參數,然後後面有兩個參數有默認值.其他完全一樣.
當然如果你想使用消息對話框更漂亮點,添加些額外的消息.那就直接整成個Dialog就行了.