c#完全隐藏表单边界只有当最大化
本文关键字:最大化 边界 表单 隐藏 | 更新日期: 2023-09-27 18:16:16
我有一个窗体,它是MDI窗体的子窗体。当这个表单没有最大化时,它会被放置在MDI表单中,位于几个菜单面板和控件的下面。它有边框、图标和控制框。当窗体最大化时,边框直接显示在主MDI窗体边框的下方。当它被最大化时,控制框被禁用,我们不需要任何原因的边界-它只是看起来很邋遢。窗体以编程方式调整大小,因此当窗体最大化时,永远不需要边框/控件。
是否有一种方法来设置FormBorderStyle = None,只有当窗体被最大化,并有FormBorderStyle =相当大时,它是任何大小以外的最大?
看下面的截图,红线是在我想要隐藏的边界上-标记为工具条控件的区域在表单上方,而不是实际上在它上面。空白标记的图片框是具有边框的实际窗体。当没有最大化时,它的边界将直接显示在图片框区域的上方和工具条区域的下方,并且可以由用户调整大小。当最大化时,用户无法调整它的大小,所以我想隐藏这个边框,因为它看起来很邋遢,在主表单边框
下面非最大化时:[1]:https://i.stack.imgur.com/TFDjk.png
当最大化时:https://i.stack.imgur.com/EK4cY.png
我根据在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);
}
}
它是一个子表单,因此它不能最大化父表单。你能否提供更多细节以进一步协助你?或者分享一个截图?