您的位置:首页 > 编程语言 > C#

C# Winform MDI窗体,父窗体控件覆盖子窗体的解决办法

2015-09-14 15:37 519 查看

问题:

MDI窗体中,父窗体控件会覆盖子窗体,网上很多解决方案表面上解决了问题,但失去了MDI窗体的基本特性,并不实用。比较赞成使用子窗体“代替”父窗体控件的方案。

思路:

不将控件放置在父窗体上,而是放在一个普通的子窗体上面,但其基本表现与将控件放在父窗体中一致。

这是表现指:

大小随着主窗体变化,覆盖整个客户区

不能被关闭、最小化等,一直处于填充整个客户区的状态

实现:

子窗体代码中

禁用最大化、最小化、关闭按钮、去除边框。

private void FrmBackground_Load(object sender, EventArgs e)
{
MinimizeBox = false;
MaximizeBox = false;
ControlBox = false;
FormBorderStyle = FormBorderStyle.None;
}


父窗体代码中

FrmBackground bk = new FrmBackground();


private void FormMain_Load(object sender, EventArgs e)
{
StartPosition = FormStartPosition.CenterScreen;
Width = 1000;
Height = 600;
// 背景
bk.MdiParent = this;
bk.Show();
bk.Size = new Size(990, 453);
}


说明:

bk.Size = new Size(990, 453);

这里的大小是指背景窗体刚好覆盖默认父窗体(1000x600)客户区的大小,可以用 父窗体的 ClientSize 获得相应大小,我这里是因为用了其他窗体类,不是原生的 Form ,所以看起来大小的数字很奇怪。

在父窗体改变大小时,跟着改变子窗体大小:

private void FormMain_SizeChanged(object sender, EventArgs e)
{
bk.Height = ClientSize.Height - 147;
bk.Width = ClientSize.Width - 10;
}


说明:

我这里减去的是非客户区的大小,在使用原生 Form 时,可能不需要减,或者减的大小有区别,请自行测试。

小结

以上基本上就解决了父窗体控件会覆盖子窗体的问题。

如果需要给父窗体加背景图片,

方法1

捕捉MDI容器

这个方法对于使用dotnetbar等第三方form控件的情况可能不适用。

方法2

给上述子窗体加一个背景 pictureBox,使其充满这个窗体,专门用于做背景图,如果只用背景图,可以这样做,不建议直接给窗体加背景(
BackgroundImage
),因为窗体大小改变时会出现闪动情况

以上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: