Hallo,
ich möchte meine TListBox etwas beschleunigen.
Da ich in DrawItem selbst die ListBox fülle, möchte ich "WM_ERASEBKGND" einsetzen. Dort übergebe ich "Msg.Result := 1;". So wird nix gelöscht und in DrawItem einfach drübergezeichnet. In DrawItem kommt FillRect zum Einsatz, danach Textausgaben. Also das geht alles aber es gibt auch den freien Bereich, je nach ListBox Höhe. Zum Beispiel unten, wenn eine Zeile nicht mehr in der Höhe reinpasst. Dieses kann man leicht berechnen und in WM_ERASEBKGND einsetzen.
Code:
Var I : Integer;
TR : TRect;
Begin
I := Floor(ListBox.ClientHeight / ListBox.ItemHeight);
TR.Left := 0;
TR.Top := (ItemHeight*I);
TR.Right := ClientWidth;
TR.Bottom := TR.Top + (ClientHeight - TR.Top);
canvas.Brush.Color := clRed;
Canvas.FillRect(TR);
End;
So wird der freie untere Bereich (wo durch DrawItem nichts gezeichnet wird) beispielsweise in Rot gefüllt. Schwieriger wird es mit dem Rest am rechten Rand. Zum Beispiel wenn Item.Count von der ListBox auf 25 steht, es 10 Zeilen in der Höhe reinpassen und 3 Columns eingestellt sind. In der letzten Spalte sind ja nur 5 Zeilen durch DrawItem gefüllt und 5 sind ohne Inhalt. Diese 5 freien Zeilen werden dann ebenfalls von DrawItem nicht erfasst und in WM_ERASEBKGND muss dieser Bereich ebenfalls mit FillRect gezeichnet werden.
Das lässt sich auch noch berechnen (Code lasse ich mal weg; noch nicht fertig) aber es gibt nun auch noch einen anderen Fall bei mir.
Um obige Werte zu nehmen:
Item.Count = 25
Anzahl Zeilen = 10
Aber Columns steht nicht auf 3, sondern auf 4 oder 5.
Also es gibt einen 5 Zeilen Rest in Spalte 3 aber in Spalte 4 dann nochmal 10 leere und evtl. in Spalte 5 auch noch mal 10 leere.
Ich bin fast fertig mit dem Code wenn es diesen Rest von 5 (als Beispiel) in Spalte 3 gibt. In WM_ERASEBKGND zeichne ich dann auch mit FillRect diesen freien Bereich mit Rot. Aber noch habe ich nicht den Fall mit Columns=4 oder 5,6,7... berechnet. Frage mich gerade, ob das nicht alles etwas einfacher geht, durch die
API. Also den freien Bereich der ja nicht in DrawItem gezeichnet wird, durch die
API zu ermitteln?
Michael