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.