Boite de dialogue et WM_KEYDOWN

Résolu
solidsnake88 Messages postés 27 Date d'inscription jeudi 15 septembre 2005 Statut Membre Dernière intervention 13 novembre 2006 - 26 oct. 2006 à 21:17
solidsnake88 Messages postés 27 Date d'inscription jeudi 15 septembre 2005 Statut Membre Dernière intervention 13 novembre 2006 - 29 oct. 2006 à 14:48
Bonjour à tous,




juste une question a propos de l'interception de WM_KEYDOWN par une boite de dialogue qui possede des controles a l'interieur. J'ai vu l'anbondante litterature qu'il y a dessus sur ccpFrance mais pas de reponse claire. Normalement le focus va sur le premier bouton. Donc il recupere tout les evenement et je ne peux pas les trouver dans ma fenetre. Mais c'est precisement ce que je voudrais faire. Je voudrais recuperer tout les KEYDOWN qui arrive sur ma fenetre en entier. J'essaye de tout faire avec le fabuleux visual studio .NET pour faire style que je sais me servir de cette belle interface graphique mais si ca continue je retourne sous GTK. Alors si vous ave une solution... ca serais bien d'exploiter cette belle interface! Comment le faire avec les bouton de visuals, a la souris comme les jeunes. Je vous serais tres reconnaissant.

Merci encore pour votre aide.

24 réponses

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
29 oct. 2006 à 04:27
Pour moi, ni QT ni GTK. Il n'y a rien de mieux que l'utilisation directe des APIs Windows. Cela permet de faire des applications dont on comprend bien le fonctionnement et dont on maitrise le comportement. Sans parler des performances meilleures.
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 oct. 2006 à 10:07
En effet si l'application n'a pas à être portée sur une autre système, aucun intérêt d'utiliser ces librairies

_____________________________________
Un éditeur de ressources gratuit pour Windows
3
solidsnake88 Messages postés 27 Date d'inscription jeudi 15 septembre 2005 Statut Membre Dernière intervention 13 novembre 2006
26 oct. 2006 à 21:27
Et pour la route,



pensez vous gagner du temps ou de la souplesse en utilisant l'interface visual ou bien vous ecrivez encore vos creations de fenetres et de controles a la main. Parce que je viens de l'algorithmique pure et dure et j'essaye de mettre une interface graphique la dessus parce que c'est moche. Pour moi je dois coder avec les touches du clavier creer tout a la main avec des create mais est-ce que je gagnerais du temps a utiliser visual studio par exemple en creant une fenetre avec la souris. C'est quand meme cool!
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
26 oct. 2006 à 21:33
Salut :

Moi je travaille avec Visual C++ 6.0.
Pour récupérer les messages WM_KEYDOWN tu dois ajouter dans ta classe une méthode "OnKeyDown".

1. Supposons que tu a appelé ton projet "Test".
2. Clic droit sur la classe "CTestDlg".
3. Choisir l'option : "Add Windows Message Handler ...".
4. Chercher le message WM_KEYDOWN dans la liste des messages qui apparaissent WM_*.
5. Finalement, clic sur "Add and Edit"

Bonne chance ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
solidsnake88 Messages postés 27 Date d'inscription jeudi 15 septembre 2005 Statut Membre Dernière intervention 13 novembre 2006
26 oct. 2006 à 21:57
En fait je suis parfaitement d'accord avec toi. Mais apres le probleme c'est que comme j'ai des boutons ils recuperent automatiquement le focus et ma fenetre ne voit pas l'evenemet. Si je fais un spy++ sur ma fenetre aucun evenement arrive. Mais si je fais un spy++ sur mon bouton lui il recoit tout les message. Je cherche en fait comment recuperer les message juste au niveau de la fenetre et pas l'intercepter mais juste le lire.

Et desole c'est pas la bonne section j'ai refait le meme post sous windows.
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
26 oct. 2006 à 22:14
Salut :

Mon ami qaund tu travailles avec les boutons et pour gérer le clic sur ces boutons tu as besoin du message WM_COMMAND non pas du message WM_KEYDOWN.

suivant le LOWORD (wParam) du message WM_COMMAND tu détermine le bouton cliquée.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
27 oct. 2006 à 00:36
Salut,
Je viens de corriger la catégorie de ton message. J'ai aussi supprimé le dernier.
A propos de ta question, il y'a deux solutions:
1- Sous-classer tous tes controles. Une seule fonction de sous-classement suffit. Dans cette fonction, le message WM_KEYDOWN sera intercepté puis renvoyé à la procédure de la boite de dialogue avec SenMessage() ou PostMessage().
2- Faire un hook comme celui proposé par BruNews:
http://www.cppfrance.com/codes/HOOK-ENTER-SUR-DIALOGBOX-WIN32_11007.aspx

Pour la création des fenêtre et controles, personnellement je préfère utiliser CreateWindow(). Il est vrai que l'éditeur visuel est plus rapide mais je préfère mieux maitriser mon interface graphique avec la précision que je veux.
0
solidsnake88 Messages postés 27 Date d'inscription jeudi 15 septembre 2005 Statut Membre Dernière intervention 13 novembre 2006
27 oct. 2006 à 00:59
Tres bien alors pour le hook je suis entierement d'accord mais pourrais tu un peu expliciter ta solution numero un. Vraiment elle me plait bien. Et enfin pour ta preference je partage entierement ton avis vraiment tu me conforte dans ma voie. Je prefere maitrise la chose que voir visual qui rajoute des tas de fichier qui a la fin, si dieu le veut, marche correctement. Mes resultats doivent etre absolument fiable et je ne peux me permettre de faire passer mon float a travers une centaine de cast.

Merci en tout cas pour ta reponse claire et concise. Du bon boulot.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
27 oct. 2006 à 02:46
Il faut d'abord déclarer une variable globale de type WNDPROC pour y sauvegarder l'adresse de la procédure originale du controle à sous-classer:
WNDPROC OldProc;
La fonction de sous-classement doit ressembler à ceci:
LRESULT CALLBACK NotreProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{   
    if(message==WM_KEYDOWN)
    {
        SendMessage(GetParent(hwnd),message,wParam,lParam);
        return 0;
    }
   // Appeler la procédure originale:
    return CallWindowProc(OldProc, hwnd, message, wParam, lParam);
}
L'activation de notre fonction de sous-classement se fait juste après la création du controle pendant le traitement de WM_INITDIALOG ou WM_CREATE:
hwndBouton=CreateWindow(......);
OldProc=(WNDPROC)SetWindowLong(hwndBouton,GWL_WNDPROC,(long)NotreProc);
Ainsi, tous les WM_KEYDOWN seront renvoyés à la procédure de la boite ou fenêtre mère.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
27 oct. 2006 à 09:17
Attention, la même WndProc ne peut pas être utilisée pas tous les controles. Il faut un WndProc par type de contrôle, car par exemple un edit et un button n'ont pas le même OldProc. Si tu as plusieurs types de controles, je pense donc que l'autre solution (le hook) est meilleure

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
solidsnake88 Messages postés 27 Date d'inscription jeudi 15 septembre 2005 Statut Membre Dernière intervention 13 novembre 2006
27 oct. 2006 à 10:18
Donc pour le hook, maintenant je vois son utilité. En effet une WndProc par type de controle ca va etre un peu long quoique...



Pour la solution de racpp. Je la testerais ce soir je dois partir au boulot.

Merci encore tout les deux pour des solutions claires et concises comme on en voit peu. Super. Chapeaux bas.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
27 oct. 2006 à 12:21
Salut,
On peut utiliser une seule et même fonction de sous-classement pour tous les types de controles. Pour cela, il suffit d'avoir autant de OldProc qu'il y'a de types. Dans la fonction de sous-classement, on utilisera GetClassName() pour connaitre la classe, donc le type du controle. Le premier paramètre de CallWindowProc() dépendra de ce type. Pour les Boutons ce sera par exemple OldBoutonProc et pour les Edits se sera OldEditProc etc.
0
solidsnake88 Messages postés 27 Date d'inscription jeudi 15 septembre 2005 Statut Membre Dernière intervention 13 novembre 2006
27 oct. 2006 à 13:03
Bien, de toute maniere j'avais l'intention d'adopter ta solution. Le hook ca fait un peu barbare mais ca marche.

Merci a tous.
0
solidsnake88 Messages postés 27 Date d'inscription jeudi 15 septembre 2005 Statut Membre Dernière intervention 13 novembre 2006
27 oct. 2006 à 13:16
Juste une petite question en plus au niveau de l'utilisation de visual.

Pour cree ma editbox je cliaue avec ma gentille souris je fai sun beau rectangle et pof une edit box apparait. Mais elle est visiblement une instance de la classe editbox de base. Je fais alors bouton droit (on dirait la vieille pub avec la grand mere aui clic sur le bouton!!!) et j'ajoute une classe et dans cette classe je fais ce je veux mais rien ne semble relier ma classe avec l'editbox de depart. J'ai beau mettre des messagebox dans le constructeur et dans le autres methodes aucune apparait a l'ecran.

Alors comment lier ma classe a ma petite edit box. Bien sur je pourrais faire un create dans la fenetre mere mais je veux utiliser ce truc 359 dollars.

Merci encore pour vos reponses.
0
solidsnake88 Messages postés 27 Date d'inscription jeudi 15 septembre 2005 Statut Membre Dernière intervention 13 novembre 2006
27 oct. 2006 à 13:28
Il semble que tout soit stocke dans le fichier .rc. Mais comment fait on pour dire qu'un objet de notre dialogbox et du type MonEdit et non pas du type Edit. Voila mon probleme en fait. Et je voudrais le faire sans passer par un create(MonEdit...) mais par cette belle interface graphique.




Merci encore.
0
solidsnake88 Messages postés 27 Date d'inscription jeudi 15 septembre 2005 Statut Membre Dernière intervention 13 novembre 2006
27 oct. 2006 à 13:31
C'est du visual .NET 2003 mais si on peut le fiare avec un on peut le faire avec l'autre. Alors une solution sous n'importe lequel des visual ca serait deja bien. Merciiiiiiiiii.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
27 oct. 2006 à 15:01
racpp> j'aimerais bien voir ta méthode avec des GetClassName. Avec ca tu récupère une chaine de caractères. J'imagine donc que tu aura une table de correspondance entre des char* et des WNDPROC (pour trouver une WNDPROC à partir du nom de la classe). Je pense que c'est assez lourd (ca ralentira même le système, car chaque envoi de message à un controle va générer une recherche). A moins que j'ai mal compris ta solution...

solidsnake88> tu codes en quoi exactement? tu utilises les MFC?

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
solidsnake88 Messages postés 27 Date d'inscription jeudi 15 septembre 2005 Statut Membre Dernière intervention 13 novembre 2006
27 oct. 2006 à 16:27
Oui avec des mfc. Et en fait j'essaye de decouvrir a font comment ca marche donc je teste tout et n'importe quoi. Et quand ca marche pas je cherche pourquoi. C'estle meilleur moyen d'apprendre. Alors oui j'utilise les mfc. Je me suis fais une petite dialogBox et je cherche a faire le maximum avec donc la methode de racpp m'interresse beaucoup surtout si elle t'intrigue.



Sinon tu sais comment attribuer la classe qui derive de Edit a un EditBox???? Style je fais mon clic droit sr la EditBox je fasi ajouter classe et la ca me cree une classe que je modifie a souhait mais visual studio ne le prend pas en compte pour la editbox en cours.

Voila. Et racpp si tu me donner ta methode vraiment ca m'interesse car j'ai eu un peu le meme probleme une fois en design pattern pour la methode qui retrouve toute seule la classe dont elle fait parti sans recherche avec une table. J'hesite a recontacter cet ingenieur car il est occupe et vraiment c'est etrange cette technique. Peu etre que racpp parle de cette methode sans recherche!!! Ou bien est ce une vision de mon esprit!!!!!!!

En tout cas merci a vous deux.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
27 oct. 2006 à 16:36
J'ai une autre solution. Il est possible d'associer une valeur à chaque fenêtre (avec SetWindownLong). Si tu n'utilises pas déja cette valeur, tu peux l'utiliser pour stocker la WndProc par défaut. Tu peux donc alors la retrouver directement avec GetWindowLong, sans avoir à faire de recherche.
Autre chose: je me demande s'il n'y a pas un malentendu sur le terme classe: racpp ne parle pas de classe au sens POO, mais au sens Win32 (on obtient une classe avec RegisterClassEx)
Je ne comprend pas ta question (comment attribuer la classe qui derive de Edit a un EditBox?), tu peux être plus explicite?

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
solidsnake88 Messages postés 27 Date d'inscription jeudi 15 septembre 2005 Statut Membre Dernière intervention 13 novembre 2006
27 oct. 2006 à 17:50
Tout d'abord rectification pour le sens de classe en effet je l'avais vu en POO.









Pour l'explication..


Alors en fait il y a une classe de boite de dialogue CDialog qui contient tout les attributs d'une fenetre. Mais quand on veut en creer une particuliere par exemple une editbox es tu d'accord qu'on derive MonEditBox de DialogBox (MonEditBox: public Dialog).



Donc je cree ma fenetre avec visual. Je fais un beau petit carre gris apres je met une edit box dedans. Comment fais je pour modifier le constructeur de mon edit box qui n'est une edit box et donc une dialogbox speciale? Je pensait qu'en faisant un clic droit et en choisissant ajouter une classe mon editbox serait une instance de la classe que je cree mais non. En fait mon edit box n'utilise pas le constructeur de ma nouvelle classe mais celui de dialog box que bien sur je n'ai pas modifie.

Comment faire alors pour modifier le constructeur de mon edit box?

Voila il est vrai que je m'etait tres mal explique.

Merci encore.
0
Rejoignez-nous