自定义CheckListBox荣誉2列
Custom CheckListBox Honor 2 columns
我创建了一个自定义检查列表框,这样我就可以更改某些项目的前景色,但是当我启用 MutiColumn 为真时,值相互重叠而不是在多个列中工作。
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();
}
}
}
任何人都可以建议为避免这种情况发生而需要进行的任何更改吗?
您的矩形坐标不准确。此外,控件使用 TextRenderer class 绘制文本:
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);
}
我创建了一个自定义检查列表框,这样我就可以更改某些项目的前景色,但是当我启用 MutiColumn 为真时,值相互重叠而不是在多个列中工作。
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();
}
}
}
任何人都可以建议为避免这种情况发生而需要进行的任何更改吗?
您的矩形坐标不准确。此外,控件使用 TextRenderer class 绘制文本:
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);
}