我在C#(windows 64bit)中使用了一个列表框项目,我想用不同的颜色着色不同的项目 颜色。 我通过将列表框设置为OwnerDrawFixed和"重载"来管理。 DrawItem函数
this.TestList.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
this.TestList.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.TestList_DrawItem);
private void TestList_DrawItem(object sender, DrawItemEventArgs e)
{
e.DrawBackground();
TestListItem item = TestList.Items[e.Index] as TestListItem;
bool selected = ((e.State & DrawItemState.Selected) == DrawItemState.Selected);
if (item != null)
{
SolidBrush backgroundBrush = reportsBackgroundBrushSelected;
if (selected)
{
backgroundBrush = reportsBackgroundBrushSelected;
}
SolidBrush foregroundBrush = (selected) ? reportsForegroundBrushSelected : reportsForegroundBrush;
e.Graphics.DrawString( // Draw the appropriate text in the ListBox
item.GetTestName(), // The message linked to the item
TestList.Font, // Take the font from the listbox
new SolidBrush(item.GetColor()), // Set the color
0, // X pixel coordinate
e.Index * TestList.ItemHeight // Y pixel coordinate. Multiply the index by the ItemHeight defined in the listbox.
);
//background:
e.DrawFocusRectangle();
}
else
{
}
}
选择项目也可以正常工作。 但是,当试图滚动列表项时,"闪烁" - 有时会消失,直到我点击 他们再次强制绘制项目。 我的理论是,我需要重载滚动条事件并调用刷新函数,也许?
我很感激任何帮助,
谢谢, Despairy
图片: http://i62.tinypic.com/25soga1.jpg
http://i57.tinypic.com/2di20er.jpg
编辑: 看起来e.bounds是解决方案。
滚动并拖动鼠标可能编辑了Y属性。正确的电话:
e.Graphics.DrawString( // Draw the appropriate text in the ListBox
item.GetTestName(), // The message linked to the item
TestList.Font, // Take the font from the listbox
new SolidBrush(item.GetColor()), // Set the color
e.Bounds.X, // X pixel coordinate
e.Bounds.Y // Y pixel coordinate. Multiply the index by the ItemHeight defined in the listbox.
);