アイテムの描画を微調整したいListViewがあります (たとえば、リスト ビューのアイテムで特定の文字列を強調表示する) が、アイテムの表示方法を根本的に変更したくありません。
OwnerDrawを true に設定し、ハイライト効果を描画する方法について頭を悩ませることができますが、デフォルトの実装を延期して残りのリスト ビュー アイテムを描画しようとすると、問題が発生し、全体が残ってしまいます。実際に私が完全に間違っていることを示すグラフィカルな問題の負荷。
DrawItem
とイベントの「デフォルト」ハンドラーが何をするかを確認できる場所はありDrawSubItem
ますか?
参考までに、私が現在行っていることを示すスニペットを次に示します。
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();
}