2012-11-03 18 views
10

Tôi đang cố gắng thay đổi màu sắc của việc tô sáng trong menu thả xuống ComboBox trên ứng dụng C# Windows Forms. Tôi đã tìm kiếm toàn bộ trang web để tìm câu trả lời và tùy chọn tốt nhất mà tôi tìm thấy cho đến nay là vẽ hình chữ nhật có màu mong muốn khi mục được chọn đang được vẽ.Thay đổi màu của việc tô sáng ComboBox

Class Search 
{ 
    Public Search() 
    { 
    } 

    private void addFilter() 
    { 
     ComboBox field = new ComboBox(); 

     field.Items.AddRange(new string[] { "Item1", "item2" }); 
     field.Text = "Item1"; 
     field.DropDownStyle = ComboBoxStyle.DropDownList; 
     field.FlatStyle = FlatStyle.Flat; 
     field.BackColor = Color.FromArgb(235, 235, 235); 
     field.DrawMode = DrawMode.OwnerDrawFixed; 
     field.DrawItem += field_DrawItem; 
    } 

    private void field_DrawItem(object sender, DrawItemEventArgs e) 
    { 
     if (e.Index >= 0) 
     { 
      ComboBox combo = sender as ComboBox; 

      if (e.Index == combo.SelectedIndex) 
       e.Graphics.FillRectangle(new SolidBrush(Color.Gray), 
             e.Bounds 
             ); 
      else 
       e.Graphics.FillRectangle(new SolidBrush(combo.BackColor), 
             e.Bounds 
             ); 

      e.Graphics.DrawString(combo.Items[e.Index].ToString(), e.Font, 
            new SolidBrush(combo.ForeColor), 
            new Point(e.Bounds.X, e.Bounds.Y) 
           ); 
     } 
    } 
} 

Vấn đề với mã này, là một khi một mục trong menu thả xuống được chọn, người kia mục I vẽ một hình chữ nhật vẫn là với màu sắc tôi muốn làm nổi bật. Sau đó, tôi đã cố gắng để lưu các mục cuối cùng được vẽ và vẽ lại nó:

Class Search 
{ 
    private DrawItemEventArgs lastDrawn; 

    Public Search() 
    { 
     lastDrawn = null; 
    } 

    private void addFilter() 
    { 
     ComboBox field = new ComboBox(); 

     field.Items.AddRange(new string[] { "Item1", "item2" }); 
     field.Text = "Item1"; 
     field.DropDownStyle = ComboBoxStyle.DropDownList; 
     field.FlatStyle = FlatStyle.Flat; 
     field.BackColor = Color.FromArgb(235, 235, 235); 
     field.DrawMode = DrawMode.OwnerDrawFixed; 
     field.DrawItem += field_DrawItem; 
    } 

    private void field_DrawItem(object sender, DrawItemEventArgs e) 
    { 
     if (e.Index >= 0) 
     { 
      ComboBox combo = sender as ComboBox; 
      if (e.Index == combo.SelectedIndex) 
      { 
       e.Graphics.FillRectangle(new SolidBrush(Color.Gray), e.Bounds); 
       if(lastDrawn != null) 
        lastDrawn.Graphics.FillRectangle(new SolidBrush(combo.BackColor), 
               lastDrawn.Bounds 
               ); 
       lastDrawn = e; 
      } 
      else 
       e.Graphics.FillRectangle(new SolidBrush(combo.BackColor), 
             e.Bounds 
             ); 

      e.Graphics.DrawString(combo.Items[e.Index].ToString(), e.Font, 
            new SolidBrush(combo.ForeColor), 
            new Point(e.Bounds.X, e.Bounds.Y) 
           ); 
     } 
    } 
} 

Dòng này trả về một lỗi vì lastDrawn.Bounds (loại không tương thích)

lastDrawn.Graphics.FillRectangle(new SolidBrush(combo.BackColor), 
               lastDrawn.Bounds 
               ); 

Tôi cảm thấy rằng việc thay đổi màu sắc nổi bật của trình đơn thả xuống là không thể. Cảm ơn bạn trước!

Trả lời

20

Trong trường hợp bạn đang sử dụng ComboBox ở nhiều nơi trong dự án của mình, bạn sẽ không lặp lại cùng một mã cho sự kiện DrawItem lặp đi lặp lại. Chỉ cần thêm lớp này vào dự án của bạn và bạn sẽ có một điều khiển ComboBox mới có thuộc tính HightlightColor mà sẽ làm cho nó dễ dàng hơn để sử dụng kiểm soát tất cả các dự án:

class AdvancedComboBox : ComboBox 
{ 
    new public System.Windows.Forms.DrawMode DrawMode { get; set; } 
    public Color HighlightColor { get; set; } 

    public AdvancedComboBox() 
    { 
     base.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; 
     this.HighlightColor = Color.Gray; 
     this.DrawItem += new DrawItemEventHandler(AdvancedComboBox_DrawItem); 
    } 

    void AdvancedComboBox_DrawItem(object sender, DrawItemEventArgs e) 
    { 
     if (e.Index < 0) 
      return; 

     ComboBox combo = sender as ComboBox; 
     if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) 
      e.Graphics.FillRectangle(new SolidBrush(HighlightColor), 
            e.Bounds); 
     else 
      e.Graphics.FillRectangle(new SolidBrush(combo.BackColor), 
            e.Bounds); 

     e.Graphics.DrawString(combo.Items[e.Index].ToString(), e.Font, 
           new SolidBrush(combo.ForeColor), 
           new Point(e.Bounds.X, e.Bounds.Y)); 

     e.DrawFocusRectangle(); 
    } 
}