2009-07-27 3 views
7

Quello che sto cercando di fare è disegnare un bicchiere su un modulo contrassegnato come un contenitore mdi. Tuttavia, non appena IsMdiContainer è impostato, il modulo aggiunge un MdiClient alla sua lista di controlli. A questo punto succede qualcosa alla forma genitore - quasi come un pannello grigio scuro viene ancorato all'intero modulo su cui viene posizionato MdiClient.Come rimuovere lo sfondo grigio sul modulo padre MDI?

Ho poi fare è la seguente per spostare il controllo MdiClient fuori del modo un po ':

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

Ciò rende quindi la zona MdiClient attuale più piccoli in modo da poter vedere ciò che è dietro di esso (il bit che ospita le forme dei bambini) ed è palesemente ovvio che la forma genitoriale non è la pittura o qualcosa del genere.

Come si può vedere qui: http://img525.imageshack.us/img525/8605/mdiglassproblem.png

ora bisogno di ottenere in qualche modo l'area dietro il MdiClient (parte grigio scuro che è reso bianco sulla sezione di vetro) di andare via.

Qualche idea?

PS - Il vetro viene reso utilizzando il metodo DwmExtendFrameIntoClientArea in Vista.

+0

Solo una nota a margine; la riga "if (c is MdiClient)" è ridondante. L'operatore 'as' esegue lo stesso controllo e restituisce null se è falso. Quindi, basta usare l'operatore 'as' e quindi controllare null. –

+0

... o attaccare con 'è' e utilizzare un cast di stile C, ma personalmente preferisco l'altro approccio. –

+0

Punto abbastanza giusto. – Dylan

risposta

5

Sono riuscito a farlo funzionare. Quella zona grigio scuro di cui stavo parlando, che viene dipinta su tutto ciò che stava accadendo nel metodo OnPaint della forma. Ovviamente quando c'è un MdiContainer presente il modulo è preprogrammato per dipingere l'area grigio scuro che ostruiva il vetro.

Quindi, basta sovrascrivere il metodo OnPaint senza chiamare la base e quindi prendere il codice che è stato utilizzato per disegnare il vetro nel normale metodo Paint e incollarlo nel metodo OnPaint.

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

Poi basta assicurarsi che il MdiContainer non è nel modo di vetro e dovrebbe disegnare perfettamente.

6

Penso che questo sia abbastanza perfetto.

foreach (Control ctrl in this.Controls) 
{ 

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


}