|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() Inscription : février 2008 Messages : 70 ![]() |
Bonjours a tous.
Mon message concerne l'API Win32. J'aurai voulu savoir si il etait possible de gerer les messages(WM_COMMAND, WM_USER, ect...) sans avoir a utiliser du tout la procedure de fenetre "LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)" ? Le tout en C/C++ evidement. Je ne parle pas de MFC, DotNet, ect... Merci ps : je precise que je connais deja un peu, mais pas beaucoup, cette API ayant realiser avec il y a quelque temps un petit moteur de jeu 2D et quelques autres petites applications. Il me semble qu'avec les MFC, que je ne connais pas, la procedure de fenetre ne soit pas utilisee. Savez vous comment cela fonctionne en interne ? |
|
|
00
|
|
|
#2 |
|
Membre confirmé
![]() Inscription : juin 2002 Messages : 113 ![]() |
Bonjour.
L'API Win32 offre deux fonctions de base pour recevoir les messages : GetMessage et PeekMessage. La première attend qu'un message soit disponible avant de revenir, la seconde revient tout de suite même s'il n' y a pas de message disponible. Voir la MSDN à leur sujet. |
|
|
10
|
|
|
#3 |
|
Nouveau Membre du Club
![]() Inscription : février 2008 Messages : 70 ![]() |
Merci pour ta reponse, mais ca n'etait pas ma question. Je connais GetMessage() et PeekMessage().
Je demandais si il etait possible de se passer de la procedure de fenetre LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM) pour le traitement des message WM_... , est-ce qu'il existe des fonctions dans l'API qui permet le traitement des messages d'une maniere differente ? |
|
|
00
|
|
|
#4 |
![]() ![]() |
GetMessage et PeekMessage piquent le message actuellement en tête de file dans la queue de messages du thread courant. On en fait ensuite ce qu'il nous plaît. Cela veut très bien dire qu'avoir une WndProc n'est pas intrinsèquement indispensable dans une application Windows. Cependant, tous les messages ne passent pas obligatoirement par la queue des messages. Au contraire, la majorité des messages sont directement envoyés vers les fenêtres, c'est-à-dire directement vers les procédures de fenêtre. Généralement, Windows met dans la queue des messages les événements liés aux entrées de l'utilisateur (les keydown, mousemove, etc.) et tout ce qu'ils provoquent (WM_CHAR, WM_COMMAND, etc.), ainsi que certains messages non prioritaires (WM_TIMER, WM_PAINT, etc.). Les autres vont directement chez leur destinataire. Cette différence se voit également au niveaux de certaines APIs et non seulement au niveau des notifications. Par exemple, SendMessage appelle directement la procédure de fenêtre alors que PostMessage place un message dans la queue des messages. La procédure de fenêtre est donc finalement indispensable, en pratique
|
|
|
10
|
|
|
#5 |
|
Nouveau Membre du Club
![]() Inscription : février 2008 Messages : 70 ![]() |
Ok, merci. Je me doutais bien qu'elle etait indispensable...
Je crois avoir trouve la solution a l'aide d'un container de struct contenant, entre autre, des pointeurs de fonction, et l'identite du message, et ce container sera place dans la procedure de fenetre et je le remplirai a l'utilisation du framework et non pendant sa compilation... Je ne sais pas si c'est clair.. Je vais voir ce que cela donne. Merci encore pour vos reponses :-) |
|
|
00
|
|
|
#6 |
![]() ![]() |
Il y a quelques années je me suis amusé à faire un truc de ce type, et je m'en suis même longtemps servi. Les sources se trouvent sur le forum C++ : Encapsuler l'API Windows. Ce code a été écrit alors que je débutais en C++ donc ne sois pas surpris de voir des horreurs comme une struct dans une classe là où on aurait pu utiliser l'héritage, etc. A part ce détail, il aura au moins le mérite de mettre en évidence l'architecture des frameworks ou des libs telles que la VCL ou les MFC
|
|
|
10
|
|
|
#7 |
|
Nouveau Membre du Club
![]() Inscription : février 2008 Messages : 70 ![]() |
Merci, je vais y jeter un œil :-)
|
|
|
00
|
|
|
#8 |
|
Expert Confirmé Sénior
![]() |
Attention, le prototype de la DialogProc est obsolète; il faut retourner un INT_PTR de nos jours (à cause des messages WM_CTLCOLORxxx)
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant. "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?" Apparently everyone. -- Raymond Chen. Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen. |
|
|
00
|
|
|
#9 | |
|
Nouveau Membre du Club
![]() Inscription : février 2008 Messages : 70 ![]() |
Citation:
Sinon, sauriez vous combien il y a de WM_... en tout ? La question peut paraitre saugrenue, mais j'ai vraiment besoin de le savoir. Je n'ai pas trouve la reponse sur msdn, ni ailleurs sur le web... Merci. |
|
|
|
00
|
|
|
#10 | ||||||
|
Nouveau Membre du Club
![]() Inscription : février 2008 Messages : 70 ![]() |
Voila ma solution afin de gerer les messages sans avoir a remplir la procedure de fenetre lorsque j'utilise mon framework. C'est pour l'instant tres basique, je voulais juste poser les bases.
Dites moi ce que vous en pensez, et si vous auriez fais autrement,dites moi comment vous auriez fait. Code :
Code :
Code :
|
||||||
|
|
00
|
|
|
#11 |
|
Expert Confirmé Sénior
![]() |
J'ai l'impression qu'un tel code donne des événements communs à tous les types de fenêtre.
Et en plus, ça remplit le tableau en run-time, alors qu'il peut être défini en compile-time comme le fait MFC (mais MFC utilise un tableau "Message Map" par classe de fenêtre). Aussi, je ne suis pas sûr qu'une recherche linéaire soit la meilleure idée pour ça. Vu que le tableau n'est modifié qu'au début et qu'il est consulté très souvent, tu devrais au moins en faire un tableau trié et faire une recherche dichotomique dessus (avec bsearch() en C ou std::binary_search<>() en C++). Edit: J'ai du mal à voir l'utilité du nom, aussi. Surtout que tu y mets une chaîne littérale et que tu sembles faire un delete dessus dans le destructeur...
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant. "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?" Apparently everyone. -- Raymond Chen. Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen. |
|
|
00
|
|
|
#12 |
|
Nouveau Membre du Club
![]() Inscription : février 2008 Messages : 70 ![]() |
Merci pour ta reponse. Pour le run time tu as raison. Sinon, pour le reste, j'ai bien dit que ce n'etait qu'une base, je vais bien evidement l'optimiser. En tous les cas, merci pour les pistes :-)
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com