我的表单是MDI表单的子表单。当此表单未最大化时,它将适合MDI表单内部,位于多个菜单面板和控件下方。它有边框,图标和控制框。当窗体最大化时,边框直接显示在主MDI窗体边框下方。当它最大化时,控制盒被禁用,我们不需要任何原因的边框 - 它看起来很草率。表单以编程方式调整大小,以便在最大化时不需要边框/控件。
有没有办法设置FormBorderStyle = None,仅在表单最大化时,并且FormBorderStyle = sizeable,当它是Max以外的任何大小?
请参阅下面的屏幕截图,红线位于我想要隐藏的边框上 - 标记工具条控件的区域位于表单上方,而不是实际位于其上。标有空白区域的图片框是具有边框的实际形式。如果没有最大化,边框将直接显示在图片框区域上方和工具条区域下方,并且可以由用户调整大小。最大化时,用户无法调整大小,因此我想隐藏该边框,因为它在主窗体边框下看起来很草率
未最大化时:[1]:https://i.stack.imgur.com/TFDjk.png
答案 0 :(得分:1)
我已根据我在stackoverflow和google搜索中发现的其他帖子编写了此代码。
我已经对它进行了测试,但它确实有效。
[DllImport("user32.dll")]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll", ExactSpelling = true)]
private static extern int SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
const int GWL_EXSTYLE = -20;
const int WS_EX_CLIENTEDGE = 0x200;
const uint SWP_NOSIZE = 0x0001;
const uint SWP_NOMOVE = 0x0002;
const uint SWP_NOZORDER = 0x0004;
const uint SWP_NOACTIVATE = 0x0010;
const uint SWP_FRAMECHANGED = 0x0020;
const uint SWP_NOOWNERZORDER = 0x0200;
private void MdiEdgeBorderOnOff(bool off)
{
foreach(Control ctl in this.Controls)
{
if (ctl.GetType() != typeof(MdiClient)) continue;
int wnd = GetWindowLong(ctl.Handle, GWL_EXSTYLE);
if (off)
wnd &= ~WS_EX_CLIENTEDGE;
else
wnd |= WS_EX_CLIENTEDGE;
SetWindowLong(ctl.Handle, GWL_EXSTYLE, wnd);
SetWindowPos(ctl.Handle, IntPtr.Zero, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER |
SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
}
}
答案 1 :(得分:0)
它是一种子形式,因此无法最大化父形式。您能否分享更多细节以进一步为您提供帮助?也许分享截图?