Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Invalidate in ListView (https://www.delphipraxis.net/191876-invalidate-listview.html)

EWeiss 27. Feb 2017 08:38

Invalidate in ListView
 
Im Explorer (ListView) zumindest unter Win7 wird beim drüberfahren der Items mit der Maus ein Rahmen um diese Items gezeichnet.
Das mache ich bei mir in meiner Ownerdraw ListView genauso.

Das Problem dabei ist nur das ich dann nach jedem move auf ein anderes Item das ListView Invalidieren muss damit das zuletzt gezeichnete gelöscht wird.

Wie könnte ich das umgehen so wie im Explorer das ich nicht jedes Mal ein Invalidate aufrufen muss?
Geht schwer auf die CPU und setzt meine Frames dementsprechend runter. (Im Explorer merkt man nichts davon)

Die meisten ListViews Ownerdrawn zeichnen keinen Rahmen um die Items ich glaube genau wegen diesen Problem nur für das ausgewählte selektierte Item.

Irgend jemand eine Lösung dafür?
Wenn nicht werde ich wohl oder übel das zeichnen des Rahmen entfernen müssen.

gruss

Luckie 27. Feb 2017 17:22

AW: Invalidate in ListView
 
InvalidateRect vielleicht?

EWeiss 27. Feb 2017 17:52

AW: Invalidate in ListView
 
Zitat:

Zitat von Luckie (Beitrag 1362810)
InvalidateRect vielleicht?

Wenn ich wüsste wann die Maus den Rect des aktuellen Items verlässt.
Dann haben die Items keine eigenen Handles so das ich mit InvalidateRect diese Invalidaten könnte.
Es wird immer das Handle des ListView verwendet.

Es gibt ja die Message CDDS_ITEMPREPAINT die dann CDRF_NOTIFYSUBITEMDRAW zurück gibt

Ich glaube aber das ich diese nur in der Anwendung selbst auswerten kann.
Deshalb nutzt das auch nicht viel weil ich in der DLL selbst den Rahmen zeichnen will.

Zudem verwende ich die schon aber für die gesamte ListView.
Delphi-Quellcode:
SkinEngine.FInvalidateRect(WinHandle, False);

Delphi-Quellcode:
procedure TSkinEngine.FInvalidateRect(WinHandle: HWND; Flag: Boolean);
var
  rc: TRect;
  //hbr: HBRUSH;

begin
  GetClientRect(WinHandle, rc);

  //hbr := CreateSolidBrush(clred);
  //FillRect(GetDC(WinHandle),rc , hbr);

  InvalidateRect(WinHandle, @rc, Flag);
  UpdateWindow(WinHandle);

end;
Die Kommentierten zeilen sind zum Testen und werden eingeschaltet damit ich sehen kann ob der Rect Korrekt gesetzt ist.
Logischer weise natürlich anstelle von InvalidateRect.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 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