Implementation von ShowDialog unter .NET 1.1
Frank Dzaebel, erstellt am: 16.8.2005, zuletzt geändert: 16.8.2005
Kategorie: Windows Forms, .NET-Version: 1.1
Der folgende Code ist komplett von Lutz Roeders Reflector erstellt worden.
Er spiegelt die Framework-Implementation folgender Methode wieder:
System.Windows.Forms.Form.ShowDialog().
public DialogResult ShowDialog() {return this.ShowDialog(null);}
public DialogResult ShowDialog(IWin32Window owner)
{
object[] objArray1;
if (owner == this)
{
objArray1 = new object[1] { "showDialog" };
throw new ArgumentException(SR.GetString("OwnsSelfOrOwner",objArray1),"owner");
}
if (base.Visible)
{
objArray1 = new object[1] { "showDialog" };
throw new InvalidOperationException(SR.GetString("ShowDialogOnVisible",objArray1));
}
if (!base.Enabled)
{
objArray1 = new object[1] { "showDialog" };
throw new InvalidOperationException(SR.GetString("ShowDialogOnDisabled",objArray1));
}
if (!this.TopLevel)
{
objArray1 = new object[1] { "showDialog" };
throw new InvalidOperationException(SR.GetString("ShowDialogOnNonTopLevel",objArray1));
}
if (this.Modal)
{
objArray1 = new object[1] { "showDialog" };
throw new InvalidOperationException(SR.GetString("ShowDialogOnModal",objArray1));
}
if (!SystemInformation.UserInteractive)
{
throw new InvalidOperationException(SR.GetString("CantShowModalOnNonInteractive"));
}
if (((owner != null) && ((((int)UnsafeNativeMethods.GetWindowLong(new HandleRef(owner,owner.Handle),-20)) & 8) == 0)) && (owner is Control))
{
owner = ((Control)owner).TopLevelControl;
}
this.calledOnLoad = false;
this.calledMakeVisible = false;
IntPtr ptr1 = UnsafeNativeMethods.GetCapture();
if (ptr1 != IntPtr.Zero)
{
UnsafeNativeMethods.SendMessage(new HandleRef(null,ptr1),0x1f,IntPtr.Zero,IntPtr.Zero);
SafeNativeMethods.ReleaseCapture();
}
IntPtr ptr2 = UnsafeNativeMethods.GetActiveWindow();
IntPtr ptr3 = (owner == null) ? ptr2 : owner.Handle;
IntPtr ptr4 = IntPtr.Zero;
base.Properties.SetObject(Form.PropDialogOwner,owner);
Form form1 = this.OwnerInternal;
if ((owner is Form) && (owner != form1))
{
this.Owner = (Form)owner;
}
try
{
base.SetState(0x20,true);
this.dialogResult = DialogResult.None;
base.CreateControl();
if ((ptr3 != IntPtr.Zero) && (ptr3 != base.Handle))
{
if (UnsafeNativeMethods.GetWindowLong(new HandleRef(owner,ptr3),-8) == base.Handle)
{
objArray1 = new object[1] { "showDialog" };
throw new ArgumentException(SR.GetString("OwnsSelfOrOwner",objArray1),"owner");
}
UnsafeNativeMethods.GetWindowLong(new HandleRef(this,base.Handle),-8);
UnsafeNativeMethods.SetWindowLong(new HandleRef(this,base.Handle),-8,new HandleRef(owner,ptr3));
}
try
{
base.Visible = true;
if (this.dialogResult == DialogResult.None)
{
Application.RunDialog(this);
}
}
finally
{
if (!UnsafeNativeMethods.IsWindow(new HandleRef(null,ptr2)))
{
ptr2 = ptr3;
}
if (UnsafeNativeMethods.IsWindow(new HandleRef(null,ptr2)) && SafeNativeMethods.IsWindowVisible(new HandleRef(null,ptr2)))
{
UnsafeNativeMethods.SetActiveWindow(new HandleRef(null,ptr2));
}
this.SetVisibleCore(false);
if (base.IsHandleCreated)
{
IntSecurity.ManipulateWndProcAndHandles.Assert();
try
{
this.DestroyHandle();
}
finally
{
CodeAccessPermission.RevertAssert();
}
}
base.SetState(0x20,false);
}
}
finally
{
this.Owner = form1;
base.Properties.SetObject(Form.PropDialogOwner,null);
}
return this.DialogResult;
}