Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

1

10.07.2005, 17:29

Bitmap in Surface laden

Hi,

habe das Forum hier über google gefunden. Ich lerne grad die Programmierung mit DirectX 8. Probleme bereitet mir allerdings schon das alleineige darstellen einer Bitmap. Geladen wird sie soweit ich weiß richtig. Nur die Darstellung ist ein wenig komisch, hier mal ein Bild davon:

(Link)

Sieht komisch aus...Hier mal ein wenig Code.

Hier erstmal der Code von meiner "CreateSurfaceFromBitmap"-Funktion:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
LPDIRECTDRAWSURFACE7 CreateSurfaceFromBitmap(LPDIRECTDRAW7 lpDD7, LPSTR File, int dWidth, int dHeight)
{
    // Device Context für das Bild und die Pberfläche
    HDC hBmDC, hSurfDC;

    // Handle der zu ladenden Bitmap
    HBITMAP hBM;

    // Oberflächenberechnung
    DDSURFACEDESC2 SurfDesc;

    // Zeiger auf die Oberfläche
    LPDIRECTDRAWSURFACE7 lpDDSurface;

    // Bild laden
    hBM = (HBITMAP)LoadImage(0,File,IMAGE_BITMAP,dWidth,dHeight,LR_LOADFROMFILE);

    // ist ein Fehler während des Ladens aufgetreten?
    if (hBM == NULL)
    {
        return NULL;
    }

    // Oberflächenbeschreibung initialisieren
    ZeroMemory(&SurfDesc,sizeof(SurfDesc));
    SurfDesc.dwSize = sizeof(SurfDesc);

    // Caps, Höhe und Breite sollen berücksichtg werden
    SurfDesc.dwFlags = DDSD_CAPS | DDSD_HEIGHT || DDSD_WIDTH;

    SurfDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
    SurfDesc.dwWidth = dWidth;
    SurfDesc.dwHeight = dHeight;

    // Oberfläche anlegen
    if (FAILED(lpDD7->CreateSurface(&SurfDesc,&lpDDSurface,NULL)))
    {
        return NULL;
    }

    // Device Context dr Oberfläche holen
    lpDDSurface->GetDC(&hSurfDC);

    // kompatiblen Device Context für das Bild anlegen
    hBmDC = CreateCompatibleDC(hSurfDC);

    // Bild in den Device Context holen
    SelectObject(hBmDC,hBM);

    // Bild in die Oberfläche kopieren
    BitBlt(hSurfDC,0,0,dWidth,dHeight,hBmDC,0,0,SRCCOPY);

    // Device Context freigeben
    lpDDSurface->ReleaseDC(hSurfDC);

    // Device Context und Bild löschen
    DeleteDC(hBmDC);

    // Grafik löschen
    DeleteObject(hBM);

    // Zeiger auf die Oberfläche zurückgeben
    return lpDDSurface;


Und hier rufe ich sie auf:

Quellcode

1
LPDIRECTDRAWSURFACE7 lpDDSurface = CreateSurfaceFromBitmap(lpDD7,"\\gfx\\main.bmp",250,250);


Und hier kopiere ich das dann auf meine primäre Surface, damits auch angezeigt wird:

Quellcode

1
2
3
4
if(FAILED(lpDDSPrimary->BltFast(10,10,lpDDSurface,NULL,DDBLTFAST_WAIT)))
    {
        Error("Fehler beim Kopieren der Bitmap");
    }

Tjo, man sieht ja, was oben bei rauskommt. Ich weiß nicht, was ich falsch gemacht hab :(

Ich hoffe, ihr könnt mir helfen.

Gruß
Otti

DrthM2001

Alter Hase

Beiträge: 721

Wohnort: Karlsruhe

  • Private Nachricht senden

2

10.07.2005, 17:40

solche darstellungen bekomme ich mit meiner 9500pro bei der die pipelines abgeschmort sind unter 3d spielen

Anonymous

unregistriert

3

10.07.2005, 18:07

Das ist bei mir aber nicht der Fall, da das Fertigcompilierte Programm ja geht. Das Programm was der Auto von dem Buch, was ich hier liegen hab, geschrieben hab.

DrthM2001

Alter Hase

Beiträge: 721

Wohnort: Karlsruhe

  • Private Nachricht senden

4

10.07.2005, 19:19

vielleicht hilft dir das hier:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
//************** NON CLASS RELATED FUNCTION **************************************************/

// DirectDraw Load Bitmap (to surface)

IDirectDrawSurface* DDLoadBitmap(IDirectDraw* pdd, LPCSTR szBitmap)
{

   HBITMAP hbm;
   BITMAP bm;
   IDirectDrawSurface *pdds;

   // Load Image for loading from Disk


   hbm = (HBITMAP)LoadImage(NULL, szBitmap, IMAGE_BITMAP,0,0,LR_LOADFROMFILE | LR_CREATEDIBSECTION);



   if(hbm == NULL) { return NULL; }

   GetObject(hbm, sizeof(bm), &bm); // size



   // Create Surface for this Bitmap


   int cw = bm.bmWidth;
   int ch = bm.bmHeight;

   MXWIDTH = cw;
   MXHEIGHT = ch;


   pdds = CreateOffScreenSurface(pdd, bm.bmWidth,bm.bmHeight);

   if(pdds)
   {

      DDCopyBitmap(pdds, hbm, bm.bmWidth,bm.bmHeight);
   }


   DeleteObject(hbm);

   return pdds;

}

mxbitmap DDLoadBitmapX(IDirectDraw* pdd, LPCSTR szBitmap)
{

   HBITMAP hbm;
   BITMAP bm;
   IDirectDrawSurface *pdds;

   // Load Image for loading from Disk


   hbm = (HBITMAP)LoadImage(NULL, szBitmap, IMAGE_BITMAP,0,0,LR_LOADFROMFILE | LR_CREATEDIBSECTION);

   mxbitmap xbm;



   if(hbm == NULL) { xbm.surf = NULL; return xbm; }

   GetObject(hbm, sizeof(bm), &bm); // size



   // Create Surface for this Bitmap


   int cw = bm.bmWidth;
   int ch = bm.bmHeight;

   pdds = CreateOffScreenSurface(pdd, bm.bmWidth,bm.bmHeight);

   if(pdds)
   {

      DDCopyBitmap(pdds, hbm, bm.bmWidth,bm.bmHeight);
   }


   DeleteObject(hbm);

   xbm.surf = pdds;
   xbm.w = cw;
   xbm.h = ch;

   return xbm;

}

Mathias

Frischling

Beiträge: 29

Wohnort: Berlin

Beruf: Schüler

  • Private Nachricht senden

5

30.07.2005, 11:59

Re: Bitmap in Surface laden

Zitat von »"t10ottoo"«


Quellcode

1
2
    // Caps, Höhe und Breite sollen berücksichtg werden
    SurfDesc.dwFlags = DDSD_CAPS | DDSD_HEIGHT || DDSD_WIDTH;



Ich kann das Bild leider nicht sehen, aber ich würde mal darauf tippen.

Beiträge: 53

Wohnort: Neuhofen

Beruf: Schüler

  • Private Nachricht senden

6

31.07.2005, 10:56

Re: Bitmap in Surface laden

Zitat


Quellcode

1
2
    // Caps, Höhe und Breite sollen berücksichtg werden
    SurfDesc.dwFlags = DDSD_CAPS | DDSD_HEIGHT || DDSD_WIDTH;



Du solltest lieber nicht mit || verknuepfen, sonst kommen am ende keine Bitweise verknuepften Flags raus.

mfg
Ungeduld ist die Mutter der Dummheit - DaVinci

Werbeanzeige