Delphi-PRAXiS
Seite 1 von 2  1 2      

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 in API (https://www.delphipraxis.net/31990-doublebuffered-api.html)

Dax 16. Okt 2004 18:22


DoubleBuffered in API
 
Wie genau setzte ich TWinControl.DoubleBuffered mit API-Funktionen um? Ich probiere hier schon seit Stunden, aber Windows wehrt sich noch immer erfolgreich gegen meine Versuche.

Hat jemand einen fertigen Code dazu?

FAlter 16. Okt 2004 20:00

Re: DoubleBuffered in API
 
Zeichne es in eine Bitmap (geht auch mit API :thumb: ) und dann die Bitmap auf den Bildschirm.

Nonsense 16. Okt 2004 20:06

Re: DoubleBuffered in API
 
Zitat:

Zitat von FAlter
Zeichne es in eine Bitmap (geht auch mit API :thumb: ) und dann die Bitmap auf den Bildschirm.

Ganz so einfach ist es nicht. Er braucht erst eine DC, d.h. es muss mit CreateCompatibleDC eine von PS.hDC (PS: TPAINTSTRUCT) kopiert werden. Das Bitmap, was im Endeffekt auf dem Bildschirm landen soll, kommt erst auf die hDCBuffer und dann auf die hDC.

Du musst also nach CreateCompatibleDC, CreateCompatibleBitmap und BitBlt suchen.

FAlter 16. Okt 2004 20:12

Re: DoubleBuffered in API
 
Wieso? Er muss nur das machen, was sonst TBitmap und TCanvas übernehmen. Dass das komplizierter ist, ist klar. Aber die gleiche Vorgehensweise und sorgar schneller. Und die Suchbegriffe hätte er wohl auch selbst herausgefunden, nachdem er die Vorgehensweise weiß. (Dazu ist die Win32.hlp praktisch, zum Suchbegriffe finden.)

PS: Außerdem ein zu häufiges Zeichnen des gleichen vermeiden. Die Erst-in-Bitmap-zeichnen-Methode hilft nämlich nicht, wenn man etwas bei jedem Maus-Über-Control-Bewegen neuzeichnet.

FAlter 16. Okt 2004 20:18

Re: DoubleBuffered in API
 
Kuck mal hier:

http://www.delphi-forum.de/topic_Wie...ichnen_74.html

ein fertiger code

Delphi-Quellcode:
var
    dc,dctmp:HDC;
    bitmap:HBITMAP;
begin
     dc:=GetDC(windowhandle);
     bitmap:=CreateCompatibleBitmap(dc,windowwidth,windowheight);
     dctmp:=CreateCompatibleDC(dc);
     SelectObject(dctmp,bitmap);
     //-->Alles ZEICHNEN
     zeichnen(dctmp);
     //<--Alles ZEICHNEN
     bitblt(dc,0,0,windowwidth,windowheight,dctmp,0,0,srccopy);
     DeleteDC(dctmp);
     DeleteObject(bitmap);
     ReleaseDC(windowhandle,dc);
end;
Und anstelle die Prozedur Zeichnen aufzurufen, einfach auf deine dctmp Zeichnen.

Luckie 17. Okt 2004 12:13

Re: DoubleBuffered in API
 
In der Code-Lib sollte es von mir dazu auch einen Beitrag geben.

Dax 18. Okt 2004 09:07

Re: DoubleBuffered in API
 
Danke für die Antworten, aber diesen Code hatte ich schon. Leider funktioniert er mit den ClockUtils nicht richtig...

mirage228 18. Okt 2004 09:13

Re: DoubleBuffered in API
 
Hi,

verwende doch den Code der VCL aus TWinControl.WMPAINT bzw. TWinControl.WMEraseBkgnd
Das müsste eigentlich auch mit anderen Controls gehen, da dort nur API-Aufrufe getätigt werden.

mfG
mirage228

Dax 18. Okt 2004 09:18

Re: DoubleBuffered in API
 
Ich lehne die Benutzung der VCL in den ClockUtils vehement ab, weil es einfach zu viel ist. Wenn jemand ein kleines Programm rausbringen will, das einfach die Uhr überschreibt, sind ihm um die 500 KB wohl zu viel aufwand...

mirage228 18. Okt 2004 09:19

Re: DoubleBuffered in API
 
Du sollst ja nicht die VCL selbst benutzen. Aber eventuell findest Du in der Borland Implementierung von DoubleBuffered (im Quelltext) ja ein paar Ansätze bzw. ganze API-Codestücke, die Du verwenden könntest.

mfG
mirage228


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:55 Uhr.
Seite 1 von 2  1 2      

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