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 Doublebuffered im WM_NCPAINT (https://www.delphipraxis.net/45493-doublebuffered-im-wm_ncpaint.html)

Gruber_Hans_12345 7. Mai 2005 10:19


Doublebuffered im WM_NCPAINT
 
Ich zeichne im WM_NCPAINT meinen eigenen Border samt Caption Bereich.
Ist es eigentlich sinnvoll, dafür auch Dobulebufferd (natürlich selbstgeschreiben, da ja das Standard Doublebuffered hier nicht greifen würde) zu verwenden ?
Der Rahmen hat eine Briete von 4 Pixeln und oben von 24 Pixeln, es sind chon etwas aufwendige Effekte dabei, das es sich auszahlen könnte, aber wie sollte das Bitmap dann aussehen, wie der Bereich, wo später dann mit WM_PAINT gzeiechnet wird, damit das nicht zu flackern anfängt ?

Gibt es eigentlich eine Message, die ein neues WM_NCPAINT aufruft, für ein WM_PAINT brauche ich ja nur ein Invalidate. Und ein Invalidate ignoriert ja das WM_NCPAINT.

BenBE 7. Mai 2005 13:10

Re: Doublebuffered im WM_NCPAINT
 
Die Art, wie der Bereich des NCPaint aussieht, ist in der Region des übergebenen DCs festgelegt. Frag einfach die Dimensionen dieses Canvas ab und richte dein DoubleBuffer-Bitmap entsprechend ein.

Das NCPaint kannnst Du über SendMessage realisieren. Du bist dann aber auch für die Parameter der Message verantwortlich. Nativ gibt es aber dafür keine Prozedure.

Gruber_Hans_12345 7. Mai 2005 14:01

Re: Doublebuffered im WM_NCPAINT
 
Zitat:

Zitat von BenBE
Die Art, wie der Bereich des NCPaint aussieht, ist in der Region des übergebenen DCs festgelegt. Frag einfach die Dimensionen dieses Canvas ab und richte dein DoubleBuffer-Bitmap entsprechend ein.

Das weiß ich, aber ist es klug ein Bitmap mit 1500*1100 Pixel zu erzeugen, wo eigentlich 1492*1072 Pixel nicht verwendet werden, da diese ja dann im WM_Paint vom Formular selbst gezeichnet werden.
Bzw. wird es da nicht flackern ?

Ich überlege, ob ich nicht für jeden Rand (also 4 mal ) ein eigenes Bitmap verwende ....

Mephistopheles 7. Mai 2005 16:12

Re: Doublebuffered im WM_NCPAINT
 
Nur nebenbei: du beachtest aber, daß die Dimensionen komplett systemabhängig sind?! Du mußt dazu die Dimensionen jeweils vom System ermitteln. Also mit 4px hier und Xpx da hast du vielleicht auf deinem System ein Ergebnis, aber wenn wir schonmal sowas wie XP vs. 2000 vs. 95 betrachten, dann merkt man, daß es da Unterschiede gibt.
Selbst auf einem System kann ein Benutzer theoretisch sehbehindert sein und sich deshalb für ein anderes Format und andere Färbung entschieden haben. Wenn deine Anwendung also irgendwann den Entwicklerrechner verläßt (also nicht nur ein Prototyp bleibt), solltest du all das beachtet haben.

Nachtrag: Wenn der Rand nix sonderlich extravagantes ist, sondern ein gleichmäßiges Muster, kannst du mit verschobenen Blits das ganze in einer Schleife über die Länge hinkopieren. Es wird ja nicht immer bei dieser Größe der Anwendung bleiben. Theoretisch kann der Bildschirm auch mal aus heutiger Sicht überdimensional groß sein, oder eben kleiner. Programmieren ist eben die Kunst etwas zu verallgemeinern um es danach wieder auf Spezialfälle herunterzubrechen.

BenBE 7. Mai 2005 18:26

Re: Doublebuffered im WM_NCPAINT
 
2MB haben einem heutigen System doch nicht mehr an :mrgreen:

Ne, mal im Ernst: GetSystemMetrics nutzen und auslesen und für Teilbereiche den DoubleBuffer erzeugen\Resizen nach abschluss eines Bereichs.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz