2011-12-19 29 views
3

.Show(frmParent)を使用して新しい非モーダル子ウィンドウを表示し、親ウィンドウを最小化すると、子も自動的に最小化されます。親ウィンドウが最小化されたときの子ウィンドウの最小化を防ぐ方法

これを防ぐにはどうすればよいですか?

EDIT:子ウィンドウは非モーダルでなければならず、それはは親がを設定している必要があります。

+2

'Show()'を使用して子/親関係を削除するだけです。 – vcsjones

+0

残念ながら、それは必要です。フィッシャーメーンの答えに対する私のコメントを参照してください。 – Jiri

+0

@jiriなぜ親フォームのプロパティを使用する必要がありますか? Form.Owner simpleはフォームへの参照を返します。実際にその参照を取得するために所有者を設定する必要はありません。 –

答えて

6

子ウィンドウではなく、「所有ウィンドウ」と呼ばれます。 Windowsは、所有しているウィンドウが常に所有者の一番上にあることを保証します。これは、所有者が最小化されたときにになることを意味します。

しかし、Winformsはその場でオーナーを変更することをサポートしています。このサンプルコードは正常に機能しました:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
    } 
    private Form ownedWindow; 

    private void button1_Click(object sender, EventArgs e) { 
     if (ownedWindow != null) return; 
     ownedWindow = new Form2(); 
     ownedWindow.FormClosed += delegate { ownedWindow = null; }; 
     ownedWindow.Show(this); 
    } 

    protected override void WndProc(ref Message m) { 
     // Trap the minimize and restore commands 
     if (m.Msg == 0x0112 && ownedWindow != null) { 
      if (m.WParam.ToInt32() == 0xf020) ownedWindow.Owner = null; 
      if (m.WParam.ToInt32() == 0xf120) { 
       ownedWindow.Owner = this; 
       ownedWindow.WindowState = FormWindowState.Normal; 
      } 
     } 
     base.WndProc(ref m); 
    } 
} 
+0

+1すてきな答え! –

+0

こんにちはハンス、これは素晴らしいですね!ありがとう、あなたは私のソフトウェアの多くのユーザーを幸せにしました:)所有しているウィンドウに直接最小化メッセージを閉じ込めて捨てることも可能だろうと思いますか? – Jiri

+0

フォームのMinimizeBoxプロパティをFalseに設定します。 –

0

子ウィンドウがダイアログのように動作する必要がある場合(開いている限り親ウィンドウとやり取りできない場合)、.ShowDialog(frmParent)を呼び出します。

+0

いいえ、子ウィンドウは非モーダル独立ウィンドウでなければなりません。ダイアログではありません。そして、それは複雑な "常に上の"ロジック(両方のウィンドウが常に独立して上にあることができ、親ウィンドウは他のMODAL子ウィンドウを持つことができる)のために親を設定する必要があります。 – Jiri

関連する問題