Default-Implementierung für ListView OwnerDraw

Ich habe eine ListView, wo ich wünschte zu zwicken die Zeichnung der Elemente (zum Beispiel die Hervorhebung bestimmter Zeichenfolgen in der Listenansicht itmes), aber ich will nicht zu radikal verändern die Art und Weise, dass Gegenstände angezeigt werden.

Ich habe den OwnerDraw auf true und kann meinen Kopf herum, wie zu zeichnen, meine Hervorhebung Wirkung, aber immer wenn ich versuche zu verschieben, um die default-Implementierung zu ziehen, der rest der Liste Ansicht die Dinge schief gehen und ich bin Links mit eine ganze Menge von grafischen Problemen, die angibt, dass tatsächlich habe ich komplett schief gegangen ist.

Gibt es irgendwo, dass ich sehen kann, was der "Standard" - Handler für die DrawItem - und DrawSubItem events zu tun, so dass ich besser mein Verständnis und mehr leicht zwicken meinem code?

Zur Referenz hier ein Codeausschnitt, der zeigt, was ich bin derzeit dabei:

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();
}
  • Ich denke, benötigen Sie mehr Informationen über das, was schief läuft. Getestet habe ich den code und es war...ok. Es markiert das Wort "Begriff" mit einer gelben box. Vielleicht zeigen Sie ein Bild von der Zeichnung Ergebnisse.
  • Ich bekomme ein breites Spektrum von Themen, angefangen von der Auswahl Effekt nicht mehr sichtbar ist (was gesehen werden kann in dem obigen Beispiel) zu item-text "Doppel-gerendert" und auch verschwindet, wenn ich mit der Maus über das Element. Ich bin mir nicht erwarten, dass jemand in der Lage, auf Magische Weise lösen alle diese Probleme (das wäre auch viel zu spezifisch, um zu helfen, zukünftige Nutzer), sondern ich würde gerne sehen, ein Beispiel für die Implementierung, das macht alles so eng wie möglich an die standard-Implementierung
InformationsquelleAutor Justin | 2012-01-30
Schreibe einen Kommentar