![]() |
Ewige Wiederholung von Paint
Hallo,
wodurch kann es kommen, das eine Paintfunktion einer Komponente unentwegt aufgerufen wird, ohne dass die Komponennte veränder, bewegt oder überdeckt wird. Normaler weise sollte die Paint funktion doch nur bei Veränderungen aufgerufen werden. |
Was meinst du mit PaintFunktion? Die gibt es in dem Sinne nicht. Ein Fenster bekommt von Windows ein WM_PAINT geschickt, wenn es neu gezeichnet werden muß. Dies entspricht dem OnPaint-Ereignis einer VCL-Komponente. An dieser Stelle werden dann alle nötigen "Paint-Maßnahmen" durchgeführt. Greift man an dieser Stelle nicht ein übernimmt Windows alles, weil dann die Nachricht an die Standardfensterprozedur weitergereicht wird.
Noch mal zu WM_PAINT:
Delphi-Quellcode:
Wichtig ist hier das EndPaint. Denn dies sagt Windows, dass alle nötigen Paint-Aktionen durchgeführt wurden und das Fenster wieder aktuell ist. Läßt man das EndPaint weg, bekommt Windows keine Bestätigung, dass alle Paint-Aktionen durchgeführt wurden und denkt, das Fenster wäre noch ungültig, so dass es die nächste WM_PAINT-Nachricht schickt. Und dann geht alles von vorne los. Es kann also passieren, dass dein Fenster von Windows mit WM_PAINT-Nachrichten zu geballert wird und nur damit beschäftigt ist seinen Fensterinhalt neu zu zeichnen und zu gar nichts anderem mehr kommt.
WM_PAINT:
begin dc := BeginPaint(ps); { Punkt, Punkt, Komma, Strich, fertig ist das Mondgesicht } EndPaint(ps); end; Mehr dazu und ein Beispiel gibt es hier: ![]() |
Die VCL erledigt das Vor und Nach dem OnPaint Ereignis automatisch.
Delphi-Quellcode:
[edit=Daniel B]Delphi-Tags eingefügt. MfG Daniel B.[/edit]
WM_PAINT:
begin Canvas.Handle := BeginPaint(ps); Paint; // -> OnPaint aufrufen EndPaint(dc); end; |
Zitat:
|
Panel
Grob gesagt, ich habe eine neue Klasse auf der Basis von TPanel erstellt und folgendes getan
Delphi-Quellcode:
Tja???
type
TBox = class(TPanel) ... public procedure paint; override; ... end procedure TBox.Paint; begin ... end [Edit=Sakura]DELPHI-Tags eingefügt[/Edit] |
Grob gesagt, poste mal den Inhalt der Paint-Methode und(!) nutze die [delphi]-Tags.
...:cat:... |
Delphi-Quellcode:
type
TBox = class(TPanel) private { Private-Deklarationen } protected { Protected-Deklarationen } AusgabeBereich : TImage; public { Public-Deklarationen } procedure paint; override; constructor create(AOwner: TComponent); override; destructor destroy; override; published { Published-Deklarationen } end; ... Procedure TBox.Paint; var Bitmap : TBitmap; begin Bitmap := AusgabeBereich.Picture.Bitmap; Bitmap.Width := AusgabeBereich.Width; Bitmap.Height := AusgabeBereich.Height; Bitmap.Canvas.Brush.style := bsSolid; Bitmap.Canvas.Brush.color := clWhite; Bitmap.Canvas.Rectangle(0,0,Bitmap.Width,Bitmap.Height); end; |
Also ich würde da jetzt sagen, dass da BeginPaint und EndPaint fehlt.
|
Hmm?
gut habe jetzt
Delphi-Quellcode:
eingefügt. Funktioniert trozdem nicht. :cry:
TPS : TPaintStruct;
begin beginPaint(handle,TPS); .... endPaint(handle,TPS); end |
Eine Variable vom Typ TPaintStruct.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:48 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