L'implémentation par défaut de ListView OwnerDraw

J'ai un ListView où je souhaite modifier le dessin des éléments (par exemple en mettant en évidence certains des chaînes dans la liste afficher les itmes), cependant je ne veux pas modifier radicalement la façon dont les éléments sont affichés.

J'ai mis le OwnerDraw de vrai et peut obtenir ma tête autour de la façon de dessiner ma mettant en évidence l'effet, cependant, chaque fois que j'essaie de reporter à l'implémentation par défaut pour tirer le reste de la vue de liste de point les choses vont mal et je me retrouve avec un tas de problèmes graphiques indiquant qu'en fait, j'ai complètement disparu de mal.

Est là, quelque part que je peux voir ce que le "par Défaut" des gestionnaires pour les DrawItem et DrawSubItem événements faire pour que je puisse améliorer ma compréhension et plus facile à modifier mon code?

Pour référence, voici un extrait montrant ce que je fais actuellement:

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();
}
Je pense que vous avez besoin d'ajouter plus d'informations à propos de ce qui ne va pas. J'ai testé ton code et il a été...ok. Il a mis en évidence le mot "Terme" avec une boîte jaune. Peut-être montrer une image du dessin résultats.
Je reçois un large éventail de questions, allant de l'effet de sélection n'est plus visible (ce qui peut être vu dans l'exemple ci-dessus) pour l'élément de texte "double rendus" et aussi en voie de disparition quand j'ai placez le pointeur de la souris sur l'élément. Je ne suis pas quelqu'un attend pour être en mesure de résoudre comme par magie tout / tous ces problèmes (qui serait aussi trop spécifiques pour aider les futurs utilisateurs), mais j'aimerais voir un exemple de mise en œuvre qui rend tout aussi près que possible de la norme de mise en œuvre

OriginalL'auteur Justin | 2012-01-30