AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Invalidate in ListView

Ein Thema von EWeiss · begonnen am 27. Feb 2017 · letzter Beitrag vom 27. Feb 2017
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

Invalidate in ListView

  Alt 27. Feb 2017, 09:38
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

Geändert von EWeiss (27. Feb 2017 um 09:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Invalidate in ListView

  Alt 27. Feb 2017, 18:22
InvalidateRect vielleicht?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Invalidate in ListView

  Alt 27. Feb 2017, 18:52
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.
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

Geändert von EWeiss (27. Feb 2017 um 18:59 Uhr)
  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 23:58 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