Delphi-PRAXiS
Seite 2 von 2     12   

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 für nonVCL (https://www.delphipraxis.net/40330-doublebuffered-fuer-nonvcl.html)

idontwantaname 14. Feb 2005 19:41

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 ??

NicoDE 14. Feb 2005 19:44

Re: DoubleBuffered für nonVCL
 
Zitat:

Zitat von idontwantaname
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 ??

Genau das war gemeint :)

idontwantaname 14. Feb 2005 20:03

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:

Luckie 15. Feb 2005 14:57

Re: DoubleBuffered für nonVCL
 
Hier ist der Beitrag aus der Code-Lib: http://www.delphipraxis.net/internal...=120079#120079

@Nico: Danke für das Lob (vom Meister). :mrgreen:

idontwantaname 15. Feb 2005 15:09

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 ....

idontwantaname 16. Feb 2005 13:23

Re: DoubleBuffered für nonVCL
 
*pusch*

Vergebt mir, das ich erst 22:45 min gewartet hab. :mrgreen:

idontwantaname 16. Feb 2005 18:28

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:
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;
{...}
Nur leider flackert es wie oben genannt noch viel mehr. :(
Ich habe noch versucht, bei WM_ERASEBKGND das selbe hinzuzeichnen, also:
Delphi-Quellcode:
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;
nur hat das auch nicht funktioniert. :(

Luckie 17. Feb 2005 12:50

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 11:16 Uhr.
Seite 2 von 2     12   

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