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 cpp : 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
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 cpp : 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
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 :

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...