C# Полностью скрыть границу формы только при максимизации

У меня есть форма, которая является дочерней формой MDI. Когда эта форма не развернута, она помещается внутри формы MDI, под несколькими панелями меню и элементами управления. Он имеет рамку, значок и панель управления. Когда форма развернута, граница отображается непосредственно под основной границей формы MDI. Когда оно развернуто, блок управления отключен, и нам не нужна граница по какой-либо причине - она ​​выглядит просто неаккуратно. Размер формы изменяется программным способом, поэтому при максимизации никогда не возникает необходимости в границах / элементах управления.

Есть ли способ установить FormBorderStyle = None, ТОЛЬКО, когда форма развернута, и FormBorderStyle = sizeable, когда он имеет любой размер, кроме Max?

Смотрите скриншоты ниже. Красная линия находится на границе, которую я хочу скрыть - область, отмеченная элементами управления toolstrip, находится выше формы, а не на ней. Пустое пространство, помеченное графическим блоком, является фактической формой, имеющей границу Если оно не развернуто, граница будет отображаться непосредственно над областью графического блока и под областью полосок инструментов и может быть изменена пользователем. При максимизации пользователь не может изменить его размер, поэтому я хочу скрыть эту границу, так как она выглядит неряшливо под основной границей формы

Когда не развернуто: [1]:

Когда развернуто:

2 ответа

Я написал этот код в соответствии с другими постами, которые я нашел в stackru и googling.

Я проверил это, и это работает.

[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);
    }
}

Это дочерняя форма, следовательно, она не может максимизировать родительскую форму. Можете ли вы поделиться более подробной информацией, чтобы помочь вам? Может поделитесь скриншотом?

Другие вопросы по тегам