JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=4983e9ae5aa25d36c4adb898e99ea1e7Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Surface aus Bitmap erstellen (Größe stets falsch)

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
razlo
Mini JLI'ler



Anmeldedatum: 25.07.2003
Beiträge: 6

Medaillen: Keine

BeitragVerfasst am: 25.07.2003, 05:46    Titel: Surface aus Bitmap erstellen (Größe stets falsch) Antworten mit Zitat

Hallo,

so langsam weiss ich schon nicht mehr, was ich tun soll. Ich habe so ziemlich alles versucht um dieses Problem selbst in den Griff zu bekommen, aber jetzt muss ich wohl doch mal die Experten befragen. Wink

Also folgendes:
Ich benutze die im Buch beschriebene Funktion CreateSurfaceFromBitmap(), jedoch werden alle Bitmaps stets viel zu groß dargestellt.
Die Farben sind absolut ok, nur eben die Größe passt nicht.

Dabei ist es egal, ob die Anwendung im Fenster oder Fullscreen läuft. Auch habe ich schon alle möglichen Auflösungen und Farbtiefen (bei Fullscreen) ausprobiert - das Ergebnis ist immer das gleiche.

Ich habe es schon mit verschiedenen Bitmaps (unterschiedlicher Farbtiefe) probiert... immer das gleiche.
Dabei wird die Graphik (egal welche Originalgröße sie hat) immer über den gesamten Bildschirm gezerrt.

Hier nochmal kurz der Quelltext:

Code:
LPDIRECTDRAWSURFACE7 CreateSurfaceFromBitmap(LPSTR File,int dWidth,int dHeight)
{
   LPDIRECTDRAWSURFACE7 lpDDSurf = NULL; //zeiger auf surface mit bild
   DDSURFACEDESC2 ddsd; // struktur für das anlegen einer oberfläche
   HBITMAP hBM = 0; // handle des bitmap
   HDC hSurfDC = NULL; // device context des surface
   HDC hBmDC = NULL; // DC für das bitmap
   
   // ddsd leeren
   ZeroMemory(&ddsd,sizeof(ddsd));
   
   // handle der graphik holen
   hBM = (HBITMAP)LoadImage(NULL,File,IMAGE_BITMAP,dWidth,dHeight,LR_LOADFROMFILE);
   if(hBM == NULL)
      MessageBox(MWHandle,"Fehler während LoadImage()","Fehler",MB_OK);
   
   // ddsd mit daten füllen
   ddsd.dwSize = sizeof(ddsd);
   ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH ; // ddsCaps soll beachtet werden
   ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;// surface im speicher und dd bestimmt in welchem
                                     // es angelegt wird
   ddsd.dwWidth = dWidth;
   ddsd.dwHeight = dHeight;
   // und schliesslich die oberfläche anlegen
   if(FAILED(lpDD7->CreateSurface(&ddsd,&lpDDSurf,NULL)))
      MessageBox(MWHandle,"Konnte Surface fuer Bitmap nicht anlegen","Fehler",MB_OK);
   
   // device c. des surface holen
   lpDDSurf->GetDC(&hSurfDC);
   // nun einen kompatiblen DC für das bild anlegen
   hBmDC = CreateCompatibleDC(hSurfDC);
   // bild mit diesem kompatiblen DC verbinden
   SelectObject(hBmDC,hBM);
   // Bild in surface kopieren
   BitBlt(hSurfDC,0,0,dWidth,dHeight,hBmDC,0,0,SRCCOPY);
   
   // nun wieder alles freigeben
   lpDDSurf->ReleaseDC(hSurfDC);
   DeleteDC(hBmDC);
   DeleteObject(hBM);
   
   return lpDDSurf;
}


So weise ich dann dem global definierten Surfacepointer die gültige Adresse zu (gibt auch keine Fehlermeldung, wenn ich das mit FAILED überprüfe):

Code:

lpDDSurface = CreateSurfaceFromBitmap("c:\\fallout.bmp",30,66);


So blitte ich dann halt in den primären Surface (auch ohne Fehlermeldung):

Code:

lpDDSPrimary->Blt(NULL,lpDDSurface,NULL,DDBLT_WAIT,NULL);



Vielleicht ist es noch wichtig zu sagen, daß ich DirectX8 benutze, bzw. DirectDraw7 (sieht man aber sich an den Datentypen Wink).
Übrigens wird gar nichts dargestellt, wenn ich statt der Blt die BltFast verwende (letzter Codeschnippsel).

Ich hoffe, ihr könnt mir helfen.
Danke. Smile

[edit]
Mir ist noch aufgefallen, daß es eigentlich nur an einer der beiden Blitfunktionen liegen kann. Also entweder die des GDI oder der letzte Aufruf mit DD7.
[/edit]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 25.07.2003, 11:10    Titel: Antworten mit Zitat

Da hilft dir am besten die Suchefunktion

Und wenn du diese genutz hast, wirst du vielleicht auf diesen Thread stoßen und vielleicht auch Hilfe finden.
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
razlo
Mini JLI'ler



Anmeldedatum: 25.07.2003
Beiträge: 6

Medaillen: Keine

BeitragVerfasst am: 25.07.2003, 13:42    Titel: Antworten mit Zitat

Yep, diesen Thread hatte ich bereits gefunden.
Das Problem ist nur, daß darin nicht wirklich der Fehler gefunden wird.

Mir ist nochwas aufgefallen:
Christian Rousselle schreibt in seinem Bcuh, daß man die Funktion CreateSurfaceFromBitmap() auch mit den beiden Größenwerten 0,0 aufrufen kann.
Das geht allerdings nicht, da ja dann immer versucht wird ein 0x0 großes Surface im Speicher anzulegen.

Oder hab ich da was falsch verstanden?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 25.07.2003, 13:44    Titel: Antworten mit Zitat

Eigentlich sollte da stehen, dass man die LoadImage mit 0,0 für Width und Height aufrufen kann. Dann bestimmt das GDI die Größe anhand der Datei.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
razlo
Mini JLI'ler



Anmeldedatum: 25.07.2003
Beiträge: 6

Medaillen: Keine

BeitragVerfasst am: 25.07.2003, 14:09    Titel: Antworten mit Zitat

Ja, aber selbst wenn ich LoadImage() die Größenwerte 0,0 übergebe, wird mein Bitmap dann immernoch viel zu groß dargestellt.

Hat denn hier keine ne Lösung des Problemes? Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Manuel87
Mini JLI'ler



Anmeldedatum: 28.07.2003
Beiträge: 33

Medaillen: Keine

BeitragVerfasst am: 28.07.2003, 22:46    Titel: Die Lösung! Antworten mit Zitat

Schau her:
Mit dem call strecht du das lpDDSurface automatisch über den ganzen screen! Der 1. Parameter gibt nämlich (glaub ich, ist schon länger her das ich das verwendet hab) das rect an in das zu blitten ist! bei dir ist das das ganze primary surface (lpDDSPrimary)! Laden tust du das surface schon in der richtigen Größe!
Also hier liegt der fehler!
lpDDSPrimary->Blt(NULL,lpDDSurface,NULL,DDBLT_WAIT,NULL);

Aber zum testen der waren Größe benutze Bltfast ! Da gibst du nur die coordinaten an (x,y) und die größe bleibt unferändert!

Glaube der call schaut dann zirka so aus:
lpDDSPrimary->Bltfast(x,y,lpDDSurface,NULL,DDBLTFAST_WAIT,NULL);
oder so ähnlich!
enjoy coding! Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum