2016-11-03 15 views
-1

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

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

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

Когда не развернуто: [1]: https://i.stack.imgur.com/TFDjk.png

Когда Развернутое: https://i.stack.imgur.com/EK4cY.png

+0

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

+0

https://i.stack.imgur.com/EK4cY.png –

+0

Вы имеете в виду поднятую рамку? – McNets

ответ

0

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

+0

https://i.stack.imgur.com/EK4cY.png –

+0

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

1

Я написал этот код в соответствии с другими сообщениями, которые я нашел в stackoverflow и 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); 
    } 
}