2013-07-30 38 views
1

我有下面的代码的用户控件:与颜色选择器所有者绘制组合框

public partial class ColorComboBox : ComboBox 
{ 
    public ColorComboBox() 
    { 
     InitializeComponent(); 

     this.DropDownStyle = ComboBoxStyle.DropDownList; 
     this.DrawMode = DrawMode.OwnerDrawFixed; 

     string[] colorNames = System.Enum.GetNames(typeof(KnownColor)); 

     this.Items.AddRange(colorNames); 
    } 

    protected override void OnDrawItem(DrawItemEventArgs e) 
    { 
     if (e.Index < 0) return; 

     this.SuspendLayout(); 

     string s = (string)this.Items[ e.Index ]; 

     using (Brush b = new SolidBrush(Color.FromName(s))) 
     { 
      e.Graphics.DrawRectangle(Pens.Black, 2, e.Bounds.Top + 1, 20, 11); 
      e.Graphics.FillRectangle(b, 3, e.Bounds.Top + 2, 19, 10); 

      e.Graphics.DrawString(s, this.Font, Brushes.Black, 25, e.Bounds.Top); 
     } 

     e.DrawFocusRectangle(); 

     this.ResumeLayout(); 

    } 

} 

增加ComboBox的实例的形式,我有一个奇怪的问题后,鼠标指针下的每个项目都将该项目更改为粗体。

有没有人知道为什么会发生这种情况?

谢谢。

+0

这些'SuspendLayout'和'ResumeLayout'调用sho没有必要。 – LarsTech

+0

@LarsTech:你说得对,他们没有必要,所以我删除了这些陈述。该代码现在可以在添加'e.DrawBackround()'后生效。 – Intrepid

回答

1

我已成功通过添加以下行来排序了这一点:

e.DrawBackground(); 
0

由于它的正常工作

要使用它:

label1.Text = colorComboBox1.SelectedItem.ToString(); 
    label1.BackColor = Color.FromName(colorComboBox1.SelectedItem.ToString()); 

string s = (string)colorComboBox1.Items[colorComboBox1.SelectedIndex]; 
    label1.Text = s; 
    label1.BackColor = Color.FromName(s);