如何删除MDI父窗体上的灰色背景?

时间:2009-07-27 20:20:48

标签: c# forms mdi mdiparent

我要做的是在标记为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。

3 个答案:

答案 0 :(得分:8)

我认为这很完美。

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

答案 1 :(得分: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不会妨碍玻璃,它应该完美地绘制。

答案 2 :(得分:0)

这应该可以解决问题

Controls.OfType<MdiClient>().FirstOrDefault().BackColor = Color.FromArgb(14, 16, 62);