c# - MDI 子窗体似乎让父窗体的控件显示为透明

标签 c# winforms transparency mdi

这是一个小例子:

带有图片框和按钮的常规旧表单。没有什么花哨。在按钮的点击事件中:

private void button1_Click(object sender, EventArgs e)
{
    Form form = new Form();
    form.MdiParent = this;
    form.BackColor = Color.Red;

    form.WindowState = FormWindowState.Maximized;
    form.Show();
}

enter image description here

但是,当我单击按钮时,会发生这种情况:

enter image description here

图片框和按钮仍然显示,就像子窗体是透明的一样。关于如何改变这个有什么建议吗?我希望子表单能够像常规表单一样涵盖所有内容。

最佳答案

问题在于 MDI 子窗口是 MDI 客户端窗口的子窗口。深灰色背景的那一张。您放置在 MDI 父级上的任何控件都将具有更高的 Z 顺序并与 MDI 客户端窗口重叠。因此任何 MDI 子窗口。您可以将控件停靠到边缘,Winforms 将自动缩小 MDI 客户端窗口以适应剩余的空间。对于按钮来说,正确的做法是将其放在面板上并停靠面板。但这对图像没有帮助。

Winforms 使得获取对 MDI 客户端窗口的引用有点棘手,您必须迭代 MDI 父级的 Controls 集合才能找到它。像这样:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        this.IsMdiContainer = true;
        foreach (Control ctl in this.Controls) {
            if (ctl is MdiClient) {
                ctl.BackgroundImage = Properties.Resources.Chrysanthemum;
                ctl.BackgroundImageLayout = ImageLayout.Center;   // doesn't work
                break;
            }
        }
    }
}

请注意评论,解决这个问题比我想象的要困难得多。为窗口实现 Paint 事件是一种选择,但它像廉价汽车旅馆一样闪烁。

关于c# - MDI 子窗体似乎让父窗体的控件显示为透明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6790820/

相关文章:

c# - GUI 不在同一线程中更新 c# winforms

c# - 使用 Serilog 登录到事件查看器时动态设置 EventID

.net - 在构建过程中自动加密 App.config 文件

c# - Windows 窗体按钮。已启用无法正常工作

java - 如何让一个越来越透明最后消失的JPanel呢?

c# - 如何将透明光标渲染到保留 alpha channel 的位图?

java - 为什么 JFrame 仍然不透明?

c# - Richtextbox 行数

c# - 是否有一个类可以在 .NET 数据和 XML 类型之间进行转换?

c# - Visual Studio 2013 Ultimate 与 Microsoft.VisualBasic.PowerPack