如何删除MDI父表单上的灰色背景?

我要做的是在标记为mdi容器的表格上画一些玻璃。 但是,只要设置了IsMdiContainer,表单就会在其控件列表中添加一个MdiClient。 此时,父表单会发生一些事情 – 几乎就像深灰色面板停靠在MdiClient所在的整个表单上。

我接下来要做的是将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方法渲染Glass。

我觉得这很完美。

 foreach (Control ctrl in this.Controls) { if (ctrl is MdiClient) { ctrl.BackColor = Color.LightGray; } } 

我设法让它运作起来。 我正在谈论的那个深灰色的区域被绘制在一切forms的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不会妨碍玻璃,它应该完美地绘制。