![]() |
Re: DoubleBuffered für nonVCL
:wiejetzt:
Okay, jetzt bin ich völlig verwirrt, aber irgendwie werd ich das schon schaffen. :mrgreen: Wenn ich das richtig verstanden habe bis jetzt, dann muss ich eine Bitmap machen, dann den Hintergrund (weiß) zeichnen und anschließend meine "Schläger" und meinen Ball draufpinseln und dann alles im Fenster ausgeben. Hab ich das jetzt so ungefähr richtig verstanden ?? |
Re: DoubleBuffered für nonVCL
Zitat:
|
Re: DoubleBuffered für nonVCL
Naja, dann werde ich das mal versuchen, hinzubekommen. :stupid:
Und wenn es Probleme gibt, na dann melde ich mich einfach. :mrgreen: |
Re: DoubleBuffered für nonVCL
Hier ist der Beitrag aus der Code-Lib:
![]() @Nico: Danke für das Lob (vom Meister). :mrgreen: |
Re: DoubleBuffered für nonVCL
Danke, hab den Betrag eh schon selbst gefunden. :-D
Ich hab eine Frage: Wie bekomme ich ein Bitmap-Objekt (ich lade es per LoadBitmap(HInstance, 'Ressourcename'); ) auf das hdcMem (aus dem Code-Lib-Sample Link oben) ?? Und das Bitmap-Objekt soll an eine gewisse Stelle, denn ich will die "Schläger" und den Ball an ihren Platz zeichnen und dann alles im WM_PAINT Ereignis ausgeben, dadurch sollte ja das Flackern behoben sein, oder?? [edit] Immer diese Tippfehler .... |
Re: DoubleBuffered für nonVCL
*pusch*
Vergebt mir, das ich erst 22:45 min gewartet hab. :mrgreen: |
Re: DoubleBuffered für nonVCL
So, ich habe es jetzt versucht, doch der gewünschte Effekt bleibt aus, eher ist das Flackern mehr geworden, also das es (fast) verschwunden ist.
Hier ist der Code, den ich zurZeit verwenden:
Delphi-Quellcode:
Nur leider flackert es wie oben genannt noch viel mehr. :(
var
myHDC, myPadHDC, myBallHDC: HDC; {...} function WndProc{...} var myHBMP: HBITMAP; dc: HDC; ps: TPaintStruct; rc: TRect; begin GetClientRect(hWnd, rc); {...} WM_CREATE: begin myHDC := CreateCompatibleDC(0); myHBmp := CreateCompatibleBitmap(myHDC, IDC_WINDOWWIDTH, IDC_WINDOWHEIGHT); myOldHBmp := SelectObject(myHDC, myHBmp); DeleteObject(myHBmp); myPadHDC := CreateCompatibleDC(0); myHBmp := LoadBitmap(HInstance, 'PADIMAGE'); SelectObject(myPadHDC, myHBmp); DeleteObject(myHBmp); myBallHDC := CreateCompatibleDC(0); myHBmp := LoadBitmap(HInstance, 'BALLIMAGE'); SelectObject(myBallHDC, myHBmp); DeleteObject(myHBmp); end; WM_PAINT: begin dc := BeginPaint(hWnd, ps); BitBlt(dc, 0, 0, IDC_WINDOWWIDTH, IDC_WINDOWHEIGHT, myHDC, 0, 0, SRCCOPY); BitBlt(dc, rc.Left, Pad1Top, IDC_WINDOWWIDTH, IDC_WINDOWHEIGHT, myPadHDC, 0, 0, SRCCOPY); BitBlt(dc, rc.Right - IDC_PADWIDTH - 1, Pad2Top, IDC_PADWIDTH, IDC_PADHEIGHT, myPadHDC, 0, 0, SRCCOPY); BitBlt(dc, BallLeft, BallTop, IDC_BALLWIDTH, IDC_BALLHEIGHT, myBallHDC, 0, 0, SRCCOPY); EndPaint(hWnd, ps); end; {...} Ich habe noch versucht, bei WM_ERASEBKGND das selbe hinzuzeichnen, also:
Delphi-Quellcode:
nur hat das auch nicht funktioniert. :(
WM_ERASEBKGND: begin
BitBlt(wParam, 0, 0, IDC_WINDOWWIDTH, IDC_WINDOWHEIGHT, myHDC, 0, 0, SRCCOPY); BitBlt(wParam, rc.Left, Pad1Top, IDC_WINDOWWIDTH, IDC_WINDOWHEIGHT, myPadHDC, 0, 0, SRCCOPY); BitBlt(wParam, rc.Right - IDC_PADWIDTH - 1, Pad2Top, IDC_PADWIDTH, IDC_PADHEIGHT, myPadHDC, 0, 0, SRCCOPY); BitBlt(wParam, BallLeft, BallTop, IDC_BALLWIDTH, IDC_BALLHEIGHT, myBallHDC, 0, 0, SRCCOPY); end; |
Re: DoubleBuffered für nonVCL
Du zeichnest ja auch immer noch direkt auf den Canvas des Fensters. Oder wie sieht das aus? Du zeichnest deinen Ball und deinen Schläger auf ein Bitmap im Speicher. Und in WM_PAINT kopierst du nur dieses eine Bitmap aus den Speicher mit allen Elementen drauf auf den Canvas. In WM_PAINT steht also nur ein Aufruf der BitBlt-Funktion.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:11 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