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

C# 如何删除MDI父窗体上的灰色背景?,c#,forms,mdi,mdiparent,C#,Forms,Mdi,Mdiparent,我要做的是在标记为mdi容器的窗体上绘制一些玻璃。但是,一旦设置了IsMdiContainer,表单就会将MdiClient添加到其控件列表中。在这一点上,父窗体发生了一些事情-几乎就像一个深灰色面板被停靠到MdiClient所在的整个窗体上 然后,我执行以下操作以稍微移开MdiClient控件: foreach(var c in Controls) { if(c is MdiClient) { var client = (

我要做的是在标记为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;
        }
    }
这会使实际的MDI客户端区域变小,这样我们就可以看到它后面的内容(承载子窗体的位),很明显父窗体不是绘画或其他东西

如图所示:

我现在需要以某种方式使MDI客户端后面的区域(在玻璃部分呈现为白色的深灰色部分)消失

有什么想法吗


PS-Glass正在Vista中使用DwmExtendFrameIntoClientArea方法进行渲染。

我设法使其正常工作。我所说的那个深灰色区域,它覆盖了所有的东西,是在形式的OnPaint方法中发生的。显然,当有MDI容器存在时,表格会预先编程,以绘制阻挡玻璃的深灰色区域

所以只需重写OnPaint方法而不调用它的base,然后获取用于在普通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();
        }
    }

然后确保MDI容器不会挡住玻璃,它应该画得很完美。

我认为这已经足够完美了

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

这应该能奏效

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

只是一个旁注;“如果(c是MdiClient)”行是冗余的。“as”运算符执行相同的检查,如果为false,则返回null。所以,只需使用'as'运算符,然后检查null即可。。。。或者坚持“是”,使用C风格的演员阵容,但我个人更喜欢另一种方式。好吧,但现在我很困惑——为什么你需要“灰色部分”消失?它总是落后于客户。只是不要移动/收缩客户机?