详解MessageBox.docx
《详解MessageBox.docx》由会员分享,可在线阅读,更多相关《详解MessageBox.docx(11页珍藏版)》请在冰豆网上搜索。
详解MessageBox
首先,介绍一下MessageBox.Show()参数:
//提示框显示的按钮
publicenumMessageBoxButtons
{
OK=0x00000000,
OKCancel=0x00000001,
AbortRetryIgnore=0x00000002,
YesNoCancel=0x00000003,
YesNo=0x00000004,
RetryCancel=0x00000005
}
提示框提示的图标
publicenumMessageBoxIcon
{
None=0,
Hand=0x00000010,
Question=0x00000020,
Exclamation=0x00000030,
Asterisk=0x00000040,
Stop=Hand,
Error=Hand,
Warning=Exclamation,
Information=Asterisk,
}
提示框默认焦点在第几个按钮上
publicenumMessageBoxDefaultButton
{
Button1=0x00000000,
Button2=0x00000100,
Button3=0x00000200,
}
//按钮的显示方式
publicenumMessageBoxOptions
{
ServiceNotification=0x00200000,
DefaultDesktopOnly=0x00020000,
RightAlign=0x00080000,
RtlReading=0x00100000,
}
以上这几个枚举是MessageBox最终呈现的效果的设置项,这只是.NET平台提供的设置项,实际上MessageBox显示的样式设置有更多,具体的可以参考windowsAPIMessageBox方法。
具体每个枚举值的意义,在VS中都有说明,这里不在赘述。
接下来,我们要介绍MessageBox这个类里边所有的静态方法:
publicstaticDialogResultShow(stringtext);
publicstaticDialogResultShow(IWin32Windowowner,stringtext);
publicstaticDialogResultShow(stringtext,stringcaption);
publicstaticDialogResultShow(IWin32Windowowner,stringtext,stringcaption);
publicstaticDialogResultShow(stringtext,stringcaption,MessageBoxButtonsbuttons);
publicstaticDialogResultShow(IWin32Windowowner,stringtext,stringcaption,MessageBoxButtonsbuttons);
publicstaticDialogResultShow(stringtext,stringcaption,MessageBoxButtonsbuttons,MessageBoxIconicon);
publicstaticDialogResultShow(IWin32Windowowner,stringtext,stringcaption,MessageBoxButtonsbuttons,MessageBoxIconicon);
publicstaticDialogResultShow(stringtext,stringcaption,MessageBoxButtonsbuttons,MessageBoxIconicon,MessageBoxDefaultButtondefaultButton);
publicstaticDialogResultShow(IWin32Windowowner,stringtext,stringcaption,MessageBoxButtonsbuttons,MessageBoxIconicon,MessageBoxDefaultButtondefaultButton);
publicstaticDialogResultShow(stringtext,stringcaption,MessageBoxButtonsbuttons,MessageBoxIconicon,MessageBoxDefaultButtondefaultButton,MessageBoxOptionsoptions);
publicstaticDialogResultShow(IWin32Windowowner,stringtext,stringcaption,MessageBoxButtonsbuttons,MessageBoxIconicon,MessageBoxDefaultButtondefaultButton,MessageBoxOptionsoptions);
publicstaticDialogResultShow(stringtext,stringcaption,MessageBoxButtonsbuttons,MessageBoxIconicon,MessageBoxDefaultButtondefaultButton,MessageBoxOptionsoptions,booldisplayHelpButton);
publicstaticDialogResultShow(stringtext,stringcaption,MessageBoxButtonsbuttons,MessageBoxIconicon,MessageBoxDefaultButtondefaultButton,MessageBoxOptionsoptions,stringhelpFilePath);
publicstaticDialogResultShow(IWin32Windowowner,stringtext,stringcaption,MessageBoxButtonsbuttons,MessageBoxIconicon,MessageBoxDefaultButtondefaultButton,MessageBoxOptionsoptions,stringhelpFilePath);
publicstaticDialogResultShow(stringtext,stringcaption,MessageBoxButtonsbuttons,MessageBoxIconicon,MessageBoxDefaultButtondefaultButton,MessageBoxOptionsoptions,stringhelpFilePath,HelpNavigatornavigator);
publicstaticDialogResultShow(stringtext,stringcaption,MessageBoxButtonsbuttons,MessageBoxIconicon,MessageBoxDefaultButtondefaultButton,MessageBoxOptionsoptions,stringhelpFilePath,stringkeyword);
publicstaticDialogResultShow(IWin32Windowowner,stringtext,stringcaption,MessageBoxButtonsbuttons,MessageBoxIconicon,MessageBoxDefaultButtondefaultButton,MessageBoxOptionsoptions,stringhelpFilePath,HelpNavigatornavigator);
publicstaticDialogResultShow(IWin32Windowowner,stringtext,stringcaption,MessageBoxButtonsbuttons,MessageBoxIconicon,MessageBoxDefaultButtondefaultButton,MessageBoxOptionsoptions,stringhelpFilePath,stringkeyword);
publicstaticDialogResultShow(stringtext,stringcaption,MessageBoxButtonsbuttons,MessageBoxIconicon,MessageBoxDefaultButtondefaultButton,MessageBoxOptionsoptions,stringhelpFilePath,HelpNavigatornavigator,objectparam);
publicstaticDialogResultShow(IWin32Windowowner,stringtext,stringcaption,MessageBoxButtonsbuttons,MessageBoxIconicon,MessageBoxDefaultButtondefaultButton,MessageBoxOptionsoptions,stringhelpFilePath,HelpNavigatornavigator,objectparam);
虽然MessageBox的静态方法有20个之多,但是其实每个方法在内部调用的都是ShowCore方法:
privatestaticDialogResultShowCore(IWin32Windowowner,stringtext,stringcaption,
MessageBoxButtonsbuttons,MessageBoxIconicon,MessageBoxDefaultButtondefaultButton,
MessageBoxOptionsoptions,boolshowHelp){
也就是说,其实这个方法是实现消息框的关键,为了更好的理解.NET实现的原理,我把这个方法基本用C#的格式重新写了一遍,代码如下:
usingSystem;
usingSystem.ComponentModel;
usingSystem.Runtime.InteropServices;
usingSystem.Security;
usingSystem.Security.Permissions;
usingSystem.Windows.Forms;
namespaceWindowsFormsApplication1
{
classMessageBoxTest
{
[DllImport("user32.dll")]
publicstaticexternIntPtrGetActiveWindow();
[DllImport("kernel32.dll",CharSet=CharSet.Auto)]
publicstaticexternIntPtrGetModuleHandle(stringmodName);
[DllImport("kernel32.dll",CharSet=CharSet.Auto)]
publicstaticexternIntPtrLoadLibrary(stringlibname);
[DllImport("user32.dll",CharSet=CharSet.Auto)]
publicstaticexternintMessageBox(IntPtrhWnd,stringtext,stringcaption,uinttype);
[DllImport("user32.dll",CharSet=CharSet.Auto)]
publicstaticexternIntPtrSendMessage(HandleRefhWnd,intmsg,intwParam,intlParam);
privateconstintHELP_BUTTON=0x00004000;
privateconstintWM_SETFOCUS=0x0007;
internalstaticDialogResultMessageBoxShow(IWin32Windowowner,stringtext,stringcaption,MessageBoxButtonsbuttons,MessageBoxIconicon,MessageBoxDefaultButtondefaultButton,MessageBoxOptionsoptions,boolshowHelp)
{
if(buttonsMessageBoxButtons.RetryCancel)
{
thrownewInvalidEnumArgumentException("buttons",(int)buttons,typeof(MessageBoxButtons));
}
if(icon<0||icon>MessageBoxIcon.Asterisk)
{
thrownewInvalidEnumArgumentException("icon",(int)icon,typeof(MessageBoxIcon));
}
if(defaultButton<0||defaultButton>MessageBoxDefaultButton.Button3)
{
thrownewInvalidEnumArgumentException("defaultButton",(int)defaultButton,typeof(MessageBoxDefaultButton));
}
//options即不包含MessageBoxOptions.ServiceNotification也不包含MessageBoxOptions.DefaultDesktopOnly
//或者当前进程在用户交互模式中运行
if((options&(MessageBoxOptions.ServiceNotification|MessageBoxOptions.DefaultDesktopOnly))==0&&!
SystemInformation.UserInteractive)
{
thrownewInvalidOperationException();
}
//options包含MessageBoxOptions.ServiceNotification或者包含MessageBoxOptions.DefaultDesktopOnly
//但是owner不为空
if(owner!
=null&&(options&(MessageBoxOptions.ServiceNotification|MessageBoxOptions.DefaultDesktopOnly))!
=0)
{
thrownewArgumentException("options");
}
//options包含MessageBoxOptions.ServiceNotification或者包含MessageBoxOptions.DefaultDesktopOnly
//但是showHelp位true
if(showHelp&&(options&(MessageBoxOptions.ServiceNotification|MessageBoxOptions.DefaultDesktopOnly))!
=0)
{
thrownewArgumentException("options");
}
//options包含MessageBoxOptions.ServiceNotification或者包含MessageBoxOptions.DefaultDesktopOnly
if((options&~(MessageBoxOptions.RightAlign|MessageBoxOptions.RtlReading))!
=0)
{
CodeAccessPermissionpermission=newSecurityPermission(SecurityPermissionFlag.UnmanagedCode);
permission.Demand();
}
CodeAccessPermissionsafePermission=newUIPermission(UIPermissionWindow.SafeSubWindows);
safePermission.Demand();
uint style=(showHelp)?
(uint)HELP_BUTTON:
0;style |=(uint)buttons|(uint)icon|(uint)defaultButton|(uint
)options;
IntPtrhandle=IntPtr.Zero;
if (owner== null){handle = GetActiveWindow();} else
{
Controlcontrol
=owner as Control;handle =control!
= null ?
control.Handle:
owner.Handle;
}
IntPtruserCookie=IntPtr.Zero;
if(GetModuleHandle("shell32.dll")==IntPtr.Zero&&LoadLibrary("shell32.dll")==IntPtr.Zero)
{
intlastWin32Error=Marshal.GetLastWin32Error();
thrownewWin32Exception(lastWin32Error,"获取动态链接库shell32.dll失败");
}
DialogResultresult;
try
{
result
=
Win32ToDialogResult(MessageBox(handle,text,caption,style));
}
finally
{
SendMessage(newHandleRef(owner,handle),WM_SETFOCUS,0,0);
}
returnresult;
}
privateconstintIDOK=1;
privateconstintIDCANCEL=2;
privateconstintIDABORT=3;
privateconstintIDRETRY=4;
privateconstintIDIGNORE=5;
privateconstintIDYES=6;
privateconstintIDNO=7;
privatestaticDialogResultWin32ToDialogResult(intvalue)
{
switch(value)
{
caseIDOK:
returnDialogResult.OK;
caseIDCANCEL:
returnDialogResult.Cancel;
caseIDABORT:
returnDialogResult.Abort;
caseIDRETRY:
returnDialogResult.Retry;
caseIDIGNORE:
returnDialogResult.Ignore;
caseIDYES:
returnDialogResult.Yes;
caseIDNO:
returnDialogResult.No;
default:
returnDialogResult.No;
}
}
}
}