2016-05-13 5 views
1

を最大化さIが制約のMaxSizeを有するのWinForm形を有するとき移動。私はボタンを最大限に押すと、このウィンドウは正しいのMaxSizeで、0,0(左上隅)を配置するポップ。フォームが動かないようにする方法はありますか?防止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関数をオーバーライドします。 maximizeイベントを確認してください。好みの最大サイズを手動で設定し、関数から戻します。そのようにして、定義済みの最大化動作をオーバーライドします。

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