AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) TListBox (WM_ERASEBKGND <- berechnen der freien Bereiche?)

TListBox (WM_ERASEBKGND <- berechnen der freien Bereiche?)

Ein Thema von MicMic · begonnen am 21. Aug 2018
Antwort Antwort
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

TListBox (WM_ERASEBKGND <- berechnen der freien Bereiche?)

  Alt 21. Aug 2018, 19:56
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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz