2016-12-15 10 views
0

При использовании метода Focus() целевая форма приобретает фокус, но также переносится перед другими формами.Фокус формы, не принося ее перед другими

Есть ли способ избежать этой модификации z-order?

Вот краткий пример:

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: использование TopMost не будет работать, так как 'f2' должно быть в состоянии получить перед' f1' в некоторых случаях (например, если щелкнуть 'f2'). –

ответ

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); 
    } 
} 

В этом примере фокус усиления окна, не выходя перед другим окном при нажатии на это клиентская область. Если вы нажмете на неклиентскую область (панель заголовка и границы) или кнопку фокуса усиления фигуры и вы увидите ее спереди.