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;
}