2010-10-28 2 views
0

Есть ли способ изменить цвет границы некоторых общих элементов управления в Windows Forms (TextBox, ComboBox, MaskedTextBox, ...), когда они находятся в фокусе? Я хотел бы добиться этого в своем диалоговом окне, поэтому, когда управление находится в фокусе, граница становится синей?Изменить цвет границы Windows Forms Control на фокусе

ответ

0

Я предлагаю, чтобы нарисовать прямоугольник вокруг активного контроля, как следующее:

  • Мне нужен способ, чтобы получить все элементы управления, которые в форме, даже которые они в вложенной панели или GroupBoxe.

Метод:

// Get all controls that exist in the form. 
public static List<Control> GetAllControls(IList controls) 
{ 
    List<Control> controlsCollectorList = new List<Control>(); 
    foreach (Control control in controls) 
    { 
     controlsCollectorList.Add(control); 
     List<Control> SubControls = GetAllControls(control.Controls); 
     controlsCollectorList.AddRange(SubControls); 
    } 
    return controlsCollectorList; 
} 
  • Тогда .. функциональность рисования ..

Код:

public Form1() 
{ 
    InitializeComponent(); 

    // The parents that'll draw the borders for their children 
    HashSet<Control> parents = new HashSet<Control>(); 

    // The controls' types that you want to apply the new border on them 
    var controlsThatHaveBorder = new Type[] { typeof(TextBox), typeof(ComboBox) }; 

    foreach (Control item in GetAllControls(Controls)) 
    { 
     // except the control if it's not in controlsThatHaveBorder 
     if (!controlsThatHaveBorder.Contains(item.GetType())) continue; 

     // Redraw the parent when it get or lose the focus 
     item.GotFocus += (s, e) => ((Control)s).Parent.Invalidate(); 
     item.LostFocus += (s, e) => ((Control)s).Parent.Invalidate(); 

     parents.Add(item.Parent); 
    } 

    foreach (var parent in parents) 
    { 
     parent.Paint += (sender, e) => 
     { 
      // Don't draw anything if this is not the parent of the active control 
      if (ActiveControl.Parent != sender) return; 

      // Create the border's bounds 
      var bounds = ActiveControl.Bounds; 
      var activeCountrolBounds = new Rectangle(bounds.X - 1, bounds.Y - 1, bounds.Width + 1, bounds.Height + 1); 

      // Draw the border... 
      ((Control)sender).CreateGraphics().DrawRectangle(Pens.Blue, activeCountrolBounds); 
     }; 
    } 
} 

Успехов!

Смежные вопросы