[WIN32] Explication sur les procédures des fenêtres
Bonjour,
Je cherche à créer une bibliothèque très basique (pas de contrôles, widgets, ...) pour une implémentation d'OpenGL. Mon implémentation pour X.org est terminé mais j'ai du mal avec Win32.
Bien que Win32 aide en pas mal de chose comparé à Xlib, s'il y a bien quelque chose que je comprend pas c'est au niveau des évènements. J'ai eu beau lire la doc, mais il y a quelque chose de flou. En particulier que se passe-t-il une fois que la procédure de la fenêtre est appelé avec DispatchMessage().
En fait, j'ai une procédure de fenêtre dans laquelle je met à jour une structure Event. Je test donc dans cette procédure les différents messages. Mais voilà quelques uns de ces messages, par exemple WM_SETFOCUS, WM_KILLFOCUS, WM_MOVING, WM_SIZE, WM_SIZING ne sont pas interprété à l'extérieur de la procédure tandis qu'avec d'autres évènements ça marche niquel comme tous ceux de la souris. La seule raison que je vois, c'est que ma structure est modifiée entre la procédure de la fenêtre et la fin du DispatchMessage.
Je suis donc dans l'incompréhension et je sais que je ne pourrais pas comprendre ce qui se passe par moi-même.
Voici mon code, sa illustrera peut-être mieux au problème auquel je suis confronté :
Code:
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
| LRESULT CALLBACK Win32Window::windowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
default:
s_event.type = 0;
return DefWindowProc(hwnd, message, wParam, lParam);
/////////////////////////////// MOUSE MESSAGE //////////////////////////////
case WM_MOUSEMOVE: //Fonctionne
s_event.type = MouseMotionEvent;
s_event.events.mouseMotion.posX = LOWORD(lParam);
s_event.events.mouseMotion.posY = HIWORD(lParam);
s_mouseLeaveEvent.hwndTrack = hwnd;
TrackMouseEvent(&s_mouseLeaveEvent);
return 0;
//etc...
/////////////////////////////// FOCUS MESSAGE //////////////////////////////
case WM_SETFOCUS: //Fonctionne pas
s_event.type = FocusInWindowEvent;
return 0;
case WM_KILLFOCUS: //Fonctionne pas
s_event.type = FocusOutWindowEvent;
return 0;
}
bool Win32Window::checkEvent()
{
static MSG message;
if(PeekMessage(&message, m_windowHandle, 0, 0, PM_REMOVE))
{
TranslateMessage(&message);
DispatchMessage(&message);
if(s_event.type != 0)
return true;
}
return false;
} |
Donc j'utilise checkEvent() dans mon main pour mettre à jour ma structure statique s_event. Mon main utilise un pointeur sur cette structure.
main.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| if(myWindow.checkEvent())
{
switch(myEvent->type)
{
case MouseMotionEvent: //Fonctionne
Logger::logInfo()("Cursor position(%u,%u)",
myEvent->events.mouseMotion.posX,
myEvent->events.mouseMotion.posY);
break;
case FocusInWindowEvent: //Fonctionne pas
Logger::logInfo()("The window has the focus");
break;
case FocusOutWindowEvent: //Fonctionne pas
Logger::logInfo()("The window has not the focus");
break;
}
} |
Voici, la sortie en sautant de fenêtre en fenêtre :
Citation:
WM_SETFOCUS
WM_KILLFOCUS
WM_SETFOCUS
WM_KILLFOCUS
Cursor position(11,0)
Cursor position(12,0)
Cursor position(13,0)
Cursor position(14,0)
Cursor position(15,0)
WM_SETFOCUS
WM_KILLFOCUS
WM_SETFOCUS
Cursor position(25,0)
Cursor position(26,0)
Cursor position(26,1)
Cursor position(27,1)
Cursor position(27,2)
Cursor position(28,2)
Cursor position(28,3)
Cursor position(28,4)
Cursor position(29,4)
Cursor position(30,4)
Cursor position(30,2)
Cursor position(30,1)
Cursor position(30,0)
Cursor position(31,0)
WM_KILLFOCUS
Il manque peut-être des morceaux de codes mais j'ai essayé de réduire au strict minimum pour bien cerner le problème. Nh'ésitez pas à demander si vous avez l'impression qu'il manque quelque chose.
Pouvez-vous m'aider S.V.P. ?
Merci d'avance...