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 :

Perte du focus


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Par défaut Perte du focus
    Bonjour,

    Je m'attaque au problème de la perte du focus dans une de nos application tournant sous DirectX. J'ai donc cherché sur Internet et dans votre FAQ.

    Vous dites, en gros, que lorsque l'application n'a plus le focus, TestCooperativeLevel renvoie D3DERR_DEVICELOST. Puis lorsqu'il est possible de le récupérer (donc, je pense, lorsqu'on redemande le focus), elle renvoie D3DERR_DEVICENOTRESET. Là, on peut alors effectuer les différentes manipulations.

    Ma fonction Update ressemble à cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    bool Update()
    {
     If( CheckDevice ) 
      { Device->Begin()
       ...
       Device->End()
    }
    }
    CheckDevice effectuant pour l'instant un TestCooperativeLevel
    Je rencontre un problème : Lorsque je fais alt+tab, je perd le focus. Mais lorsque je reviens sur l'application, je n'obtiens jamais D3DERR_DEVICENOTRESET. A quoi est-ce dû ? Comment obtenir cet état ?


    Merci

    Cordialement

  2. #2
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    A priori je dirais que ce n'est pas normal.

    Tu as commencé par ça ?
    http://jeux.developpez.com/faq/direc...LEMES_probleme

    Tu peux aussi nous montrer le code de CheckDevice, on ne sait jamais.

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Par défaut
    J'ai fait déjà tout ce qui est suggéré sur cette page, sauf le debugage via directx : je n'ai pas de tel icône dans le panneau de configuration.

    Le code de CheckDevice :
    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
     
    bool CheckDevice()
    {
    	HRESULT l_DeviceState = g_Device->TestCooperativeLevel();
     
    	if( l_DeviceState == D3DERR_DEVICELOST )
    		g_CLogM->AddEvent("Device LOST");
    	else if( l_DeviceState == D3DERR_DEVICENOTRESET )
    		g_CLogM->AddEvent("Device NOT RESET");
    	else if( l_DeviceState == D3D_OK )
    		g_CLogM->AddEvent("Device OK");
     
    	return true;
     
    }
    Comme tu vois, c'est élémentaire pour l'instant. De plus, le cas D3D_OK est seulement là pour le débugage...

    Enfin, ma fonction update peut vous être utile :
    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
     
    bool Update()
    {
    	static float CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);		//chrono
     
    	if( DXUtil_Timer(TIMER_GETABSOLUTETIME)-CurrentTime>0.015f )//64 fps ( 1/fps. calculé par 1/66 mais a cause des arrondis on a 64fps)
    	{
    		srand((unsigned int)timeGetTime());		//On réinitialise le hasard.
     
    		//-----------Préparation des variables d'affichage------
    		static float Timer = 0.0f;
    		static float dwFrames = 0.0f;
    		CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);
     
     
    		//-----------Préparation du device pour l'affichage-----
    		if( CheckDevice() != D3D_OK )
    		{
    			DXUtil_Timer(TIMER_STOP);
    			Sleep(100);
    		}
    		else
    		{
    			if (!g_CLM->Is_Paused())
    				DXUtil_Timer(TIMER_START);
     
    			g_Device->Clear(NULL,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
    			g_Device->BeginScene();
     
    			//-----------Acquisition des données périphériques----------
    			g_CIM->ActualiseState();
    			g_SA->m_Time = DXUtil_Timer(TIMER_GETAPPTIME);
    			g_SA->m_RealTime = CurrentTime;
    			g_SA->m_LastChar = g_CIM->GetInputChar();
    			g_SA->m_LeftButton = g_CIM->GetButtonsState(1);
    			g_SA->m_RightButton = g_CIM->GetButtonsState(2);
    			g_SA->m_x = g_CIM->GetBattleX();
    			g_SA->m_y = g_CIM->GetBattleY();
     
    			//------------Dessin et calcul d'une frame-------------
    			g_Cadre->Draw();
    			g_CLM->RenderFrame();
    			if (!g_CMM->RenderFrame() )
    				return false;
     
    			//------------Calcul des FPS
    			if( g_COPPtr->GetFps() )
    			{
    				dwFrames++;
    				PrintText(g_FPS,0,0,D3DCOLOR_ARGB(255,0,255,64),WBF_IMPACT);
    			}
     
    			g_Device->EndScene();
    			g_Device->Present(NULL,NULL,NULL,NULL);
    		}
    		//------------Libère les textures inactives-----------
    		if( CurrentTime - Timer > 1.0f )
    		{
    			g_CTM->Head_Reset();
     
    			for(int i=0; i<g_ListSize ; i++)
    			{
    				STexture* l_TexTmp = g_CTM->Head_GetPointer();
     
    				if( l_TexTmp && l_TexTmp->m_Loaded )	//Si texture chargée => vérifie temps
    					if( CurrentTime - l_TexTmp->m_LastTimeUsed > 7.0f ) //7s
    						g_CTM->Head_UnloadTexture();
     
    				g_CTM->Head_Next();
    			}
    			//FPS
    			sprintf(g_FPS,"%.2f",dwFrames / (CurrentTime - Timer));
    			dwFrames = 0;
    			Timer = CurrentTime;
    		}
     
    	}
    	return true;
    }
    Peut être CheckDevice est-il à un mauvais endroit ?

    Merci

    Cordialement

  4. #4
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    if( CheckDevice() != D3D_OK )
    CheckDevice() renvoie un booléen.

    Mais bon je suppose que tu devrais tout de même voir "Device NOT RESET" dans ton log.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    J'ai fait déjà tout ce qui est suggéré sur cette page, sauf le debugage via directx : je n'ai pas de tel icône dans le panneau de configuration.
    Peut-être du à une mauvaise installation du SDK? Sinon le "DirectX Control Panel" est accessible via "SDK\Tools\Bin\x86(ou autre)\dxcpl.exe" .

    Sinon, CheckDevice() ne renvoie jamais false...

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Par défaut
    Toutes mes excuses, il y a eu un conflit de version.

    CheckDevice est de type HRESULT :
    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
     
    HRESULT CheckDevice()
    {
    	HRESULT l_DeviceState = g_Device->TestCooperativeLevel();
     
    	if( l_DeviceState == D3DERR_DEVICELOST )
    		g_CLogM->AddEvent("Device LOST");
    	else if( l_DeviceState == D3DERR_DEVICENOTRESET )
    		g_CLogM->AddEvent("Device NOT RESET");
    	else if( l_DeviceState == D3D_OK )
    		g_CLogM->AddEvent("Device OK");
     
    	return l_DeviceState;
     
    }
    J'essaie de suite ce que ca donne avec dxcpl.exe

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Detecter la perte de focus
    Par iowa dans le forum Windows Forms
    Réponses: 10
    Dernier message: 15/03/2006, 15h03
  2. Réponses: 9
    Dernier message: 02/02/2006, 16h46
  3. Comment détecter la perte de focus d'une fenêtre
    Par Leviathan_72 dans le forum Windows
    Réponses: 5
    Dernier message: 31/12/2005, 01h22
  4. excel -> test lors de la perte du focus d'une cellule
    Par greg778 dans le forum Macros et VBA Excel
    Réponses: 24
    Dernier message: 26/09/2005, 18h26
  5. [VB.NET] Perte de focus entre deux form
    Par toniolol dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/07/2005, 09h00

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