bonjour
est ce possible d'encapsuler un WndMainProc, cest a dire avoir un truc du genre :
LRESULT CALLBACK MyClass::WndMainProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
?
merci
bonjour
est ce possible d'encapsuler un WndMainProc, cest a dire avoir un truc du genre :
LRESULT CALLBACK MyClass::WndMainProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
?
merci
Si elle est statique ça ne pose aucun problème.
Après si tu as une classe qui représente une fenêtre, et que tu veux une technique pour dispatcher les messages vers une fonction membre spécifique de la bonne instance, il y a aussi moyen (avec un peu de bidouille).
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
ok
effectivement, j'ai une classe qui représente une fenetre et mon pb est que si "LRESULT CALLBACK MyClass::WndMainProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) ,
est static alors elle ne peut pas accéder aux membres non static (et privé) de MyClass
cest là quentre en jeu une bidouille mais je ne vois pas laquelle
merci
Tu passes un pointeur vers ton instance (this) en tant que dernier paramètre de Createwindow, afin de la récupérer plus tard.
Ensuite il faut intercepter l'évènement WM_CREATE, récupérer l'instance de la fenêtre et l'associer au HWND d'une manière ou d'une autre. Une méthode couramment utilisée est de la stocker dans les user data :
Ensuite lorsque tu interceptes un message dans ta callback globale, tu le dispatches à l'instance de cette manière :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 if (Message == WM_CREATE) { long This = reinterpret_cast<long>(reinterpret_cast<CREATESTRUCT*>(LParam)->lpCreateParams); SetWindowLongPtr(Handle, GWLP_USERDATA, This); }
Il y a aussi une méthode qui consiste à associer le HWND et l'instance dans une table globale juste après CreateWindow, mais avec ça tu perds tous les messages qui interviennent entre WM_CREATE et la fin de l'appel à CreateWindow.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 MyClass* Window = reinterpret_cast<MyClass*>(GetWindowLongPtr(Handle, GWLP_USERDATA)); Window->OnMessage(Message, Lparam, Wparam);
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
ca donne qqch comme ca ?:
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 LRESULT CALLBACK WCapturer::WndMainProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { if (message == WM_CREATE) { long This = reinterpret_cast<long>(reinterpret_cast<CREATESTRUCT*>(lParam)->lpCreateParams); SetWindowLongPtr(hwnd, GWLP_USERDATA, This); } else { WCapturer* wcapturer = reinterpret_cast<WCapturer*>(GetWindowLongPtr(hwnd, GWLP_USERDATA)); switch (message) { case WM_SIZE: wcapturer->ResizeVideoWindow(); break; case WM_CLOSE: wcapturer->hideWindow() ; break; case WM_DESTROY: PostQuitMessage(0); return 0; } } return DefWindowProc (hwnd , message, wParam, lParam); }
Partager