2016-05-13 21 views
1

我有一個WinForm窗體,它具有受約束的MaxSize。如果我按下最大化按鈕,此窗口會彈出到位置0,0(左上角),並顯示正確的MaxSize。有沒有辦法阻止表單移動?防止MaxSized C#WinForm在最大化時移動

我可以在窗體被移動後(通過OS)設置一個新的位置,但用戶可以看到窗體在屏幕上彈出,這不是很整齊。 (我改變了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