![]() |
AW: ListView-Eintrag wird bei Windows 7 schwarz
So, noch mal ein kleiner push ...
Vielleicht hat ja heute jemand einen Geistesblitz?! :-D Denn der Fehler ist doof und alles selber Zeichnen ist auch net schön ... |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Hallo,
versuch doch mal bitte folgendes:
Delphi-Quellcode:
Funktioniert bei mir. Aber eben nur unter D2007 und Vista ohne Groups.
procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean); var lv: TListView; ACanvas: TCanvas; begin if (Sender is TListView) and (Stage = cdPostPaint) then begin lv := Sender as TListView; ACanvas := TCanvas.Create; ACanvas.Handle := GetWindowDC(Item.Handle); try Button1.PaintTo(ACanvas, lv.Columns[0].Width, Item.DisplayRect(drBounds).Top); finally ReleaseDC(Item.Handle, ACanvas.Handle); ACanvas.Free; end; end; end; Greez, Chris |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Wenn man einen TControlCanvas nimmt klappt es wunderbar (sonst gibt es Grafikfehler etc.). DoubleBuffered kann man dann zwar nicht mehr benutzen aber das ist erst mal egal.
Danke :thumb: |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Hallo,
ich hole diesen Thread nochmal hoch. Ich habe ganz konkret dieses Problem (also von diesem Thread) und brauch aber DoubleBuffered. Das Problem ist: Reagiert man auf OnAdvancedDrawItem und OnAdvancedDrawSubItem (OwnerDraw = FALSE) um quasi noch etwas zu ergänzen, dann bekommt man diesen Schwarz-Effekt, sobald man auf die Canvas von Listview zeichnet. Zeichnet man auf eine ACanvas deren Handle man per GetWindowDC holt, wird die Zeichenaktion nicht / selten sichtbar.:shock: Es muss irgendetwas mit dem DoubleBuffered-Mechanismus zu tun haben - aber da steig ich irgendwie nicht durch :-( Kennt jemand eine Lösung? Gruß, Chris P.S.: System Win 7 / Applikation mit Themes |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Wenn ich jetzt sage, daß ich das Problem auch schon hatte, aber irgendwie gelöst habe, ohne mich daran erinnern zu können, hilft das auch nicht weiter, oder? :shock:
Also habe ich nochmal gesucht und den von mir gefundenen Workaround im ![]() Auch wenn der Schwarz-Effekt dort nicht explizit steht, mit SetBkMode plus Font-Anpassung waren bei mir beide Probleme verschwunden. |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Hallo,
danke, das hat geklappt. :thumb: Gruß, Chris |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Nebenbei gibt es von mir auch mal was neues.
Ich habe bei mir das Problem erneut aufgegriffen, um ebenfalls DoubleBuffered wieder nutzen zu können. Irgendwie erscheint mir die Lösung extrem banal. In den ganzen Posts haben wir nur versucht, den Brush-Style der ListView selbst zu ändern, aber nicht den von ihrem Canvas.
Delphi-Quellcode:
Sender.Canvas.Brush.Style := bsClear;
Dieser kleine Code - vor allen anderen Zeichenaktionen ausgeführt - hat mein Problem behoben :thumb: DoubleBuffered ist ebenfalls wie gewohnt nutzbar. |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Hallo,
ich habe bei einer Software das gleiche Problem. Den Vorschlag mit
Delphi-Quellcode:
hab ich ausprobiert, nur leider ohne Erfolg.
Sender.Canvas.Brush.Style := bsClear;
Das dumme ist, dass das Problem auf meinem Win8-Rechner nicht mehr auftaucht - nur auf meinem (neuen) Win7-Rechner in der Firma (und kann es somit nicht testen) Hab ich das
Delphi-Quellcode:
an der falschen Stelle drin oder generell einen
Sender.Canvas.Brush.Style := bsClear;
Fehler diesbezüglich? Bei XP hat es bislang ohne dieser Zeile funktioniert (danach anscheinend auch wieder)
Delphi-Quellcode:
procedure TMainForm.ListView_DateienCustomDrawSubItem(Sender: TCustomListView;
Item: TListItem; SubItem: Integer; State: TCustomDrawState; var DefaultDraw: Boolean); var S_Text : String; Diff_Top : Integer; Rect : TRect; Textfarbe : TColor; begin //Rect der Zelle erhalten ListView_GetSubItemRect(Sender.Handle, Item.Index, SubItem, LVIR_BOUNDS, @Rect); Sender.Canvas.Brush.Style := bsClear; //Hintergrundfarbe Sender.Canvas.Brush.Color := clWindow; //Farbe? If ListViewTextFarbe(Textfarbe, S_Text, Item.SubItems[SubItem - 1]) then begin //Schriftfarbe Sender.Canvas.Font.Color := Textfarbe; //Hintergrundfarbe und Textfarbe setzen, wenn die Zeile markiert ist If Item.Selected then begin Sender.Canvas.Font.Color := clHighlightText; Sender.Canvas.Brush.Color := clHighlight; end; //Differenz für Top berechnen, um Text mittig darzustellen Diff_Top := (Rect.Height - Sender.Canvas.TextHeight(S_Text)) div 2; //Text ausgeben Sender.Canvas.TextRect(Rect, Rect.Left + 5, Rect.Top + Diff_Top, S_Text); DefaultDraw := False; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz