Delphi中平常使用的消息框有四種形式,有ShowMessage、MessageDlg、Application.MessageBox、MessageBox。下面來深入了解下這四種形式的實現和使用。
1.ShowMessage 顯示一個帶"OK"按鈕的消息框
使用這個函數可以顯示一個簡單的帶"OK"按鈕的消息框,消息框的標題是應用程序的標題名,參數Msg字符串顯示在消息框上。其源碼如下:
begin
ShowMessagePos(Msg, -1, -1);
end;
可以看到它調用了ShowMessagePos函數,我們觀察下面的代碼,發現跟ShowMessage很有關系,源碼如下:
begin
ShowMessage(Format(Msg, Params));
end;
procedure ShowMessagePos(const Msg: string; X, Y: Integer);
begin
MessageDlgPos(Msg, mtCustom, [mbOK], 0, X, Y);
end;
ShowMessageFmt跟ShowMessage類似,只是ShowMessageFmt參數是帶格式化的字符串。而它們最終都調用ShowMessagePos,這是在指定的位置顯示消息框,顯示出來的效果還是跟ShowMessage一樣,其參數X、Y坐標為-1的話表示出現在屏幕中間,其實現調用了MessageDlgPos,這跟MessageDlg又有什么關系,先看下面介紹MessageDlg。
2.MessageDlg 在屏幕中間顯示帶返回值的可自定義消息框
使用這個函數可以顯示一個帶圖標、多種組合按鈕、幫助ID,並且有返回值的消息框,其第一個參數Msg是消息框的顯示內容,第二個參數DlgType為消息框類型,以圖標形式顯示在消息框左側,其取值范圍如下:
mtError //帶紅色叉的錯誤圖標,標題是Error
mtInformation //帶藍色“i”符號的提示圖標,標題是Information
mtConfirmation //帶綠色問號的詢問圖標,標題是Confirmation
mtCustom //不帶圖標,消息框標題是應用程序的標題名稱
第三個參數Buttons是出現在消息框上的按鈕,可以是單個按鈕,也可以是組合按鈕,其取值范圍如下:
mbNo //按鈕'No'
mbOK //按鈕'OK'
mbCancel //按鈕'Cancel'
mbAbort //按鈕'Abort'
mbRetry //按鈕'Retry'
mbIgnore //按鈕'Ignore'
mbAll //按鈕'All'
mbNoToAll //按鈕'No to All'
mbYesToAll //按鈕'Yes to All'
mbHelp //按鈕'Help'
也可以是如下的組合按鈕:
mbYesNoAllCancel //mbYes, mbYesToAll, mbNo, mbNoToAll, and mbCancel
mbOKCancel //mbOK and mbCancel
mbAbortRetryIgnore //mbAbort, mbRetry, and mbIgnore
mbAbortIgnore //mbAbort, mbIgnore
第四個參數HelpCtx是幫助ID,是在消息框按“Help”按鈕或按F1出現的幫助文檔,若無需幫助的話,設置為0即可。返回值是用戶按下了消息框上的按鈕,所返回的值,其值與消息框上的各種按鈕分別對應,如下所示:
mbCancel //mrCancel(消息框右上角的”關閉“按鈕也是返回這個值)
mbYes //mrYes
mbNo //mrNo
mbAbort //mrAbort
mbRetry //mrRetry
mbIgnore //mrIgnore
mbAll //mrAll
mbNoToAll //mrNoToAll
mbYesToAll //mrYesToAll
下面是MessageDlg源碼:
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
begin
Result := MessageDlgPosHelp(Msg, DlgType, Buttons, HelpCtx, -1, -1, '');
end;
發現其下面還有兩個類似的函數,它們源碼如下:
Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer): Integer;
begin
Result := MessageDlgPosHelp(Msg, DlgType, Buttons, HelpCtx, X, Y, '');
end;
function MessageDlgPosHelp(const Msg: string; DlgType: TMsgDlgType;
Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer;
const HelpFileName: string): Integer;
begin
with CreateMessageDialog(Msg, DlgType, Buttons) do
try
HelpContext := HelpCtx;
HelpFile := HelpFileName;
if X >= 0 then Left := X;
if Y >= 0 then Top := Y;
if (Y < 0) and (X < 0) then Position := poScreenCenter;
Result := ShowModal;
finally
Free;
end;
end;
在這里我們看到了MessageDlgPos函數,這就是ShowMessage最終調用的函數,而MessageDlgPos與MessageDlg都調用了MessageDlgPosHelp函數,MessageDlgPosHelp是顯示一個帶幫助文件的消息框,其實現是調用了CreateMessageDialog函數,其函數原型如下:
於是乎,我們可以直接使用CreateMessageDialog來創建一個消息框,當我們在開發程序的時候,經常需要使用某些消息框,那么用這個來創建,然后用ShowMoDal來顯示和獲取返回值即可。繼續觀察CreateMessageDialog函數,可以發現它是使用TMessageForm創建的。
3.Application.MessageBox 用戶自定義消息框
這個函數是Delphi應用程序類對Windows API的消息框函數MessageBox的封裝,使其方便調用。其第一個參數是消息框內容文本,第二個參數是消息框標題,第三個參數是標識,指定消息框按鈕、圖標、默認按鈕等等。其函數原型如下:
參看其實現源碼,我們可以發現它的具體實現:
var
{省略····}
begin
{省略···}
if UseRightToLeftReading then Flags := Flags or MB_RTLREADING;
try
Result := Windows.MessageBox(Handle, Text, Caption, Flags);
finally
{省略···}
end;
end;
明白它是調用Windows API的MessageBox函數,把自身句柄傳遞進去。而第三個參數Flags等下面介紹Windows.MessageBox時一起講解。
4.MessageBox 系統API消息框函數
這個函數包含在Windows單元下,完整的函數名是Windows.MessageBox,是系統API函數,不僅可以自定義消息內容和標題,還有自定義按鈕、圖標、默認按鈕、擴展風格等等。其函數原型如下:
其第一個參數為標識消息框的所有者,如果這個參數是0的話,則消息框沒有父窗口,與應用程序同等級。第二三個參數不再介紹。第四個參數為標識參數,各種自定義效果風格皆在此設置。下面詳細介紹:
自定義出現的按鈕:
MB_OK //按鈕: 確定 (默認出現的按鈕)
MB_OKCANCEL //按鈕: 確定、取消
MB_RETRYCANCEL //按鈕: 重試、取消
MB_YESNO //按鈕: 是、否
MB_YESNOCANCEL //按鈕: 是、否、取消
自定義出現的圖標:
MB_ICONINFORMATION, MB_ICONASTERISK //帶”i“符號的信息提示圖標
MB_ICONQUESTION //帶問號的詢問圖標
MB_ICONSTOP, MB_ICONERROR, MB_ICONHAND //帶停止標志的圖標
自定義默認焦點的按鈕:
MB_DEFBUTTON2 //第二個按鈕設為默認
MB_DEFBUTTON3 //第三個按鈕設為默認
MB_DEFBUTTON4 //第四個按鈕設為默認
自定義消息框顯示模式:
MB_SYSTEMMODAL //跟MB_APPLMODAL相似,但是多了WS_EX_TOPMOST窗口風格
MB_TASKMODAL //跟MB_APPLMODAL相似,但是當參數句柄為空時,屬於當前任務的所有頂級窗口被禁用
此外,還有一些其他標識:
MB_HELP //添加一個”幫助“按鈕
MB_RIGHT //消息文本右對齊
MB_RTLREADING //從右到左顯示消息內容和標題
MB_SETFOREGROUND //使消息框成為前置窗口
MB_TOPMOST //使消息框在最上層顯示
MB_SERVICE_NOTIFICATION //Windows NT only
MB_SERVICE_NOTIFICATION_NT3X //Windows NT only
當沒有足夠內存創建消息框的時候,返回值為0,否則正常返回值如下:
IDCANCEL //'取消'按鈕被按下
IDIGNORE //'忽略'按鈕被按下
IDNO //'否'按鈕被按下
IDOK //'確定'按鈕被按下
IDRETRY //'重試'按鈕被按下
IDYES //'是'按鈕被按下
總結:ShowMessage、MessageDlg是TMessageForm消息窗體類創建的,而Application.MessageBox、MessageBox實質都是Windows API函數MessageBox。相比之下,后兩者的可自定義性更強一些。下面舉例下使用方法:
begin
ShowMessage('這是ShowMessage消息框');
ShowMessage('這是ShowMessage換行消息框' + #13#10 + '無幻博客http://blog.csdn.net/akof1314');
MessageDlg('這是MessageDlg消息框', mtCustom, [mbOK], 0);
if MessageDlg('這是MessageDlg消息框', mtWarning, mbOKCancel, 0) = mrOk then
begin
//···
end;
Application.MessageBox('這是Application.MessageBox消息框', '標題', MB_OK);
if Application.MessageBox('這是Application.MessageBox消息框', '標題', MB_OKCANCEL + MB_ICONQUESTION + MB_DEFBUTTON2 + MB_TOPMOST) = IDOK then
begin
//···
end;
MessageBox(0, '這是MessageBox消息框', '標題', MB_OK);
MessageBox(Handle, '這是MessageBox消息框', '標題', MB_OK);
case MessageBox(Handle, '這是MessageBox消息框', '標題', MB_YESNOCANCEL + MB_ICONSTOP + MB_DEFBUTTON3) of
IDCANCEL:
begin
//···
end;
IDYES:
begin
//···
end;
IDNO:
begin
//···
end;
end;
end;
運行結果如下: