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

idontwantaname 14. Feb 2005 13:21


DoubleBuffered für nonVCL
 
Huhu :hi:

Ich programmiere gerade mein Tennis-Spiel neu nur mit nonVCL, da mir die EXE für ein so winziges Programm zu groß ist. :mrgreen:
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 ??

Stevie 14. Feb 2005 13:31

Re: DoubleBuffered für nonVCL
 
Hi, vielleicht hilft dir dieser Beitrag...

idontwantaname 14. Feb 2005 13:48

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

jim_raynor 14. Feb 2005 13:53

Re: DoubleBuffered für nonVCL
 
Zitat:

Zitat von idontwantaname
Leider nicht sehr viel. :(
//edit: Ich hab ja auch nur eine Personal-Version

Was hat dass den mit der Personal Version zu tuen?

idontwantaname 14. Feb 2005 14:28

Re: DoubleBuffered für nonVCL
 
Aus diesem Beitrag (wurde weiter oben genannt):
Zitat:

Zitat von mirage228
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

Nur leider liegen keine Quellcodes bei den Personal-Versionen bei. :(

Stevie 14. Feb 2005 14:40

Re: DoubleBuffered für nonVCL
 
Also, dort geht es doch um einen bestimmten Fall, wo folgendes nicht funktioniert:
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;
Funktioniert das denn bei DIR???

idontwantaname 14. Feb 2005 14:56

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.

NicoDE 14. Feb 2005 15:21

Re: DoubleBuffered für nonVCL
 
Zitat:

Zitat von idontwantaname
Dort könnte man sicher nachschauen, wie DoubleBuffered dort gelöst wurde und somit auch mein Problem.

Indem man zuerst in einen (Speicher)Kontext schreibt und diesen am Ende komplett zeichnet.
Bei Luckie liegt nch ein altes aber reichlich kommentiertes Projekt rum: DelphUBBsrc.

Luckie 14. Feb 2005 17:07

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.

NicoDE 14. Feb 2005 19:33

Re: DoubleBuffered für nonVCL
 
Zitat:

Zitat von Luckie
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.

Schönere/verständlichere Formulierung als die meinige - eben das meinte ich :)

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 06:31 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