DirectX Übersetzungsproblem bei Übungsbeispiel



  • Ich fange gerade an, mich mit DirectX zu befassen. Dafür habe ich ein wenig gegoogelt und folgende Website gefunden:

    http://www.anmabagima.de/DXCpp/tutstart.html

    Ich habe das Ganze in meinen lcc-Win32 übernommen und bekomme nun Fehler.
    Die Mehrzahl konnte ich beseitigen. Aber ein kleiner Rest ist übrig geblieben.

    Die Source:

    /*
     * TestDDraw.c
     */
    #include <windows.h>
    #define INITGUID // <- nur für lcc-win32 Compiler
    #include "ddraw.h"
    /*<---------------------------------------------------------------------->*/
    LPDIRECTDRAW7 lpDDraw7 = NULL;//Zeiger a. die Schnittstelle des DD-Obj. der Version 7
    LPDIRECTDRAWSURFACE7 lpDSurf7 = NULL;//unser Bildschirmsurface
    DDSURFACEDESC2 DDSurfDesc2; //die Beschreibung unserer Bildschirmzeichenfläche
    LPDIRECTDRAWSURFACE7 lpDPaint7 = NULL;//die Arbeitsfläche
    DDSURFACEDESC2 DDPaintDesc2; //und deren Beschreibung
    
    BOOL IsDDraw = FALSE;//ist TRUE wenn DirectDraw initialisiert wurde
    BOOL InitDirectDraw(HWND hwnd);
    void ExitDirectDraw(void);
    void ManipulatePaintSurface(void);
    /*<---------------------------------------------------------------------->*/
    LRESULT WINAPI WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
    BOOL APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                          LPSTR lpCmdLine, int nShowCmd)
    {
         WNDCLASS wc;
         HWND hwnd;
         MSG msg;
    
         wc.lpszClassName = "TestDDraw";
         wc.style = CS_HREDRAW | CS_VREDRAW;
         wc.lpfnWndProc = WindowProc;
         wc.cbClsExtra = 0;
         wc.cbWndExtra = 0;
         wc.hInstance = hInstance;
         wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
         wc.hCursor = LoadCursor(NULL, IDC_ARROW);
         wc.hbrBackground = (HBRUSH) (COLOR_BACKGROUND + 1);
         wc.lpszMenuName = NULL;
    
         RegisterClass(&wc);
    
         hwnd = CreateWindow ("TestDDraw", "Test DirectDraw Fenster", WS_OVERLAPPED,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              NULL, NULL, hInstance, NULL);
         ShowWindow (hwnd, SW_SHOW);
    
         IsDDraw = InitDirectDraw(hwnd); //DirectDraw initailisieren
        //nur wenn DirectDraw erfolgreich initialisiert wurde
        if (IsDDraw == TRUE)
        {
           //die Quelle soll ja die gesamte Arbeits-Zeichenfläche sein
           //diese haben wir mit einer Höhe und Breite von 200 erstellt!!
           SRect.top = 0;
           SRect.left = 0;
           SRect.right = 199;
           SRect.bottom = 199;
           //das Zielrechteck soll die selben Maße haben.
           //dadurch kommt es zu keiner Verzerrung.
           DRect = SRect;
           //die DRect-Koordinaten beziehen sich auf unser Anwendungsfenster
           //sie werden auf Bildschirmkoordinaten umgerechnet
           //der letzte Parameter 2 gibt an wieviele Punkte in DRect zu ändern sind
           MapWindowPoints(hwnd, NULL, (LPPOINT)&DRect, 2);
           //Der Blitter kopiert die Bilddaten
           //das Flag DDBLT_WAIT gibt an, dass dieser Vorgang wartet bis der Blitter
           //frei ist um ihn auszuführen
           lpDSurf7->lpVtbl->Blt(lpDSurf7, &DRect, lpDPaint7, &SRect, DDBLT_WAIT, NULL);
        };
    
         UpdateWindow(hwnd); //erzwingen einer WM_PAINT-Message
    
         while (GetMessage(&msg, NULL, 0, 0))
         {
             TranslateMessage(&msg);
             DispatchMessage(&msg);
         }
    
         ExitDirectDraw(); //DirectDraw wieder abbauen
    
         return msg.wParam;
    }
    /*<---------------------------------------------------------------------->*/
    BOOL InitDirectDraw(HWND hwnd)
    {
        LPDIRECTDRAW lpDDraw = NULL;
        // anlegen des Objektes: lpDDraw zeigt danach auf die Schnittstelle zu diesem Objekt
        if (DirectDrawCreate(NULL, &lpDDraw, NULL)!= DD_OK)
        {
             MessageBox(hwnd, "Konnte DirectDraw-Objekt nicht erzeugen.", NULL, MB_OK);
             return FALSE;
        }
        //das "Ur"-DD-Objekt nach einer Schnittstelle zu einem DD-Objekt der Version 7 fragen
        //wenn diese Schnittstelle existiert, dann wird ein Objekt der Version 7 angelegt
        //und ein Zeiger auf die Schnittstelle zu diesem Objekt in lpDDraw7 gespeichert
        if (lpDDraw->lpVtbl->QueryInterface(lpDDraw, &IID_IDirectDraw7, (void **)&lpDDraw7)!=DD_OK)
        {
             MessageBox(hwnd, "Keine Schnittstelle zu DirectDraw7 vorhanden", NULL, MB_OK);
             return FALSE;
        }
        //das "Ur"-Objekt wieder freigeben, da wir es nicht länger brauchen
        lpDDraw->lpVtbl->Release(lpDDraw);
    /*<---------------------------------------------------------------------->*/
        if (lpDDraw7->lpVtbl->SetCooperativeLevel(lpDDraw7, hwnd, DDSCL_NORMAL) != DD_OK)
        {
            MessageBox(hwnd, "Konnte Kooperationslevel nicht setzen", NULL, MB_OK);
            return FALSE;
        }
    /*<---------------------------------------------------------------------->*/
        //zum Anlegen einer Zeichenfläche die Beschreibung erstmal mit 0 initialisieren
        memset(&DDSurfDesc2, 0, sizeof(DDSURFACEDESC2));
        //DirectX erwartet in solchen Strukturen grundsätzlich eine Grössenangabe der Struktur
        DDSurfDesc2.dwSize = sizeof(DDSURFACEDESC2);
        //dieses Flag steuert welche Daten für die Anlage der Zeichenfläche genutzt werden sollen
        DDSurfDesc2.dwFlags = DDSD_CAPS;
        //Struktur ddsCaps füllen
        DDSurfDesc2.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |//primäre Zeichenfläche (sichtbar)
                                     DDSCAPS_VIDEOMEMORY;//Surface im Grafikkartenspeicher anlegen
        DDSurfDesc2.ddsCaps.dwCaps2 = 0;
        //erzeugen der Zeichenfläche, lpDSurf ist dann der Zeiger auf die Schnittstelle
        if (lpDDraw7->lpVtbl->CreateSurface(lpDDraw7, &DDSurfDesc2, &lpDSurf7, NULL) != DD_OK)
        {
            MessageBox(hwnd, "Konnte primäre Zeichenfläche nicht anlegen", NULL, MB_OK);
            return FALSE;
        }
    
        //es folgt unsere "Arbeitsfläche"
        memset(&DDPaintDesc2, 0, sizeof(DDSURFACEDESC2));
        DDPaintDesc2.dwSize = sizeof(DDSURFACEDESC2);
        DDPaintDesc2.dwFlags = DDSD_CAPS | DDSCAPS_HEIGHT | DDSCAPS_WIDTH;
        DDPaintDesc2.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |//normale Zeichenfl.("unsichtbar")
                                      DDSCAPS_SYSTEMMEMORY;//Surface im Hauptspeicher anlegen
        DDPaintDesc2.ddsCaps.dwCaps2 = 0;
        DDPaintDesc2.dwHeight = 200; //die Zeichenfläche ist 200 Bildpunkte hoch
        DDPaintDesc2.dwWidth = 200; //und 200 Bildpunkte breit
        if (lpDDraw7->lpVtbl->CreateSurface(lpDDraw7, &DDPaintDesc2, &lpDPaint7, NULL) != DD_OK)
        {
            MessageBox(hwnd, "Konnte normale Zeichenfläche nicht anlegen", NULL, MB_OK);
            return FALSE;
        }
        return TRUE;
    }
    /*<---------------------------------------------------------------------->*/
    void ExitDirectDraw(void)
    {
        if (lpDPaint7 != NULL) lpDSurf7->lpVtbl->Release(lpDPaint7);
        if (lpDSurf7 != NULL) lpDSurf7->lpVtbl->Release(lpDSurf7);
        if (lpDDraw7 != NULL) lpDDraw7->lpVtbl->Release(lpDDraw7);
    }
    /*<---------------------------------------------------------------------->*/
    void ManipulatePaintSurface(void)
    {
        BYTE *lpByteScreen;
        int i;
    
        if (lpDPaint7->lpVtbl->Lock(lpDPaint7, NULL, &DDPaintDesc2, DDLOCK_WAIT, NULL) == DD_OK)
        {
                //hier niemals einen Breakpoint platzieren oder mit dem Debugger hinein springen
                //einen byte-Pointer auf die Adresse der Bilddaten setzen
                lpByteScreen = DDPaintDesc2.lpSurface;
                //die ersten 50 Byte im Screen mit 255 belegen:
                for (i=0;i<50;i++)
                {
                    *lpByteScreen = 255;
                    lpByteScreen++;
                }
                //Surface entsperren
                lpDPaint7->lpVtbl->Unlock(lpDPaint7, NULL);
        }
        else MessageBox(NULL, "Konnte Zeichenfläche nicht sperren", NULL, MB_OK);
    }
    /*<---------------------------------------------------------------------->*/
    LRESULT WINAPI WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        PAINTSTRUCT ps;
    
        switch (msg)
        {
                case WM_PAINT:
                        //das sollte ja bekannt sein
                        BeginPaint(hwnd, &ps);
                        //hier wird dann die DX-Zeichenfläche geswitcht
                        EndPaint(hwnd, &ps);
                        break;
                case WM_DESTROY:
                        PostQuitMessage(0);
                        return TRUE;
                default:
                        return DefWindowProc(hwnd, msg, wParam, lParam);
        }
        return FALSE;
    }
    /*<---------------------------------------------------------------------->*/
    

    Hier die Liste der Fehler:

    Wedit output window build: Sat May 28 16:13:56 2005
    Error f:\c\york\p-testdraw.c: 107  undeclared identifier 'DDSCAPS_HEIGHT'
    Error f:\c\york\p-testdraw.c: 107  undeclared identifier 'DDSCAPS_WIDTH'
    Warning f:\c\york\p-testdraw.c: 107  possible usage of DDSCAPS_WIDTH before definition
    Warning f:\c\york\p-testdraw.c: 107  possible usage of DDSCAPS_HEIGHT before definition
    Compilation + link time:0.3 sec, Return code: 1
    


  • Du solltest die Fehler beseitigen und neu kompilieren.

    Bye, TGGC (Wähle deine Helden)



  • Kann mir denn wirklich niemand helfen? Fehlt da vielleicht ein #include?



  • Möglich.

    Bye, TGGC (Wähle deine Helden)



  • Hi,

    also dieses Tutorial da kannst du ja wohl echt in die Tonne kloppen.
    Halte dich lieber an das hier:
    http://msdn.microsoft.com/archive/en-us/ddraw7/directdraw7/ddover_7dx3.asp?frame=true

    Da findest du auch konkrete Informationen, welche Flags die DDSURFACEDESC2 bekommt und wirst sehen, dass es DDSD_ heißen muss.

    Viel Spaß noch.



  • SeppSchrot schrieb:

    Hi,

    also dieses Tutorial da kannst du ja wohl echt in die Tonne kloppen.

    Da muss ich dir - leider - uneingeschränkt Recht geben.

    SeppSchrot schrieb:

    Halte dich lieber an das hier:
    http://msdn.microsoft.com/archive/en-us/ddraw7/directdraw7/ddover_7dx3.asp?frame=true

    Da findest du auch konkrete Informationen, welche Flags die DDSURFACEDESC2 bekommt und wirst sehen, dass es DDSD_ heißen muss.

    Werde ich machen.

    SeppSchrot schrieb:

    Viel Spaß noch.

    Danke für die Hilfe.



  • Danke nochmals. Die Zeile musste richtig so heissen:

    DDPaintDesc2.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;


Anmelden zum Antworten