详解MessageBox.docx

上传人:b****8 文档编号:10966626 上传时间:2023-02-24 格式:DOCX 页数:11 大小:16.68KB
下载 相关 举报
详解MessageBox.docx_第1页
第1页 / 共11页
详解MessageBox.docx_第2页
第2页 / 共11页
详解MessageBox.docx_第3页
第3页 / 共11页
详解MessageBox.docx_第4页
第4页 / 共11页
详解MessageBox.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

详解MessageBox.docx

《详解MessageBox.docx》由会员分享,可在线阅读,更多相关《详解MessageBox.docx(11页珍藏版)》请在冰豆网上搜索。

详解MessageBox.docx

详解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;

}

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 教育学心理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1