DirectDrawClass::Inie(HWND hWnd)



  • Also ich habe zu der genannten Funktion folgendes geschrieben:

    // DirectDrawObjekt anlegen    
        if(FAILED(DirectDrawCreateEx(NULL,(LPVOID*)&lpDD7,IID_IDirectDraw7,NULL)))
        {  
            return Error("Fehler beim Anlegen "
                         "des DirectDraw-Objekts");
        }
    
        // Kooperationsebene setzen
        if(FAILED(lpDD7->SetCooperativeLevel(hWnd,DDSCL_NORMAL)))
        {
            return Error("Fehler beim Setzen des Kooperationsebene");    
        }
    
        // Struktur zur Beschreibung einer Oberfläche
        DDSURFACEDESC2 ddsd;
    
        // Initialisieren und Größe festlegen
        ZeroMemory(&ddsd,sizeof(ddsd));
        ddsd.dwSize = sizeof(ddsd);
    
        // Die Angabe wdCaps soll berücksichtigt werden
        ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
    
        // Es soll eine primäre Oberfläche angelegt werden
        ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX | DDSCAPS_VIDEOMEMORY;
    
        // Es soll ein Puffer angelegt werden
        ddsd.dwBackBufferCount = 1;
    
        // Oberfläche anlegen
        if(FAILED(lpDD7->CreateSurface(&ddsd,&lpDDSPrimary,NULL)))
        {
            return Error("Fehler beim Anlegen der primären Oberfläche");
        }
    
        // Clipper anlegen
        if(FAILED(lpDD7->CreateClipper(NULL,&lpDDClipper,NULL)))
        {
            return Error("Fehler beim anlegen des Clipper");
        }
    
        // Clipper mit dem Fenster verbinden
        if(FAILED(lpDDClipper->SetHWnd(0,hWnd)))
        {
            return Error("Fehler bei SetHWnd");    
        }
    
        // Clipper mit der Oberfläche verbinden
        if(FAILED(lpDDSPrimary->SetClipper(lpDDClipper)))
        {
            return Error("Fehler beim Verbinden des Clippers");    
        }
    
        ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
    
        // Hintergrundpuffer anlegen
        if(FAILED(lpDDSPrimary->GetAttachedSurface(&ddsd.ddsCaps,&lpDDSBackBuffer)))
        {
            return Error("Fehler beim Anlegen des Puffers");
        }
    
        return TRUE;
    

    Und es kommt immer die Fehlermeldung "Fehler beim Anlegen der primären Oberfläche".
    Und jetzt würde ich gerne wissen, wo denn der Fehler liegt.

    Thx

    P.S.: Das Programm läuft im Fenstermodus.



  • Du erstellst einen Backbuffer in einer Fensteranwendung.

    siehe:

    [cpp]
    // Die Angabe wdCaps soll berücksichtigt werden
    ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
    .
    .
    .
    // Es soll ein Puffer angelegt werden
    ddsd.dwBackBufferCount = 1;

    Das erstellt nicht einen Buffer sondern einen Backbuffer!!!

    [/cpp]

    [ Dieser Beitrag wurde am 10.03.2003 um 21:43 Uhr von Netzwerk-Latenz editiert. ]



  • Und wie kann ich einen Buffer anlegen?
    Ich habe dazu in der MSDN nichts gefunden.
    Oder ist das ein FRONTBUFFER?
    Vielen Dank schon mal.



  • Du legst einen Frontbuffer (Primary Surface) an. Alles was gezeichnet wird kommt hier rein.

    PS: Damit es nicht flimmert solltest du noch eine "normale" Surface erzeugen. Erst in diese zeichnen und wenn du fertig bist mit dem Frontbuffer tauschen. Weil alles was in den Fronbuffer kommt sofort sichtbar ist.



  • Vielen Dank schon mal.

    Aber könntest du mir bitte konkret sagen, wie ich das machen muss???

    ich habe es folgendermaßen versucht:

    ddsd.ddsCaps.dwCaps = DDSCAPS_FRONTBUFFER;
    
        // Vordergrundpuffer anlegen
        if(FAILED(lpDDSPrimary->GetAttachedSurface(&ddsd.ddsCaps,&lpDDSFrontBuffer)))
        {
            return Error("Fehler beim Anlegen des Puffers");
        }
    

    anstatt:

    ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
    
        // Hintergrundpuffer anlegen
        if(FAILED(lpDDSPrimary->GetAttachedSurface(&ddsd.ddsCaps,&lpDDSBackBuffer)))
        {
            return Error("Fehler beim Anlegen des Puffers");
        }
    

    Und die Fliproutine:

    // Puffer anzeigen
        lpDDSPrimary->Flip(NULL,DDFLIP_WAIT);
    

    Aber irgendwie funktioniert das nicht.
    Kannst du mir bitte helfen???

    Thx



  • Code zum initialisieren findest du in jedem gutem DirectDraw Tutorial. Kannst du da nicht selbst vergleichen 🙂 ?



  • Es tut mir leid, aber ich habe jetzt die Seiten, die in der Faq stehen alle durchgesehen, und dort gehen die Tutorials entweder um Direct3D oder um DirectDraw allerdings im Fullscreen-Modus.
    Und bei mir geht es ja eben um den Fenstermodus.
    Kannst du mir bitte sagen, wo ich denn so ein "Besseres Tutorial" finde?

    Thx



  • [cpp]
    // DirectDrawObjekt anlegen
    if(FAILED(DirectDrawCreateEx(NULL,(LPVOID*)&lpDD7,IID_IDirectDraw7,NULL)))
    {
    return Error("Fehler beim Anlegen "
    "des DirectDraw-Objekts");
    }

    // Kooperationsebene setzen
    if(FAILED(lpDD7->SetCooperativeLevel(hWnd,DDSCL_NORMAL)))
    {
    return Error("Fehler beim Setzen des Kooperationsebene");
    }

    HIER EINEN CLIPPER ERSTELLEN

    // Struktur zur Beschreibung einer Oberfläche
    DDSURFACEDESC2 ddsd;

    // Initialisieren und Größe festlegen
    ZeroMemory(&ddsd,sizeof(ddsd));
    ddsd.dwSize = sizeof(ddsd);

    // Die Angabe wdCaps soll berücksichtigt werden
    ddsd.dwFlags = DDSD_CAPS;BEACHTE

    // Es soll eine primäre Oberfläche angelegt werden
    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;BEACHTE

    // Es soll ein Puffer angelegt werden
    GELÖSCHT

    // Oberfläche anlegen
    if(FAILED(lpDD7->CreateSurface(&ddsd,&lpDDSPrimary,NULL)))
    {
    return Error("Fehler beim Anlegen der primären Oberfläche");
    }

    // Clipper anlegen
    if(FAILED(lpDD7->CreateClipper(NULL,&lpDDClipper,NULL)))
    {
    return Error("Fehler beim anlegen des Clipper");
    }

    /* Clipper mit dem Fenster verbinden
    if(FAILED(lpDDClipper->SetHWnd(0,hWnd)))
    {
    return Error("Fehler bei SetHWnd");
    }*/

    // Clipper mit der Oberfläche verbinden
    if(FAILED(lpDDSPrimary->SetClipper(lpDDClipper)))
    {
    return Error("Fehler beim Verbinden des Clippers");
    }

    /*ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;*/LÖSCHEN

    /Hintergrundpuffer anlegen
    if(FAILED(lpDDSPrimary->GetAttachedSurface(&ddsd.ddsCaps,&lpDDSBackBuffer)))
    {
    return Error("Fehler beim Anlegen des Puffers");
    }
    /

    return TRUE;[/cpp]

    Probier es mal so 😕

    [ Dieser Beitrag wurde am 12.03.2003 um 19:14 Uhr von Netzwerk-Latenz editiert. ]



  • Na ja,
    Also es funktioniert schon, aber was soll ich damit anfangen???
    Ich benötige ja einen Puffer, damit ich das Flimmern wegbekomme...
    Weißt du wie das im Fenstermodu geht???
    Oder weißt du eine gute Seite mit Tutorials???
    Trotzdem Vielen Dank



  • Den Backbuffer musst du mit einer zweiten "normalen" Surface simulieren. Zeichne erst in diesen und schalte um auf den Primärbuffer.


Anmelden zum Antworten