IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

[DX 9][C++]Plein ecran + carte graphique


Sujet :

DirectX

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Points : 121
    Points
    121
    Par défaut [DX 9][C++]Plein ecran + carte graphique
    salut !

    Je commence a utiliser le DX9 pour faire un ptit jeu histoire de manier l'API DX9.... oui oui, je vais aller m'acheter un bouquin dessus

    mais cependant, je voudrais savoir si j'ai atteint mon but d'aujourd'hui c-a-d le faire fonctionner en Fullscreen et avec le support de la carte graphique. mes question sont donc Fonctionne-t-il en plein ecran ? utilise-t-il la carte graphique ?

    bien evidemment, voici le code:
    (sachez que je vous montre ici les méthodes d'une classe, puisque j'organise/simplifie ma programmation en classe pour gere plus aisement les différentes actions dont j'ai besoin avec DX9)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    #include <ddraw.h> 
    #include "InitClass.h"
     
    /*Ctor qui créér une fenetre*/
    TInitD3DEnv::TInitD3DEnv(HINSTANCE hInst,WNDPROC D3DWinProc,HWND idHWnd ,char *ClassName,char* Title,int Width,int Height,bool FullScreen)
    {
     WNDCLASSEX wc;    
     
     _Full = FullScreen;
     
     Err = 0;
     XReso = 1024;
     YReso = 768;
     Full_Bits = 32;
     
     wc.hInstance = hInst;
     wc.lpszClassName = ClassName;
     wc.lpfnWndProc = D3DWinProc;      
     wc.style = CS_OWNDC;                
     wc.cbSize = sizeof(WNDCLASSEX);
     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
     wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
     wc.lpszMenuName = NULL;
     wc.cbClsExtra = 0;                      
     wc.cbWndExtra = 0;                     
     wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
     
     if(!RegisterClassEx(&wc)) Err = 1;
     
     if(_Full)
     {
      idHWnd = CreateWindowEx(
               0,                   /* Extended possibilites for variation */
               ClassName,         /* Classname */
               Title,         /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               0,       
               0,       
               GetSystemMetrics(SM_CXSCREEN),                 /* The programs width */
               GetSystemMetrics(SM_CYSCREEN),                 /* and height in pixels */
               NULL,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hInst,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );
     }
     else
     {
      idHWnd = CreateWindowEx(
               0,                   /* Extended possibilites for variation */
               ClassName,         /* Classname */
               Title,         /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               (GetSystemMetrics(SM_CYSCREEN)-Height)/2,       /* Windows decides the position */
               (GetSystemMetrics(SM_CXSCREEN)-Width)/2,       /* where the window ends up on the screen */
               Width,                 /* The programs width */
               Height,                 /* and height in pixels */
               NULL,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hInst,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );
     }
     
     hWnd = idHWnd;
     
     if (idHWnd == NULL)
    	 Err = 0;
     else
     { 
      ShowWindow(idHWnd, 1);
      InitDD();
     }
     
    }
     
     
    TInitD3DEnv::~TInitD3DEnv()
    {
     lpDD->Release();
     lpDD = NULL;
    }
     
     
    int TInitD3DEnv::GetLastErr()
    {
     return Err;
    }
     
    /*Change la résolution d'affichage*/
    void TInitD3DEnv::SetDisplayRes(int XRes,int YRes, int bits)
    {
      ddrval=lpDD->SetDisplayMode(XRes, YRes, bits);
     if(ddrval!=DD_OK)
     {
      lpDD->Release();
      Err = 1;
     } 
    }
     
    /*renvoie le mode d'affichage actual (fullscreen ou window) afin de "switcher" entre les deux sur demande de l'user*/
    int TInitD3DEnv::GetDisplayMode()
    {
     return mod;
    }
     
    /*Passe du mode fenétré en plein ecran*/
    void TInitD3DEnv::SwitchWindowedToFull()
    {
     ddrval=lpDD->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
     
     if(ddrval!=DD_OK)
     {
      lpDD->Release();
      Err = 1;
     }
     
     mod = dmFULLSCREEN;
    }
     
    /*passe du mode Plein ecran au fenetré*/
    void TInitD3DEnv::SwitchFullToWindowed()
    {
     ddrval=lpDD->SetCooperativeLevel(hWnd, DDSCL_NORMAL) ;
     
     if(ddrval!=DD_OK)
     {
      lpDD->Release();
      Err = 1;
     }
     
     mod = dmWINDOWED;
    }
     
     
    void TInitD3DEnv::InitDD()
    {
     ddrval=DirectDrawCreate(NULL, &lpDD, NULL);
     
     if(_Full)
     {
      SwitchWindowedToFull();
      SetDisplayRes(XReso,YReso,Full_Bits);
     }
    }
    De plus, j'ajoute quelques questions :
    -Je vous pose la question, mais jai l'impression que théoriquement, je sus en plein ecran. Cependant, pourquoi ai-je toujours le titre de la fenetre + les bordures qui sont affichées ?
    -Des erreurs en vues ? optimisation possible ?


    merci.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    j'ai pas tout lu, j'ai plus trtop le temps. Mais si les bordures sont encore affichées, ca veut dire que le HWND passé est celui de la fenetrre que tu vois. Ta denetre continue d'etre affichée en plein ecran. En général il me semble que l'on modifie la taille de la fenetre pour qu'elle deviene (0,0,0,0). On sauvegarde bien entendu les coordonnées avant, et quand on switch en mode fenetre on retablit les anciennes coordonnées.

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ta denetre continue d'etre affichée en plein ecran
    A partir du moment ou tu es en plein ecran, tu ne vois plus la fenetre, meme si c'est son HWND qui est passé

    En général il me semble que l'on modifie la taille de la fenetre pour qu'elle deviene (0,0,0,0)
    Ca ça sert à rien

    Donc ce qu'il te manque pour vraiment avoir un affichage plein écran c'est (a moins que je l'ai loupé dans le code) un frontbuffer et un backbuffer. Ensuite pour voir un ecran noir (le truc de base) tu fais BackBuffer->BlitColorFill(...) (si mes souvenirs sont bons), puis tu fais un FrontBuffer->Flip(...) tout a la fin.
    Evidemment il faut aussi que tu crées une boucle infinie pour l'affichage.

    PS : tu travailles avec DDraw là ?? si c'est le cas c'est pas Dx9

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/02/2009, 12h57
  2. Carte graphique pour deux ecrans
    Par Louis Griffont dans le forum Composants
    Réponses: 8
    Dernier message: 23/09/2008, 19h17
  3. Réponses: 1
    Dernier message: 02/07/2007, 19h37
  4. Ecran de veille, acces carte graphique
    Par titoine1978 dans le forum DirectX
    Réponses: 4
    Dernier message: 14/03/2006, 17h56
  5. [Carte Graphique] Ecran Noir avec une Asus Extreme AX800/XL
    Par slowpoke dans le forum Composants
    Réponses: 2
    Dernier message: 06/10/2005, 19h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo