2009-07-27 20 views
7

Lo que estoy tratando de hacer es dibujar algo de vidrio en un formulario marcado como un contenedor mdi. Sin embargo, tan pronto como se establece el IsMdiContainer, el formulario agrega un MdiClient a su lista de Controles. En este punto, algo sucede con la forma principal, casi como si un panel gris oscuro estuviera acoplado a la forma completa en la que se coloca el MdiClient.¿Cómo eliminar el fondo gris en el formulario padre MDI?

que entonces hacer es lo siguiente para mover el control MdiClient fuera del camino un poco:

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

Esto entonces hace que la zona MdiClient real más pequeña para que podamos ver lo que está detrás de él (el bit que alberga los niños formas) y es descaradamente obvio que la forma de los padres no es la pintura o algo así.

Como se puede ver aquí: http://img525.imageshack.us/img525/8605/mdiglassproblem.png

ahora la necesidad de conseguir de alguna manera el área detrás de la MdiClient (parte gris oscuro que se vuelve blanco en la sección de vidrio) que se vaya.

¿Alguna idea?

PS - El cristal se representa con el método DwmExtendFrameIntoClientArea en Vista.

+0

Just a side note; la línea "if (c es MdiClient)" es redundante. El operador 'as' realiza la misma comprobación y devuelve nulo si es falso. Entonces, simplemente use el operador 'como' y luego busque nulo en su lugar. –

+0

... o seguir con el 'es' y usar un molde de estilo C, pero yo personalmente prefiero el otro enfoque. –

+0

Punto bastante justo. – Dylan

Respuesta

5

Logré que funcionase. Esa zona gris oscura de la que estaba hablando, que se pinta sobre todo, estaba ocurriendo en el método OnPaint de la forma. Obviamente, cuando hay un MdiContainer presente, el formulario está preprogramado para pintar el área gris oscura que obstruía el cristal.

Así que simplemente anule el método OnPaint sin llamar a su base y luego tome el código que se usó para dibujar el cristal en el método Paint normal y pegarlo en el método 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(); 
     } 
    } 

A continuación, sólo asegúrese de que la MdiContainer no está en la forma de la copa y se debe elaborar perfectamente.

6

Creo que esto es lo suficientemente perfecto.

foreach (Control ctrl in this.Controls) 
{ 

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


} 
Cuestiones relacionadas