【发布时间】:2012-01-30 15:36:24
【问题描述】:
我有一个ListView,我希望在其中调整项目的绘制(例如突出显示列表视图项目中的某些字符串),但是我不想从根本上改变项目的显示方式。
我已将 OwnerDraw 设置为 true,并且可以了解如何绘制突出显示效果,但是每当我尝试遵循默认实现来绘制列表视图项的其余部分时,都会出错,我我留下一大堆图形问题,表明实际上我完全出错了。
我是否可以在某个地方看到 DrawItem 和 DrawSubItem 事件的“默认”处理程序的作用,以便我更好地理解并更轻松地调整我的代码?
作为参考,这里有一个显示我当前正在做的事情的 sn-p:
public MyListView()
{
this.OwnerDraw = true;
this.DoubleBuffered = true;
this.DrawColumnHeader += new DrawListViewColumnHeaderEventHandler(MyListView_DrawColumnHeader);
this.DrawItem += new DrawListViewItemEventHandler(MyListView_DrawItem);
this.DrawSubItem += new DrawListViewSubItemEventHandler(MyListView_DrawSubItem);
}
private void MyListView_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
{
// Not interested in changing the way columns are drawn - this works fine
e.DrawDefault = true;
}
private void MyListView_DrawItem(object sender, DrawListViewItemEventArgs e)
{
e.DrawBackground();
e.DrawFocusRectangle();
}
private void MyListView_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
string searchTerm = "Term";
int index = e.SubItem.Text.IndexOf(searchTerm);
if (index >= 0)
{
string sBefore = e.SubItem.Text.Substring(0, index);
Size bounds = new Size(e.Bounds.Width, e.Bounds.Height);
Size s1 = TextRenderer.MeasureText(e.Graphics, sBefore, this.Font, bounds);
Size s2 = TextRenderer.MeasureText(e.Graphics, searchTerm, this.Font, bounds);
Rectangle rect = new Rectangle(e.Bounds.X + s1.Width, e.Bounds.Y, s2.Width, e.Bounds.Height);
e.Graphics.FillRectangle(new SolidBrush(Color.Yellow), rect);
}
e.DrawText();
}
【问题讨论】:
-
我认为您需要添加更多关于出了什么问题的信息。我测试了你的代码,它是......好的。它用黄色框突出显示了“术语”一词。也许显示绘图结果的图像。
-
@LarsTech 我遇到了各种各样的问题,从选择效果不再可见(可以在上面的示例中看到)到项目文本被“双重渲染”并且当我将鼠标悬停在项目上。我不希望有人能够神奇地解决任何/所有这些问题(这对于帮助未来的用户来说也太具体了),而是我希望看到一个示例实现,它可以尽可能接近地呈现所有内容标准实现
-
有过这个经历吗?我正在寻找类似的方法,我将在详细查看的 ListView 中的所有列的文本中加粗搜索词。
-
@Terry 抱歉,这是很久以前的事了,现在我不记得了
标签: c# winforms listview virtualmode