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),因为窗体大小改变时会出现闪动情况。
以上
相关文章推荐
- c#修改本地连接工具 ip地址,dns,网关,子网掩码
- C#winform修改IP,dns
- C#读取Xml中出现”&”等特殊符号
- c#对csv的读写
- C#线程访问winform窗体控件
- 1.C# 的内置引用类型
- MFC窗口风格 说明及在c#中的定义使用
- C#中ComboBox的SelectedIndexChanged事件获取Tag值
- .NET创建Windows服务详细步骤(C#)
- C# 从服务器下载文件代码
- c#比较两个字符串
- VS C#程序打包覆盖安装不能更新的解决方法
- C#编写XML读写类操作xml文件
- C#中Winform程序中如何实现多维表头【不通过第三方报表程序】
- C#常用操作类库一(验证类)
- C#委托、事件学习之(一)——委托事件描述
- C#委托、事件学习之(三)——热水器烧水案例
- C#委托、事件学习之(二)——简单按钮委托事件
- C# 根据图片生成缩略图.直接输出到客户端.
- c#获取当前日期时间