2009-07-27 8 views
7

Was ich versuche etwas Glas auf einem Formular als mdi Container markiert zu tun ist, ziehen. Sobald der IsMdiContainer jedoch festgelegt ist, fügt das Formular einen MdiClient zu seiner Liste der Steuerelemente hinzu. An dieser Stelle passiert etwas mit der Elternform - fast wie eine dunkelgraue Tafel an das gesamte Formular angedockt wird, auf das der MdiClient gelegt wird.Wie grauen Hintergrund auf MDI Elternformular entfernen?

ich dann tun, ist die nach der MdiClient Kontrolle aus dem Weg ein wenig zu bewegen:

foreach(var c in Controls) 
    { 
     if(c is MdiClient) 
     { 
      var client = (MdiClient)c; 
      client.BackColor = Color.Red; 
      client.Dock = DockStyle.None; 
      client.Size = new Size(this.Width-100, this.Height); 
      break; 
     } 
    } 

Dies macht dann den eigentlichen MdiClient Bereich kleiner, so können wir sehen, was dahinter ist (das Bit, das Gastgeber die Kinder formen) und es ist offensichtlich, dass die Elternform keine Malerei oder etwas anderes ist. Ich jetzt http://img525.imageshack.us/img525/8605/mdiglassproblem.png

müssen irgendwie hinter dem MdiClient (dunkelgrau Teil der auf dem Glasabschnitt weiß gemacht wird), um den Bereich zu gelangen, um wegzugehen:

Wie hier zu sehen.

Irgendwelche Ideen?

PS - Glas wird mit DwmExtendFrameIntoClientArea Verfahren in Vista gemacht.

+0

Nur eine Randnotiz; Die Zeile "if (c is MdiClient)" ist redundant. Der 'as' -Operator führt die gleiche Prüfung durch und gibt null zurück, wenn er falsch ist. Also, benutze einfach den "as" -Operator und überprüfe dann stattdessen auf null. –

+0

... oder Stick mit dem ‚ist‘ und eine C Casts, aber ich persönlich bevorzuge den anderen Ansatz. –

+0

Fair genug Punkt. – Dylan

Antwort

5

Ich schaffte es zum Laufen zu bringen. Die dunkle Grauzone, über die ich sprach, die über alles gemalt wird, kam in der OnPaint-Methode des Formulars vor. Wenn ein MdiContainer vorhanden ist, ist das Formular offensichtlich vorprogrammiert, um den dunkelgrauen Bereich zu bemalen, der das Glas blockiert.

Also überschreiben Sie einfach die OnPaint-Methode, ohne sie als Basis aufzurufen, und nehmen Sie den Code, der zum Zeichnen des Glases in der normalen Paint-Methode verwendet wurde, und kleben Sie ihn in die OnPaint-Methode.

protected override void OnPaint(PaintEventArgs e) 
    { 
     //base.OnPaint(e); 
     bool glassEnabled = IsGlassEnabled(); 
     if (glassEnabled) // draw glass if enabled 
     { 
      Rectangle rc = picPlaceHolder.ClientRectangle; 

      IntPtr destdc = e.Graphics.GetHdc(); // hwnd must be the handle of form, not control 
      IntPtr Memdc = CreateCompatibleDC(destdc); 
      IntPtr bitmapOld = IntPtr.Zero; 

      BITMAPINFO dib = new BITMAPINFO(); 
      dib.bmiHeader.biHeight = -(rc.Bottom - rc.Top); 
      dib.bmiHeader.biWidth = rc.Right - rc.Left; 
      dib.bmiHeader.biPlanes = 1; 
      dib.bmiHeader.biSize = Marshal.SizeOf(typeof(BITMAPINFOHEADER)); 
      dib.bmiHeader.biBitCount = 32; 
      dib.bmiHeader.biCompression = BI_RGB; 
      if (!(SaveDC(Memdc) == 0)) 
      { 
       IntPtr bitmap = CreateDIBSection(Memdc, ref dib, DIB_RGB_COLORS, 0, IntPtr.Zero, 0); 
       if (!(bitmap == IntPtr.Zero)) 
       { 
        bitmapOld = SelectObject(Memdc, bitmap); 
        BitBlt(destdc, rc.Left, rc.Top, rc.Right - rc.Left, rc.Bottom - rc.Top, Memdc, 0, 0, SRCCOPY); 
       } 

       // remember to clean up 
       SelectObject(Memdc, bitmapOld); 

       DeleteObject(bitmap); 
       ReleaseDC(Memdc, -1); 
       DeleteDC(Memdc); 
      } 
      e.Graphics.ReleaseHdc(); 
     } 
    } 

dann sicher nur, dass die MdiContainer sind nicht in der Art und Weise des Glases und es sollte perfekt zeichnen.

6

Ich denke, das genug ist perfekt.

foreach (Control ctrl in this.Controls) 
{ 

     if (ctrl is MdiClient) 
     { 
      ctrl.BackColor = Color.LightGray; 
     } 


}