DirectX pb avec la surface primaire sans le plein écran

Signaler
Messages postés
61
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
28 septembre 2007
-
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
-
Salut à tous !

J'ai un problème concernant le mode plein écran de Direct Draw que je veux supprimer.
J'arrive enfin a créer une simple fenêtre (qui n'est pas en plein écran) mais la création de la surface primaire plante et je ne sais pas du tout pourquoi.

La partie qui plante marchait très bien avec le mode plein écran.

DDraw(HINSTANCE hInstance, int nCmdShow){
//Méthode initialisant DirectDraw

WNDCLASS wc; //fenêtre Windows

//Création et déclaration de la classe de la fenêtre.
wc.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = NULL;
wc.lpszMenuName = NAME;
wc.lpszClassName = NAME;
RegisterClass(&wc);

hwnd = CreateWindowEx(WS_EX_TOPMOST, NAME, TITLE, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE,CW_USEDEFAULT, CW_USEDEFAULT,largeurFenetre, hauteurFenetre, 0,0,hInstance, 0 );

ShowWindow( hwnd, nCmdShow );
UpdateWindow( hwnd );
hwndfm=hwnd;
ShowCursor( true );

//Création de l'objet DirectDraw;
DirectDrawCreateEx(NULL,(void**)&lpDD,IID_IDirectDraw7,NULL);

//On demande le mode exclusif (priorité au niveau de Windows)
lpDD->SetCooperativeLevel( hwnd, DDSCL_EXCLUSIVE | DDSCL_NORMAL |DDSCL_ALLOWREBOOT );

//Création de la surface primaire associée à un backbuffer
memset (&ddsd, 0, sizeof (DDSURFACEDESC2));
//initialisation de la structure
ddsd.dwSize = sizeof( DDSURFACEDESC2 );
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
//on associe un backbuffer à la surface
//les flags suivants décrivent la surface comme étant primaire, associée à un backbuffer, et chargée en mémoire vidéo
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX | DDSCAPS_VIDEOMEMORY ;
ddsd.dwBackBufferCount = 1;
//nombre de back buffers associés à la surface
lpDD->CreateSurface(&ddsd,&lpDDSPrimary,NULL);

//On crée un pointeur vers le back buffer pour permettre le flipping des deux surfaces
ZeroMemory(&ddscaps, sizeof(ddscaps)); //initialisation de la structure
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;

// ça plante à la ligne suivante !!!

lpDDSPrimary->GetAttachedSurface(&ddscaps,&lpDDSBack);

//Sélection du noir comme clé de couleur transparente
ddsd.ddckCKSrcBlt.dwColorSpaceLowValue = 0;
ddsd.ddckCKSrcBlt.dwColorSpaceHighValue = 0;

//Description des surfaces offscreen de l'exemple
//Il n'est pas utile de répéter ces opération pour chaque surface car
//la description ddsd ne s'efface pas entre deux création de surface
memset (&ddsd, 0, sizeof (DDSURFACEDESC2));
//initialisation de la structure
ddsd.dwSize = sizeof( DDSURFACEDESC2 );
//description de la surface, notamment pour la clé de couleur associée (DDSD_CKSRCBLT)
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_CKSRCBLT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;

//Création des différentes surfaces
//....
}

Merci

Mon CV, tous mes projets...

3 réponses

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
tu ne peut pas spcéfifier fome normal et exclusif en même temps (c'est soit l'un soit l'autre et en mode non plein écran c'est DDSCL_NORMAL)

extrait de la doc :

DDSCL_FULLSCREEN
The exclusive-mode owner is responsible for the entire primary surface. The GDI can be ignored. This flag must be used with the DDSCL_EXCLUSIVE flag.

DDSCL_EXCLUSIVE
Requests the exclusive level. This flag must be used with the DDSCL_FULLSCREEN flag.

DDSCL_NORMAL :
The application functions as a regular Microsoft® Windows® application. This flag cannot be used with the DDSCL_ALLOWMODEX, DDSCL_EXCLUSIVE, or DDSCL_FULLSCREEN flags.
Messages postés
61
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
28 septembre 2007
1
Merci pour ton explication.

J'ai enlevé les valeurs qui ne pouvaient pas être compatibles ensembles et maitenant j'ai donc :

lpDD->SetCooperativeLevel( hwnd, DDSCL_NORMAL );

mais le programme plante toujours au même endroit :

lpDDSPrimary->GetAttachedSurface(&ddscaps,&lpDDSBack);

Je pense que cette ligne va créer mon backbuffer sur lequel je vais appliquer mes sprites, donc c'est une étape obligatoire.
Je ne vois pas pourquoi ça marche en plein écran et pas en fenêtre ?

Merci
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
les chaînes de backbuffer ne sont possible qu'en mode plein écran. en mode fenêtré, tu doit gérer toi-même les buffers offscreen. (en faisant une copie par bitblt à l'écran)

va voir ma source d'écran de veille matrix il y a un exemple qui gère les 2 (plein écran et fenétré)