2017-04-12 6 views
1

C#でWindowsフォームアプリケーションを開発しています。このフォームでは、最大化状態で開始し、ユーザーがリストアまたはサイズ変更できないようにする必要があります。最大化モードで起動し、復元を無効にしてボタンを最大化し、フォームの境界線をロックするようにフォームを構成しましたが、タイトルバーをダブルクリックすると、予期せぬ小さなサイズに復元されます。ユーザーが最大化したフォームのサイズ変更を許可しない

FormBorderStyle = FixedSingle 
MaximizeBox = False 
WindowState = Maximized 

誰かがこの問題を解決し、私に解決策を教えてもらえますか?

ありがとうございます。

+1

ただ、フォーム上さらにonResizeイベントハンドラを固執し、それを戻します。なぜあなたがユーザーを苛立たせようとしているのか、不思議に思う人もいます。 –

+0

@TonyHopkinsonそれでは、イベントハンドラコードで "WindowState"を "Maximized"に設定していますか? ねえ、誰かを苛立たせていますか? – hecate

+0

@stuartd実行時に最大化されたフォームのサイズを "MinimumSize"プロパティに設定することを意味しましたか? – hecate

答えて

7

あなたのフォームは、いくつかのデフォルトサイズの値で始まり、ダブルクリックがちょうど2つの状態の間でトグルしていることを覚えておく必要があります。
あなたの正常な状態の中でフォームが、それは(あなたのケースのデフォルトで)最後だ取得しますが、あなたがオーバーライドすることができますサイズ:

Width = Screen.PrimaryScreen.Bounds.Width; 
Height = Screen.PrimaryScreen.Bounds.Height; 

もう一つは、あなたのアプリケーションは、(私が覚えているから)開始位置と呼ばれるもののデフォルトを持っているということです画面の中央に、あなたが使用してそれを変更することができます。

Form.StartPosition = new Point(0, 0); // top-left corner 

今、あなたはあなたのapplicaitonにしなければならないすべては、ウィンドウ状態間の切り替えのためにチェックすることです。最も簡単な方法は、WndProcを使用してthis msdn pageに記載されているメッセージを待つために、次のようになります。

protected override void WndProc(ref Message m) 
{ 
    const int WM_SYSCOMMAND = 0x0112; 
    const int SC_MAXIMIZE = 0xF030; 
    const int SC_RESTORE = 0xF120; 

    if (m.Msg == WM_SYSCOMMAND) 
    { 
     switch((int)m.WParam) 
     { 
      case SC_RESTORE: 
       // your window was restored (double clicked on the command bar) 
       // set it's window state back to maximize or do whatever 
       break; 

      case SC_MAXIMIZE: 
       // your window was maximized .. no actions needed, just for debugging purpose 
        break; 
     } 
    } 
    base.WndProc(ref m); 
} 
+0

これは私の答えより少しエレガントで、もう少し学んだ!あなたに小道具 – EpicKip

+0

@ m.rogalskiあなたの助けと努力のおかげで:) – hecate

3

これは、イベントをキャッチし、それをオーバーライドすることによって達成することができます。

private void Form_Load(object sender, EventArgs e) 
{ 
    this.FormBorderStyle = FormBorderStyle.FixedSingle; 
    this.WindowState = FormWindowState.Maximized; 
    this.MaximizeBox = false; 
    this.MinimumSize = Screen.GetWorkingArea(this.Location).Size; 
} 

private const int WM_NCLBUTTONDBLCLK = 0x00A3; 
//double click on a title bar 

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == WM_NCLBUTTONDBLCLK) 
    { 
     m.Result = IntPtr.Zero; 
     return; 
    } 
    base.WndProc(ref m); 
} 
+0

あなたの努力と助けてくれてありがとう。あなたの答えが間違っていたり、期待どおりに動かないわけではありませんが、m.rogalskiによって書かれた答えは非常によく説明されています。 SOは2つの回答を受け入れるシステムを実装する必要があります。 :) – hecate

+0

@hecate私は彼の答えから物事を学んだ、それは間違いなく受け入れられるべきである! upvoteありがとう:) – EpicKip

関連する問題