C#仅在最大化

时间:2016-11-03 19:29:46

标签: c# .net mdi formborderstyle

我的表单是MDI表单的子表单。当此表单未最大化时,它将适合MDI表单内部,位于多个菜单面板和控件下方。它有边框,图标和控制框。当窗体最大化时,边框直接显示在主MDI窗体边框下方。当它最大化时,控制盒被禁用,我们不需要任何原因的边框 - 它看起来很草率。表单以编程方式调整大小,以便在最大化时不需要边框/控件。

有没有办法设置FormBorderStyle = None,仅在表单最大化时,并且FormBorderStyle = sizeable,当它是Max以外的任何大小?

请参阅下面的屏幕截图,红线位于我想要隐藏的边框上 - 标记工具条控件的区域位于表单上方,而不是实际位于其上。标有空白区域的图片框是具有边框的实际形式。如果没有最大化,边框将直接显示在图片框区域上方和工具条区域下方,并且可以由用户调整大小。最大化时,用户无法调整大小,因此我想隐藏该边框,因为它在主窗体边框下看起来很草率

未最大化时:[1]:https://i.stack.imgur.com/TFDjk.png

最大化时:https://i.stack.imgur.com/EK4cY.png

2 个答案:

答案 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)

它是一种子形式,因此无法最大化父形式。您能否分享更多细节以进一步为您提供帮助?也许分享截图?