2016-04-26 32 views
1

我创建了一个自定义的checklistbox这样我就可以改变但某些项目的前景色,当我使MutiColumn真值相互重叠,而不是多列工作..定制CheckListBox荣誉2列

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

任何人都可以提出任何需要改变的地方,以避免发生这种情况吗?

+0

您是否尝试编码DrawSubItem?也。错误结果的图像通常有帮助.. – TaW

+0

非常感谢,我会去看看.. – Nim

+0

也检查出属性:'ListVIewItem.UseItemStyleForSubItems' - 您可能需要将其设置为false .. – TaW

回答

2

您的矩形坐标不准确。此外,控件使用TextRenderer类来绘制文本:

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); 
} 
相关问题