在軟件中我們經常會彈出個小窗口,給一點點提示.這就會用到消息對話框.
在Win32 API程序中只有MessageBox這一種用法.
而在MFC中就有三各方法:
1.調用API中的MessageBox 2.調用CWnd的成員函數MessageBox 3.調用全局函數AfxMessageBox
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就行了.