2009-07-27 58 views
7

我想要做的是在標記爲mdi容器的窗體上繪製一些玻璃。但是,只要設置了IsMdiContainer,表單就會將MdiClient添加到它的控件列表中。在這一點上,父窗體發生了一些事情 - 幾乎就像一個深灰色的面板被停靠在MdiClient所在的整個窗體上。如何刪除MDI父窗體上的灰色背景?

我那麼做的是以下移動MDICLIENT控制的方式進行了一下:

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

這就使得實際MDICLIENT面積小,所以我們可以看到背後是什麼(它承載位孩子們的形式),顯然父母的形式不是繪畫或什麼的。

由於可以在這裏看到:http://img525.imageshack.us/img525/8605/mdiglassproblem.png

我現在需要以某種方式獲得MDICLIENT後面的區域(其呈現白色玻璃部分暗灰色部分)走開。

任何想法?

PS - 使用Vista中的DwmExtendFrameIntoClientArea方法呈現玻璃。

+0

只是一個側面說明; 「if(c是MdiClient)」行是多餘的。 'as'操作符執行相同的檢查,如果它爲假,則返回null。所以,只需使用'as'運算符,然後檢查是否爲null。 – 2009-07-27 20:39:02

回答

5

我設法讓它工作。我在談論的那個深灰色的區域,在表單的OnPaint方法中發生了所有事情。很明顯,當MdiContainer出現時,表單被預先編程爲畫出阻礙玻璃的深灰色區域。

因此,只需重寫OnPaint方法而不調用它的基礎,然後將代碼用於在普通Paint方法中繪製玻璃並將其粘貼在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(); 
     } 
    } 

然後只要確保MdiContainer不在玻璃的方式,它應該完美繪製。

6

我覺得這很完美。

foreach (Control ctrl in this.Controls) 
{ 

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


} 
相關問題