2016-04-26 9 views
1

Ich habe eine benutzerdefinierte CheckListBox so konnte ich jedoch die Vordergrundfarbe bestimmter Elemente ändern, wenn ich die MutiColumn auf true ermöglichen die Werte einander überlappen, anstatt in mehreren Spalten arbeiten ..Benutzerdefinierte CheckListBox Honor 2 Spalten

public sealed class CustomCheckedListBox : CheckedListBox 
{ 
    public CustomCheckedListBox() 
    { 
     DoubleBuffered = true; 
    } 

    protected override void OnDrawItem(DrawItemEventArgs e) 
    { 
     Size checkSize = CheckBoxRenderer.GetGlyphSize(e.Graphics, 
      System.Windows.Forms.VisualStyles.CheckBoxState.MixedNormal); 
     int dx = (e.Bounds.Height - checkSize.Width)/2; 
     e.DrawBackground(); 
     bool isChecked = GetItemChecked(e.Index); //For some reason e.State doesn't work so we have to do this instead. 
     CheckBoxRenderer.DrawCheckBox(e.Graphics, new Point(dx, e.Bounds.Top + dx), 
      isChecked 
       ? System.Windows.Forms.VisualStyles.CheckBoxState.CheckedNormal 
       : System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal); 
     using (StringFormat sf = new StringFormat {LineAlignment = StringAlignment.Center}) 
     { 
      using (Brush brush = new SolidBrush(isChecked ? CheckedItemColor : BackColor)) 
      { 
       e.Graphics.DrawString(Items[e.Index].ToString(), Font, brush, 
        new Rectangle(e.Bounds.Height, e.Bounds.Top, e.Bounds.Width - e.Bounds.Height, e.Bounds.Height), sf); 
      } 
     } 
    } 

    private Color _checkedItemColor = Color.Blue; 

    public Color CheckedItemColor 
    { 
     get { return _checkedItemColor; } 
     set 
     { 
      _checkedItemColor = value; 
      Invalidate(); 
     } 
    } 
} 

Kann jemand Änderungen vorschlagen, die vorgenommen werden müssen, damit dies nicht passiert?

+0

Haben Sie versucht, das DrawSubItem zu codieren? Ebenfalls. Ein Bild des falschen Ergebnisses hilft normalerweise .. – TaW

+0

Vielen Dank, ich werde einen Blick .. – Nim

+0

Überprüfen Sie auch die Eigenschaft: 'ListView.Item.UseItemStyleForSubItems' - Sie müssen möglicherweise auf false setzen .. – TaW

Antwort

2

Ihre Rechteckkoordinaten sind nicht korrekt. Außerdem verwenden Steuerelemente die TextRenderer-Klasse, um Text zu zeichnen:

protected override void OnDrawItem(DrawItemEventArgs e) { 
    e.DrawBackground(); 
    bool isChecked = GetItemChecked(e.Index); 
    Size checkSize = CheckBoxRenderer.GetGlyphSize(e.Graphics, CheckBoxState.MixedNormal); 

    CheckBoxRenderer.DrawCheckBox(e.Graphics, 
    new Point(e.Bounds.Left + 2, 
       e.Bounds.Top + (e.Bounds.Height/2) - (checkSize.Height/2)), 
    isChecked ? CheckBoxState.CheckedNormal : CheckBoxState.UncheckedNormal); 

    TextRenderer.DrawText(e.Graphics, Items[e.Index].ToString(), Font, 
    new Rectangle(e.Bounds.Left + checkSize.Width + 3, e.Bounds.Top, 
        e.Bounds.Width - (checkSize.Width + 3), e.Bounds.Height - 1), 
    isChecked ? CheckedItemColor : ForeColor, Color.Empty, TextFormatFlags.VerticalCenter); 
}