2009-07-27 5 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 - Стекло визуализируется с использованием метода DwmExtendFrameIntoClientArea в Vista.

+0

Просто боковое примечание; строка «if (c is MdiClient)» является избыточной. Оператор «as» выполняет ту же проверку и возвращает null, если он является ложным. Итак, просто используйте оператор «как», а затем проверьте вместо него значение null. –

+0

... или придерживайтесь «is» и используйте приведение стиля C, но я лично предпочитаю другой подход. –

+0

Справедливая точка зрения. – Dylan

ответ

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


}