2016-12-15 2 views
0

Focus()メソッドを使用すると、ターゲットフォームがフォーカスを取得しますが、他のフォームの前にも表示されます。フォームを他のものの前に持ち込まずにフォーカスする

このzオーダーの修正を避ける方法はありますか?

class MyForm : Form 
{ 
    static void Main(string[] args) 
    { 
     MyForm f1 = new MyForm() 
     { 
      Text = "f1" 
     }; 
     f1.Show(); 

     MyForm f2 = new MyForm() 
     { 
      Text = "f2" 
     }; 
     f2.Show(); 

     Button b1 = new Button(); 
     b1.Click += (sender, e) => f2.Focus(); 
     f1.Controls.Add(b1); 

     Button b2 = new Button(); 
     b2.Click += (sender, e) => f1.Focus(); 
     f2.Controls.Add(b2); 

     Application.Run(f1); 
    } 
} 

f1のボタンをクリック、f2がフォーカスを獲得するだけでなく、(私は避けたいのですが事はある)f1の前に来る:

は、ここで簡単な例です。

+0

設定はf1.TopMost = trueになります。あなたのために働く? –

+0

あなたは 'BringToFront'タグをつけました。この/または 'SendToBack'は必要に応じてフォームを注文する可能性がありますが、初期の変更は避けられません。 – TaW

+0

@ TroyMac1ure: 'f2'がクリックされた場合など、' f2'が 'f1'の前に入ることができるはずなので、TopMostを使うと動作しません。 –

答えて

0

それはそれを行うための最善の方法ですが、私は所有者のプロパティを使用して終了本当にわからない:上のクリックした際に、他のウィンドウの前面に行かなくても、窓のゲインフォーカスこの例では

class MyForm : Form 
{ 
    public const int WM_NCLBUTTONDOWN = 0x00A1; 

    protected override void WndProc(ref Message m) 
    { 
     switch (m.Msg) 
     { 
      case WM_NCLBUTTONDOWN: 
       TakeFocus(); 
       base.WndProc(ref m); 
       break; 

      default: 
       base.WndProc(ref m); 
       break; 
     } 
    } 

    private void TakeFocus() 
    { 
     if (Owner == null && OwnedForms.Length > 0) 
     { 
      Form tmp = OwnedForms[0]; 
      tmp.Owner = null; 
      Owner = tmp; 
     } 
     BringToFront(); 
    } 

    static void Main(string[] args) 
    { 
     MyForm f1 = new MyForm() 
     { 
      Text = "f1", 
     }; 
     f1.Show(); 

     MyForm f2 = new MyForm() 
     { 
      Text = "f2", 
     }; 
     f2.Owner = f1; 
     f2.Show(); 

     Button b1 = new Button(); 
     b1.Click += (sender, e) => 
     { 
      f1.TakeFocus(); 
     }; 
     f1.Controls.Add(b1); 

     Button b2 = new Button(); 
     b2.Click += (sender, e) => 
     { 
      f2.TakeFocus(); 
     }; 
     f2.Controls.Add(b2); 

     Application.Run(f1); 
    } 
} 

クライアントエリアです。 クライアント以外の領域(タイトルバーと罫線)またはボタンをクリックすると、フォームがフォーカスを取得して前面に表示されます。

関連する問題