![]() |
DoubleBuffered für nonVCL
Huhu :hi:
Ich programmiere gerade mein ![]() Es funktiniert auch schon recht gut, nur flackern die "Schläger" und der Ball ziemlich und das will ich nicht. :stupid: Bei VCL Programmen gibt es ja die Eigenschaft DoubleBuffered, gibt es sowas auch für nonVCL, bzw. wie könnte man soetwas realisieren ?? |
Re: DoubleBuffered für nonVCL
Hi, vielleicht hilft dir
![]() |
Re: DoubleBuffered für nonVCL
Liste der Anhänge anzeigen (Anzahl: 1)
Leider nicht sehr viel. :(
//edit: Ich hab ja auch nur eine Personal-Version Ihr könnt euch ja mal anschauen, was ich bis jetzt zustande gebracht habe. :-D Die Steuerung: linker Spieler: A und Y rechter Spieler: K und M neue Runde: Leertaste |
Re: DoubleBuffered für nonVCL
Zitat:
|
Re: DoubleBuffered für nonVCL
Aus
![]() Zitat:
|
Re: DoubleBuffered für nonVCL
Also, dort geht es doch um einen bestimmten Fall, wo folgendes nicht funktioniert:
Delphi-Quellcode:
Funktioniert das denn bei DIR???
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; |
Re: DoubleBuffered für nonVCL
Nein, weil ich das nicht brauche, denke ich zumindestens.
Ich habe mich nur auf das Zitat bezogen, da ich den Quellcode für DoubleBuffered aus TWinControl nicht habe. Dort könnte man sicher nachschauen, wie DoubleBuffered dort gelöst wurde und somit auch mein Problem. |
Re: DoubleBuffered für nonVCL
Zitat:
Bei Luckie liegt nch ein altes aber reichlich kommentiertes Projekt rum: ![]() |
Re: DoubleBuffered für nonVCL
Wenn du mit Speicherkontext ein Bitmap im Speicher meinst, dann sit das identisch meit meinem Code aus der Code-Lib und den Vorschlägen, die hier schon gemacht wurden.
|
Re: DoubleBuffered für nonVCL
Zitat:
|
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 13:30 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