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...