OVH Cloud OVH Cloud

Y a t'il une erreur ?

2 réponses
Avatar
Frédéri MIAILLE
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...
}

====================================
Main.cpp
====================================

if(!CreateGLWindow())
{
KillGLWindow();
return 0;
}

//// MAIN LOOP ////
EXIT_ASKED=false;
while(!EXIT_ASKED)
{
if(PeekMessage(&WindowMessage, 0, 0, NULL, PM_REMOVE))
{
if(WindowMessage.message == WM_QUIT) // If the message want to
quit.
{
EXIT_ASKED=true;
}
else
{
TranslateMessage(&WindowMessage); // Find out what the
message does.
DispatchMessage(&WindowMessage); // Execute the message.
}
}
else
{

// Scene display.
// ... Pas d'utilisation de hDC.
// Swap buffers (Double buffering).
SwapBuffers(hDC);
}
}

KillGLWindow();

--
Frédéri MIAILLE
fr.comp.lang.c
fr.comp.lang.c++
fr.comp.graphisme.programmation
fr.comp.os.ms-windows.programmation

2 réponses

Avatar
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/
Avatar
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 ?

Merci.

--
Frédéri MIAILLE
fr.comp.lang.c
fr.comp.lang.c++
fr.comp.os.ms-windows.programmation
fr.comp.graphisme.programmation