![]() |
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:
Danke im voraus
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; P.S. im Anhang ist das Spiel |
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:
MfG,
function TransparentDraw(ZielDC: Longword; zLeft, zTop, zWidth, zHeight: Integer; QuellDC, MaskeDC: Longword; qLeft, qTop: Integer): Boolean;
d3g |
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.
|
DAAAAAAAANKE!!! Es funktioniert nun :D
Ein wirklich Klasse Forum - hier wird einem geholfen. für alle die es interessiert hier die funktionierende Version: ![]() |
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: |
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 11:05 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