|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
razlo Mini JLI'ler
Anmeldedatum: 25.07.2003 Beiträge: 6
Medaillen: Keine
|
Verfasst am: 25.07.2003, 05:46 Titel: Surface aus Bitmap erstellen (Größe stets falsch) |
|
|
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.
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 ).
Übrigens wird gar nichts dargestellt, wenn ich statt der Blt die BltFast verwende (letzter Codeschnippsel).
Ich hoffe, ihr könnt mir helfen.
Danke.
[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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
|
Nach oben |
|
|
razlo Mini JLI'ler
Anmeldedatum: 25.07.2003 Beiträge: 6
Medaillen: Keine
|
Verfasst am: 25.07.2003, 13:42 Titel: |
|
|
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 |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 25.07.2003, 13:44 Titel: |
|
|
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 |
|
|
razlo Mini JLI'ler
Anmeldedatum: 25.07.2003 Beiträge: 6
Medaillen: Keine
|
Verfasst am: 25.07.2003, 14:09 Titel: |
|
|
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? |
|
Nach oben |
|
|
Manuel87 Mini JLI'ler
Anmeldedatum: 28.07.2003 Beiträge: 33
Medaillen: Keine
|
Verfasst am: 28.07.2003, 22:46 Titel: Die Lösung! |
|
|
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! |
|
Nach oben |
|
|
|
|
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
|