C#中MDI父窗体下子窗体额外控制栏如何移除?
解决MDI子窗体最大化后出现额外控制栏的问题
这个坑我之前踩过!当你把MDI子窗体的ControlBox设为false后,正常状态下确实会隐藏控制按钮,但一旦子窗体最大化,MDI父窗体会自动生成一个额外的控制栏——这是Windows Forms的默认行为,它会把父窗体的容器元素和子窗体的状态合并显示。
要彻底移除这个额外的控制栏,你可以试试下面两种方法:
方法一:修改子窗体的边框样式(简单直接)
如果你的子窗体不需要边框,或者可以接受无框样式,直接在子窗体的构造函数里设置以下属性:
public partial class Demo : Form { public Demo() { InitializeComponent(); // 禁用控制盒 this.ControlBox = false; // 设置边框为无框,最大化时就不会出现额外栏 this.FormBorderStyle = FormBorderStyle.None; // 如果需要保留窗体可调整大小的特性,也可以换成这个样式 // this.FormBorderStyle = FormBorderStyle.SizableToolWindow; } }
这种方法代码量少、易操作,唯一的缺点是如果需要保留子窗体的常规边框,就不太适用。
方法二:重写子窗体的WndProc拦截系统消息(灵活保留边框)
如果你需要保留子窗体的边框,同时移除最大化后的额外控制栏,可以通过重写WndProc方法拦截系统绘制标题栏的消息:
public partial class Demo : Form { public Demo() { InitializeComponent(); this.ControlBox = false; this.MaximizeBox = false; this.MinimizeBox = false; } protected override void WndProc(ref Message m) { const int WM_NCCALCSIZE = 0x0083; // 当WM_NCCALCSIZE消息的WParam不为空时,说明系统正在计算非客户区(含标题栏)的大小 if (m.Msg == WM_NCCALCSIZE && m.WParam != IntPtr.Zero) { // 直接返回,阻止系统绘制标题栏和额外控制栏 return; } base.WndProc(ref m); } }
这种方法可以保留子窗体的常规边框(比如FormBorderStyle.Sizable),同时彻底隐藏那些额外的控制按钮,灵活性更高。
另外,你现有父窗体创建子窗体的代码不需要改动,运行正常:
private void MDI_Load(object sender, EventArgs e) { Demo naya = new Demo(); naya.MdiParent = this; naya.WindowState = FormWindowState.Maximized; naya.Show(); }
试一下上面的方法,应该就能解决你遇到的问题了!
内容的提问来源于stack exchange,提问作者Abdul Rahman
相关产品推荐
相关产品推荐

