![]() |
Screen-Canvas nur über form refreshen
Hallo,
ich versuche folgendes zu realisieren: ich möchte auf meinem Formular ein Grid malen (Hilflinien zur orientierung), aber über alle Controls hinweg. Somit nützt mir TForm.Canvas nicht wirklich etwas. Also male ich direkt auf dem Screen-Canvas (getDC(0)), funktioniert problemlos. Um dies zu löschen verwende ich aktuelle diesen code:
Delphi-Quellcode:
dies funktioniert zwar, hat aber den unschönen nebeneffekt, dass um das fenster herum (also der komplette desktop) alles kurz flackert, obwohl ich explizit das rect des forms angebe. Warum ist das so bzw. wie könnte man das lösen?
var r:Trect;
begin if cfg.DrawAlignGrid then begin r:=Rect(left,top,left+width,top+height); invalidateRect(0,@r,true); end; Gruß Frank |
Re: Screen-Canvas nur über form refreshen
Hi,
und wenn du nur das Formular neuzeichnest, geht es dann?
Delphi-Quellcode:
EDIT:
procedure TForm1.Button1Click(Sender: TObject);
var Rect: TRect; begin Rect:= self.ClientRect; invalidateRect(Form1.Handle, @Rect,true); end;
Delphi-Quellcode:
var
loop : integer; begin //With Form1 do for loop:= 0 to Pred(ControlCount) do if Components[loop] is TWinControl then TWinControl(Components[loop]).Invalidate; Invalidate; |
Re: Screen-Canvas nur über form refreshen
nicht ganz, es wird nur das form selbst refresht, aber die darauf befindlichen TWinControls nicht
Gruß Frank |
Re: Screen-Canvas nur über form refreshen
Ich habe weiter oben gerade noch Code hinzugefügt(roter Kasten).
|
Re: Screen-Canvas nur über form refreshen
danke bitsetter.
wenn man das ganze noch rekursiv baut funktioniert es auch super:
Delphi-Quellcode:
Gruß Frank
procedure InvalidateControl(control:TWincontrol);
var i:integer; begin control.Invalidate; for i:=0 to control.ControlCount-1 do if (control.Controls[i] is TWinControl) then InvalidateControl(control.Controls[i] as TWinControl); end; procedure TForm_DFMPreview.SizeCtrl1EndSizeMove(Sender: TObject; State: TSCState); var r:Trect; begin if cfg.DrawAlignGrid then begin invalidateControl(self); end; end; |
Re: Screen-Canvas nur über form refreshen
Hallo Frank,
hier ist noch eine Möglichkeit:
Delphi-Quellcode:
Gruß Hawkeye
procedure InvalidateControl (aControl: TWinControl);
const FLAGS = RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_UPDATENOW or RDW_ALLCHILDREN; begin RedrawWindow(aControl.Handle, nil, 0, FLAGS); end; |
Re: Screen-Canvas nur über form refreshen
danke hawkeye,
die Lösung ist natürlich das i-tüpfelchen ;) (spar ich mir die separate procedure inkl. rekursion). Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:31 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 by Thomas Breitkreuz