2010-10-28 119 views
0

當Windows窗體(TextBox,ComboBox,MaskedTextBox,...)中的某些常用控件焦點對齊時,是否有方法更改它們的邊框顏色?我想在我的對話框中實現這一點,所以當控制焦點時,它的邊界變成了藍色?在焦點上更改Windows窗體控件的邊框顏色

回答

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

祝你好運!