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 Refresh auf Teilbereich eingrenzen? (https://www.delphipraxis.net/75587-refresh-auf-teilbereich-eingrenzen.html)

PeterPanino 21. Aug 2006 23:45


Refresh auf Teilbereich eingrenzen?
 
Hallo,

ich habe ein größeres Panel (TBRSFramePanel), auf dem sich mehrere Steuerelemente befinden. Um eines der Steuerelemente wird ein Rahmen gezeichnet und das Panel dann mit Refresh neu gezeichnet. Das führt aber zu einem unerwünschten Flackern aller Steuerelemente, die sich auf dem Panel befinden.

Wie kann man nun das Refresh auf einen bestimmten Teilbereich des panels eingrenzen, sodass nicht das gesammte Panel "refreshed" wird sondern nur der gewünschte Bereich (das Steuerelement mit dem Rahmen).

Ich habe jetzt mehrere Stundne lang eine Lösung gesucht, aber nichts Funktionierendes gefunden.
Vielen Dank im Voraus!

Muetze1 21. Aug 2006 23:55

Re: Refresh auf Teilbereich eingrenzen?
 
Von der WinAPI her geht dies mit dem InvalidateRect() Befehl, wo du den Bereich angeben kannst. Ansonsten ist die Frage wie das Panel den Clipping Bereich des Canvas zu nutzen weiss. Nach dem InvalidateRect() sollte das schon alles reichen, du kannst aber sonst nocht mit einem anschliessendem UpdateWindow() ein sofortiges neuzeichnen erzwingen...

PeterPanino 22. Aug 2006 00:04

Re: Refresh auf Teilbereich eingrenzen?
 
InvalidateRgn habe ich schon probiert, scheint aber nicht zu funktionieren:
Delphi-Quellcode:
BRSFramePanel.DoubleBuffered := True;
ARect := AControl.BoundsRect;
InflateRect(ARect, 2, 2);
MyRgn := CreateRectRgn(Arect.Left, Arect.Top, Arect.Right, Arect.Bottom);
InvalidateRgn(BRSFramePanel.Canvas.Handle, MyRgn, False);

//Rahmen zeichnen

//Dann verschiedene Methoden probiert:
  //BRSFramePanel.Repaint;
  //SendMessage(BRSFramePanel.Canvas.Handle, WM_PAINT, 0, 0);
  //BRSFramePanel.Update;
  //PostMessage(BRSFramePanel.Canvas.Handle, WM_PAINT, 0, 0);
  //BRSFramePanel.Repaint;
  //PaintRgn(BRSFramePanel.Canvas.Handle, MyRgn);

//Aber nichts funktioniert!

DeleteObject(MyRgn);

Muetze1 22. Aug 2006 00:27

Re: Refresh auf Teilbereich eingrenzen?
 
1. Ich hatte von InvalidateRect() und InvalidateRgn() gesprochen. Macht aber soweit keinen Unterschied.
2. Wenn du ihm das komplette Rechteck übergibst, dann malt er sich komplett neu und wenn sich das Panel neu gezeichnet hat, stösst er danach die auf ihm liegenden Elemente an. Also entweder beschränkt du das neuzeichnen auf einen bestimmten Bereich (der der sich wirklich geändert hat) oder du hast keine Chance eine Verbesserung zu erzielen.


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