【问题标题】:How to remove gray background on MDI parent form?如何去除 MDI 父窗体上的灰色背景?
【发布时间】:2009-07-27 20:20:48
【问题描述】:

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

【问题讨论】:

  • 只是一个旁注; “if (c is MdiClient)”这一行是多余的。 'as' 运算符执行相同的检查,如果为 false,则返回 null。因此,只需使用“as”运算符,然后检查 null。
  • ... 或坚持使用“is”并使用 C 样式转换,但我个人更喜欢另一种方法。
  • 好的,但现在我很困惑 - 为什么你需要'灰色部分'消失?它总是落后于 ht MDIClient。只是不要移动/缩小客户端?

标签: c# forms mdi mdiparent


【解决方案1】:

我认为这已经足够完美了。

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

【讨论】:

    【解决方案2】:

    我设法让它工作。我正在谈论的那个深灰色区域,它被绘制在表单的 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 不会挡住玻璃,它应该可以完美绘制。

    【讨论】:

      【解决方案3】:

      这应该可以解决问题

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-22
        • 2020-01-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多