Реализация по умолчанию для ListView OwnerDraw

У меня есть 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();
}

9
задан Justin 30 January 2012 в 15:36
поделиться