AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Style = lbOwnerDrawFixed --> WM_Paint ohne Ende ...
Thema durchsuchen
Ansicht
Themen-Optionen

Style = lbOwnerDrawFixed --> WM_Paint ohne Ende ...

Offene Frage von "berens"
Ein Thema von berens · begonnen am 18. Mai 2010
Antwort Antwort
berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#1

Style = lbOwnerDrawFixed --> WM_Paint ohne Ende ...

  Alt 18. Mai 2010, 23:55
Hallo Mal wieder, zu später Stunde wird man von Delphi/Windows wieder in den Wahnsinn getrieben.

Man nehme zwei TListBox und fülle Sie mit einigen Einträgen, die Schriftgröße (zum Besseren nachvollziehen) auf 36.

Beide nebeneinander so ca. 400 * 600 Pixel jeweils.

Bei der zweiten TListBox Style := lbOwnerDrawFixed (und bei OnDrawItem soetwas wie) <-- kann auch leer sein

Delphi-Quellcode:
procedure TTerminListBox.TerminListBoxDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  re: TRect;
begin
  if Index < 0 then exit;
  if Index >= Count then Exit;

  with (Control as TListBox).Canvas do begin
      re := Rect;

      FillRect(re);
      re.Left := re.Left + 5;
      re.Top := re.Top + 5;
      re.Bottom := re.Bottom - 5;
      re.Right := re.Right - 5;

      if pos('OK', (Control as TListBox).Items[Index]) > 0 then begin
        Brush.Color := clLime;
        brush.Style := bsFDiagonal;
        FillRect(re);
      end else if pos('Fehler', (Control as TListBox).Items[Index]) > 0 then begin
        Brush.Color := clRed;
        Brush.Style := bsVertical;
        FillRect(re);
      end else begin
        Brush.Color := clBtnFace;
        FillRect(re);
        Rectangle(re.Left, re.Top, re.Right, re.Bottom);
      end;

      Brush.Style := bsClear;
      Font.Color := clBlack;
      TextOut(re.Left + 3, Re.Top + 0, (Control as TListBox).Items[Index]);
  end;
Programm starten, schauen ob die zweite Box auch wirklich OwnerDraw benutzt, dann bei jeweils beiden TListBoxen die linke Maustaste gedrückt halten und die Maus mal Hoch und Runter bewegen. Die Selektion folgt nun dem Cursor. Soweit OK.

Sobald man allerdings mit der Maus über die Oberkante der TListBox kommt, flimmert und flackert bei der OwnerDraw-ListBox der erste Eintrag wie verrückt. Bei der "Normalen" kein Problem.

Woran liegt das?

Es wird dauernd die WindowsMessage WM_Paint / CN_DRAWITEM aufgerufen die dann entsprechend auch OnDrawItem aufruft. Wieso Windows mir dauernd WM_Paint / CN_DRAWITEM sendet konnte ich auch nach mehreren Stunden untersuchen der Vorfahren von TListBox nicht herausfinden.

Kann mir jemand einen Tip dazu geben?

Wenn jemand die Lösung hat, bitte vielleicht auch noch einen Tip, wie man als Normalsterblicher die Ursache dafür rausfindet ("Wie kann ich den Fehler eingrenzen?").

Danke soweit.


Windows XP mit Delphi 2010. Falls der o.g. Effekt bei Euch nicht auftritt, bitte hier posten.
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:40 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