-1

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

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

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

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

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

4

2 回答 2

1

我根据我在 stackoverflow 和谷歌搜索中找到的其他帖子编写了这段代码。

我已经测试过了,它可以工作。

[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);
    }
}
于 2016-11-04T09:18:20.910 回答
0

它是一个子表单,因此它不能最大化父表单。您能否分享更多细节以进一步帮助您?也许分享一个截图?

于 2016-11-03T19:37:00.990 回答