Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi bitblt() + Windows XP Problem (https://www.delphipraxis.net/1705-bitblt-windows-xp-problem.html)

arnoldo 18. Dez 2002 18:18


bitblt() + Windows XP Problem
 
Hallo miteinander,

ich habe ein Spiel programmiert in dem u.a. Schnee nach unten rieselt.
Die von mir verwendeten Schneeflocken-Bitmaps muessen tatuerlich teilweise transparent sein (wegen der Form) und damit das ganze recht flott vonstatten geht kopiere ich sie mit bitblt() auf den Schirm, nur habe ich das Problem das das ganze unter Windows ME ganz gut funktioniert, aber unter WinXP werden einfach die Schneeflocken gar nicht dargestellt.
Woran könnte das liegen? Bzw. welche Alternativen habe ich?
Hier die betreffenen Code-Zeilen (aus einer Unit):

Code:
function TransparentDraw(ZielDC:Word;zLeft,zTop,
                         zWidth,zHeight:Integer;
                         QuellDC,MaskeDC:Word;qLeft,qTop:Integer)
                         :Boolean;
begin
  Result:=BitBlt(ZielDC,zLeft,zTop,zWidth,
                 zHeight,MaskeDC,qLeft,qTop,SrcAnd);
  Result:=Result and BitBlt(ZielDC,zLeft,zTop,zWidth,
                            zHeight,QuellDC,qLeft,qTop,SrcInvert);
end;
Danke im voraus

P.S. im Anhang ist das Spiel

d3g 18. Dez 2002 19:44

Hi arnoldo,

ein hDC ist ein Handle und Handles sind vom Typ Longword (also 32 bit ohne Vorzeichen). Du benutzst allerdings Words (16 bit ohne Vorzeichen) dafür. Ich könnte mir gut vorstellen, dass Windows NT/2000/XP etwas dagegen hat, dass die Zahl der DCs 65.536 überschreitet (mein Verdacht ist, dass das unter Windows 95/98/ME gar nicht geht) und du dann nur die niedrigeren 16 bit des 32 bit-Handles benutzst.

Lange Rede, kurzer Sinn: Schreib deine Funktionendeklaration wie folgt um, benutze nur noch Longwords (oder HDCs) für Device-Context-Handles und schau, ob's funktioniert.

Delphi-Quellcode:
function TransparentDraw(ZielDC: Longword; zLeft, zTop, zWidth, zHeight: Integer; QuellDC, MaskeDC: Longword; qLeft, qTop: Integer): Boolean;
MfG,
d3g

jbg 18. Dez 2002 20:22

Oder am besten gleich HDC. So ein ähnliches Problem hatte ich auch schon mal mit Regions. Unter Win9x/ME lief das Programm einwandfrei. Jedoch kam unter Win2000 (damals gab es noch kein XP) kam eine Bereichsüberschreitung. Ein Integer kann eben nur 2 Mrd. im positiven fassen und Win2000 lieferte eben einen 3 Mrd. Wert.

arnoldo 18. Dez 2002 20:30

DAAAAAAAANKE!!! Es funktioniert nun :D

Ein wirklich Klasse Forum - hier wird einem geholfen.

für alle die es interessiert hier die funktionierende Version:
http://www.people.freenet.de/steffen...ermine1.0a.zip

City Light 25. Dez 2002 01:52

Hi Arnoldo!

Ich würde gern wissen wie du das gemacht hast das mit den Schneeflocken auf dem schirm....sieht gut aus! will auch haben ;-)

könntest du mir da nicht auf die springe helfen ,habe nähmlich null ahnung. :oops:

arnoldo 29. Dez 2002 10:15

Liste der Anhänge anzeigen (Anzahl: 1)
Hallo city light,

schön das Du Dich für die Flocken interessierst, am besten ich werde
mal ein kleines Beispiel ranhängen (mit code). Das erklärt sich dann
schon alles von selbst.
Im prinzip werden ganz einfach die Koordinaten einer jeden Flocke in
einem Array festgehalten und per timer verändert. Auf den Bildschirm
wird das ganze per TImage und BitBlt gebracht.

Gruss Steffen :party:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:41 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