Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Screen-Canvas nur über form refreshen (https://www.delphipraxis.net/95131-screen-canvas-nur-ueber-form-refreshen.html)

_frank_ 1. Jul 2007 20:03


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:
var r:Trect;
begin
  if cfg.DrawAlignGrid then
  begin
    r:=Rect(left,top,left+width,top+height);
    invalidateRect(0,@r,true);
  end;
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?

Gruß Frank

bitsetter 1. Jul 2007 20:33

Re: Screen-Canvas nur über form refreshen
 
Hi,

und wenn du nur das Formular neuzeichnest, geht es dann?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Rect: TRect;
begin
  Rect:= self.ClientRect;
  invalidateRect(Form1.Handle, @Rect,true);
end;
EDIT:
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;

_frank_ 1. Jul 2007 20:41

Re: Screen-Canvas nur über form refreshen
 
nicht ganz, es wird nur das form selbst refresht, aber die darauf befindlichen TWinControls nicht

Gruß Frank

bitsetter 1. Jul 2007 20:43

Re: Screen-Canvas nur über form refreshen
 
Ich habe weiter oben gerade noch Code hinzugefügt(roter Kasten).

_frank_ 1. Jul 2007 20:52

Re: Screen-Canvas nur über form refreshen
 
danke bitsetter.
wenn man das ganze noch rekursiv baut funktioniert es auch super:

Delphi-Quellcode:
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;
Gruß Frank

Hawkeye219 1. Jul 2007 21:15

Re: Screen-Canvas nur über form refreshen
 
Hallo Frank,

hier ist noch eine Möglichkeit:

Delphi-Quellcode:
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;
Gruß Hawkeye

_frank_ 1. Jul 2007 21:29

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 12:28 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