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

问题:

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),因为窗体大小改变时会出现闪动情况


以上

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值