DirectX en mode plein écran (62 Ko)
Création de l'objet DirectDraw
Quand vous travaillez avec DirectDraw, la première chose à faire consiste à créer l'objet DirectDraw. Cet objet propose des méthodes pour créer et gérer ses objets enfants, telles les surfaces ou les palettes. Chaque objet enfant possède, de son côté, des méthodes qui peuvent servir à accéder à d'autres fonctionnalités de DirectDraw. L'objet DirectDraw fournit aussi des méthodes qui permettent de connaître les capacités du système hôte, de déterminer la quantité de mémoire vidéo disponible et d'effectuer d'autres tâches générales concernant la gestion d'affichage.
HRESULT WINAPI DirectDrawCreateEx
| Paramètre |
Description |
| GUID FAR *lpGUID |
Adresse de l'identificateur unique du périphérique DirectDraw à utiliser, ou bien l'une des valeurs du tableau ci-dessous. |
| LPVOID *lplpDD |
Adresse d'un pointeur qui pointera vers l'interface lDirectDraw résultante. |
| REFIID idd |
Ce paramètre doit être IID_IDirectDraw7. Cette fonction échoue et retourne DDERR_INVALIDPARAMS si une autre interface est spécifiée. |
| lUnknown FAR *pUnkOuter |
Inutilisé pour l'instant; doit être mis à NULL. |
Valeurs possibles pour le paramètre lpGUID de DirectDrawCreateEx :
| Valeur |
Description |
| NULL |
Utiliser le périphérique principal. |
| DDCREATE_EMULATIONONLY |
Utiliser uniquement HEL (pour test et débogage). |
| DDCREATE_HARDWAREONLY |
Utiliser HAL uniquement avec le périphérique par défaut (pour test et débogage). |
Cette fonction crée un objet DirectDraw7 avec une interface IDirectDraw7. DirectX fournit une interface IDirectDraw7, qui est l'interface la plus récente pour ce qui concerne la version 7.0.
LPDIRECTDRAW7 lpDD;
if(FAILED(DirectDrawCreateEx(NULL, (LPVOID*)&lpDD, IID_IDirectDraw7,
NULL))
MessageBox(hWnd, "Impossible de créer l'objet DirectDraw.",
"Erreur", MB_OK);
|
Cet exemple qui appelle une interface IDirectDraw7 requière au minimum une installation de DirectX 7.0. Cet exemple ne vérifie pas l'installation pour simplifier au maximum le code, mais vous pouvez rajouter cette vérification grâce à l'exemple "GetDXVersion" du répertoire "samples\multimedia\dxmisc\src\getdxver" du SDK.
Niveau coopératif
Le niveau coopératif définit la façon dont votre application interagira avec le système et avec les autres applications. Vous devez régler le niveau coopératif avant d'appeler d'autres méthodes de DirectDraw : sinon bon nombre d'entre elles échoueront.
HRESULT IDirectDraw7::SetCooperativelevel
| Paramètre |
Description |
| HWND hWnd |
Handel de la fenêtre de votre application. Peut être NULL si vous employez le niveau coopératif DDSCL_NORMAL. |
| DWORD dwFlags |
Un ou plusieurs des indicateurs donnés dans le tableau ci-dessous. |
Valeurs possibles pour le paramètre dwFlags de IDirectDraw7::SetCooperativelevel :
| Valeur |
Description |
| DDSCL_ALLOWMODEX |
Autorise l'emploi des modes vidéo. Cet indicateur ne peut s'utiliser qu'avec les indicateurs DDSCL_EXCLUSE et DDSCL_FULLSCREEN. |
| DDSCL_ALLOWREBOOT |
Autorise le redémarrage du système via CTRL + ALT + SUPPR quand on utilise DDSCL_EXCLUSIVE et DDSCL_FULLSCREEN. |
| DDSCL_EXCLUSIVE |
Utilisé avec l'indicateur DDSCL_FULLSCREEN pour demander le niveau exclusif. |
| DDSCL_FULLSCREEN |
Doit être utilisé avec l'indicateur DDSCL_EXCLUSIVE. L'application aura la charge de gérer toute la surface de dessin. |
| DDSCL_NORMAL |
L'application s'exécutera comme une application Windows ordinaire. |
| DDSCL_NOWINDOWCHANGES |
DirectDraw ne devrait pas réduire ou restaurer l'application automatiquement. |
// -------------------------------------------------------------
// Définit le niveau coopératif en mode plein écran.
// Nous donne la possibilité de modifier la résolution.
// Autorise le redémarrage du système via CTRL + ALT + SUPPR.
// -------------------------------------------------------------
if(FAILED(lpDD->SetCooperativeLevel(hwnd, DDSCL_EXCLUSIVE |
DDSCL_FULLSCREEN |
DDSCL_ALLOWREBOOT))
MessageBox(hWnd, "Impossible de définir le niveau coopératif.",
"Erreur", MB_OK);
|
Mode vidéo
Par mode vidéo (display mode) de DirectDraw, on entend une certaine combinaison de largeur d'écran, de format d'écran et de taux de rafraîchissement. Le fait d'avoir plusieurs modes vidéo offre des avantages : certains modes apportent un plus grand nombre de couleurs, d'autres peuvent afficher plus de données, d'autres encore sont plus rapides. Malheureusement, le choix d'un mode vidéo pour votre application est en général une affaire de compromis : une plus grande surface d'affichage et un plus grand nombre de couleurs se paient souvent par une animation plus saccadée.
HRESULT IDirectDraw7::SetDisplayMode
| Paramètre |
Description |
| DWORD dwWidth |
Largeur d'affichage, en pixels. |
| DWORD dwHeight |
Hauteur d'affichage, en pixels. |
| DWORD dwBPP |
Profondeurs de bits des pixels. |
| DWORD dwRefreshRate |
Taux de rafraîchissement; prenez 0 si vous ne gérez pas ce paramètre. |
| DWORD dwFlags |
Prenez DDSDM_STANDARDVGAMODE pour choisir le Mode 13. |
// -------------------------------------------------------------
// Définit le nouveau mode vidéo.
// -------------------------------------------------------------
if(FAILED(lpDD->SetDisplayMode(640, 480, 16, NULL, NULL))
MessageBox(hWnd, "Impossible de définir le mode vidéo.",
"Erreur", MB_OK);
|
Surfaces
Une surface est un tampon mémoire géré comme un rectangle : c'est une feuille de papier virtuelle que votre application manipule, copie et réorganise.
Les surfaces peuvent se diviser en plusieurs catégories générales. La surface primaire est la surface proposée à l'utilisateur. La surface la plus élémentaire n'est qu'un morceau de mémoire géré par DirectDraw, que l'on appelle surface off-screen. Les surfaces off-screen servent à stocker les illustrations utilisées par les applications, par exemple les arrière-plans et les sprites.
HRESULT IDirectDraw7::CreateSurface
| Paramètre |
Description |
| LPDDSURFACEDESC2 lpDDSurfaceDesc |
Pointeur vers une structure DDSURFACEDESC décrivant la surface à créer. |
| LPDIRECTDRAWSURFACE7 FAR *lplpDDSurface |
Adresse d'un pointeur qui sera initialisé afin de pointer vers la surface créée. |
| lUnknown FAR *pUnkOuter |
Inutilisé; doit valoir NULL. |
DDSURFACEDESC2 desc;
ZeroMemory(&desc, sizeof(desc));
desc.dwSize = sizeof(desc);
desc.dwFlags = DDSD_BACKBUFFERCOUNT | DDSD_CAPS;
desc.dwBackBufferCount = 1;
desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP |
DDSCAPS_COMPLEX;
if(FAILED(lpDD->CreateSurface(&desc, &primsurf, NULL)))
MessageBox(hWnd, "Impossible de créer la surface primaire.",
"Erreur", MB_OK);
|