J'ai un problème sur :
if(!ReleaseDC(hWnd,hDC))
qui provoque l'appel de :
Message("Error!", "Release device context failed.");
Dans la fermeture de la fenêtre ("bool KillGLWindow()").
Le programme suivant semble t'il bon ?
====================================
Fermeture de la fenêtre
====================================
// Properly kill the window.
bool KillGLWindow()
{
if(FullScreen) // Are we in fullscreen mode ?
{
ChangeDisplaySettings(NULL,0); // If so switch back to the desktop.
ShowCursor(TRUE); // Show mouse pointer.
}
if(hRC) // Do we have a rendering context ?
{
if(!wglMakeCurrent(NULL,NULL)) // Are we able to release the DC and RC
contexts ?
{
Message("Error!", "Release of DC and RC failed.");
return FALSE;
}
if(!wglDeleteContext(hRC)) // Are we able to delete the RC ?
{
Message("Error!", "Release rendering context failed.");
return FALSE;
}
hRC=NULL; // Set RC to NULL.
}
if(hDC) // Are we able to release the DC.
{
if(!ReleaseDC(hWnd,hDC))
{
Message("Error!", "Release device context failed.");
hDC=NULL; // Set DC to NULL.
return FALSE;
}
}
if(hWnd) // Are we able to destroy the window ?
{
if(!DestroyWindow(hWnd))
{
Message("Error!", "Could not release hWnd.");
hWnd=NULL; // Set hWnd to NULL.
return FALSE;
}
}
if(!UnregisterClass("OpenGLWindow",hInstance)) // Are we able to
unregister class.
{
Message("Error!", "Could not unregister class.");
hInstance=NULL; // Set hInstance to NULL.
return FALSE;
}
return TRUE; // Ok.
}
====================================
Creation de la fenêtre (j'enlève tout ce qui ne touche pas à "hDC")
====================================
CreateGlWindow()
{
// ...j'élague...
if(!(hDC=GetDC(hWnd))) // Did we get a device context ?
{
Message("Error!", "Can't create a GL device context.");
return FALSE; // Return FALSE.
}
if(!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Did windows find a
matching pixel format ?
{
Message("Error!", "Can't find a suitable PixelFormat.");
return FALSE; // Return FALSE.
}
if(!SetPixelFormat(hDC,PixelFormat,&pfd)) // Are we able to set the pixel
format ?
{
Message("Error!", "Can't set the PixelFormat.");
return FALSE; // Return FALSE.
}
if(!(hRC=wglCreateContext(hDC))) // Are we able to get a rendering
context ?
{
Message("Error!", "Can't create a GL rendering context.");
return FALSE; // Return FALSE.
}
if(!wglMakeCurrent(hDC,hRC)) // Try to activate the rendering context.
{
Message("Error!", "Can't activate the GL rendering context.");
return FALSE; // Return FALSE.
}
// ...j'élague...
}
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Arnold McDonald \(AMcD\)
Frédéri MIAILLE wrote:
J'ai un problème sur :
D'abord, ton code est un peu un fouillis. Autant les commentaires utiles aident, autant quand ils ne servent pas à grand chose, ça n'améliore pas la lecture du code ! Avis perso, il faut mieux écrire (simple exemple) :
if ( TRUE == FullScreen ) que :
if ( FullScreen ) // Are we in fullscreen mode ?
Sinon, pour ton problème,
if(hDC) // Are we able to release the DC. { if(!ReleaseDC(hWnd,hDC)) { Message("Error!", "Release device context failed."); hDC=NULL; // Set DC to NULL. return FALSE; } }
Le tout est de savoir d'où provient ton DC. Crée avec CreateDC() ou obtenu via GetDC() ? ReleaseDC() ne fonctionne qu'avec un DC obtenu via GetDC().
-- AMcD
http://arnold.mcdonald.free.fr/
Frédéri MIAILLE wrote:
J'ai un problème sur :
D'abord, ton code est un peu un fouillis. Autant les commentaires utiles
aident, autant quand ils ne servent pas à grand chose, ça n'améliore pas la
lecture du code ! Avis perso, il faut mieux écrire (simple exemple) :
if ( TRUE == FullScreen ) que :
if ( FullScreen ) // Are we in fullscreen mode ?
Sinon, pour ton problème,
if(hDC) // Are we able to release the DC.
{
if(!ReleaseDC(hWnd,hDC))
{
Message("Error!", "Release device context failed.");
hDC=NULL; // Set DC to NULL.
return FALSE;
}
}
Le tout est de savoir d'où provient ton DC. Crée avec CreateDC() ou obtenu
via GetDC() ? ReleaseDC() ne fonctionne qu'avec un DC obtenu via GetDC().
D'abord, ton code est un peu un fouillis. Autant les commentaires utiles aident, autant quand ils ne servent pas à grand chose, ça n'améliore pas la lecture du code ! Avis perso, il faut mieux écrire (simple exemple) :
if ( TRUE == FullScreen ) que :
if ( FullScreen ) // Are we in fullscreen mode ?
Sinon, pour ton problème,
if(hDC) // Are we able to release the DC. { if(!ReleaseDC(hWnd,hDC)) { Message("Error!", "Release device context failed."); hDC=NULL; // Set DC to NULL. return FALSE; } }
Le tout est de savoir d'où provient ton DC. Crée avec CreateDC() ou obtenu via GetDC() ? ReleaseDC() ne fonctionne qu'avec un DC obtenu via GetDC().
-- AMcD
http://arnold.mcdonald.free.fr/
Frédéri MIAILLE
Ok, la cause était ailleurs que dans le code que j'avais donné :
Dans :
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { // blabla ... case WM_CLOSE: PostQuitMessage(0); break; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } je renvoie dans tous les cas la valeur de retour de DefWindowProc(). Ce qui est foireux car ça doit inplicitement détruire la fenêtre et libérer le hDC.
Or avec : LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { // blabla... case WM_CLOSE: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); break; } return 0; } Dans ce cas, la fenêtre n'est pas détruite et le hDC non libéré ce qui me laisse la possibilité de le faire moi même. Serait-il possible de savoir pourquoi ?
Ok, la cause était ailleurs que dans le code que j'avais donné :
Dans :
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
// blabla ...
case WM_CLOSE:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
je renvoie dans tous les cas la valeur de retour de DefWindowProc(). Ce qui
est foireux car ça doit inplicitement détruire la fenêtre et libérer le hDC.
Or avec :
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
// blabla...
case WM_CLOSE:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
break;
}
return 0;
}
Dans ce cas, la fenêtre n'est pas détruite et le hDC non libéré ce qui me
laisse la possibilité de le faire moi même.
Serait-il possible de savoir pourquoi ?
Ok, la cause était ailleurs que dans le code que j'avais donné :
Dans :
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { // blabla ... case WM_CLOSE: PostQuitMessage(0); break; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } je renvoie dans tous les cas la valeur de retour de DefWindowProc(). Ce qui est foireux car ça doit inplicitement détruire la fenêtre et libérer le hDC.
Or avec : LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { // blabla... case WM_CLOSE: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); break; } return 0; } Dans ce cas, la fenêtre n'est pas détruite et le hDC non libéré ce qui me laisse la possibilité de le faire moi même. Serait-il possible de savoir pourquoi ?