2016-05-13 2 views
1

У меня есть форма WinForm с ограниченным MaxSize. Если нажать кнопку максимизации, это окно появится в положение 0,0 (верхний левый угол) с правильным MaxSize. Есть ли способ предотвратить перемещение формы?Предотвращать перемещение MaxSized C# WinForm при максимальном размере

Я могу установить новую позицию после перемещения формы (по ОС), но пользователь может видеть форму, которая появляется на экране, что не очень аккуратно. (Я изменил FormName, чтобы опубликовать код здесь). SuspendLayout здесь не помогает, и я не обязательно хочу отключить кнопку максимизации.

void frmWinForm_SizeChanged(object sender, EventArgs e) 
{ 
    if (WindowState == FormWindowState.Maximized) 
    { 
     var x = ... // some calculated or original x position 
     var y = ... // some calculated or original y position 
     WindowState = FormWindowState.Normal; 
     SetBounds(x, y, MaxSize.X, MaxSize.Y); 
    } 
} 

ответ

2

Переопределить функцию WndProc. Проверьте максимальное событие. Установите предпочтительный максимальный размер вручную и вернитесь из функции. Таким образом, вы отменяя предопределенное поведение разворачивания:

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == 0x0112) // WM_SYSCOMMAND 
    { 
     if (m.WParam == new IntPtr(0xF030)) // Maximize event 
     { 
      Size = MaximumSize; //Set size manually and return 
      return; 
     } 
    } 
    base.WndProc(ref m); 
} 

Это предотвратит кнопку разворачивания от изменения в кнопку нормализует. Использование следующего кода не будет препятствовать изменению кнопки:

struct MinMaxInfo 
{ 
    public Point ptReserved; 
    public Point ptMaxSize; 
    public Point ptMaxPosition; 
    public Point ptMinTrackSize; 
    public Point ptMaxTrackSize; 
} 

protected override void WndProc(ref Message m) 
{ 
    base.WndProc(ref m); //do that first: "'Who is the boss' applies. You'd typically want to be the one that has the last say in this case." 
    if (m.Msg == 0x0024) //WM_GETMINMAXINFO 
    { 
     MinMaxInfo minMaxInfo = (MinMaxInfo)m.GetLParam(typeof(MinMaxInfo)); 
     minMaxInfo.ptMaxSize.X = MaximumSize.Width; //Set size manually 
     minMaxInfo.ptMaxSize.Y = MaximumSize.Height; 
     minMaxInfo.ptMaxPosition.X = Location.X; //Stay at current position 
     minMaxInfo.ptMaxPosition.Y = Location.Y; 
     Marshal.StructureToPtr(minMaxInfo, m.LParam, true); 
    } 
} 
+0

Это работает очень хорошо, спасибо за этот быстрый ответ. –

+0

Не работает правильно, окно не может быть восстановлено. Вместо этого перепутайте WM_GETMINMAXINFO, измените значение ptMaxPosition. –

+0

@HansPassant Спасибо за подсказку, я добавил, что ... – Norman

Смежные вопросы