Problème avec WS_TABSTOP

Résolu
Lord_Patoche Messages postés 196 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 1 mai 2009 - 1 nov. 2004 à 23:19
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 - 3 nov. 2004 à 00:02
Bonjour, je programme une petite appli en C avec l'API Win32 (pas de MFC) et je ne parviens pas à créer des controles pouvant gagner le Focus via la touche TAB. Je créé pourtant tous mes contrôles en leur donnant les propriétés WS_CHILD et WS_TABSTOP, mais rien n'y fait, lorsque j'appuis sur TAB, ma bécane émet un BIP de non fonctionnement.
Merci de m'aider

LaPatoshe

17 réponses

cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
2 nov. 2004 à 00:51
Si tu crées tout à la main via l'API, ta boucle de message doit ressembler à cela :
  while (GetMessage(&Msg, NULL, 0, 0) > 0) {
    if (IsDialogMessage(hWnd, &Msg) == 0) {
      TranslateMessage(&Msg);
      DispatchMessage(&Msg);
    }
  }
IsDialogMessage se charge de gérer TAB et autres touches, comme pour une Dialog.
3
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
2 nov. 2004 à 17:23
Ok je comprenais pas la fonction IsDialogMessage en fait, dis moi si jme trompe : Si le message recu est specifik a dialog, alors la fonction le traite, ds le cas contraire, elle le laisse passer a Translate et Dispatch ? Je crois ke c ca.

Merci Nebula :)

++
3
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
2 nov. 2004 à 10:08
exact

Magic Nono: l'informagicien! 8-)
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
2 nov. 2004 à 15:40
Nebula > C bien de blocker la reception de msg specifik a une fenetre ? Dans ton code (je critique pas, jme renseigne), le msg WM_KEYDOWN, par exemple, ne sera pas recu, car il n'est pas traité par les dialog, donc c embetant je trouve.
On peut pas utiliser SetFocus() a chak appui sur TAB ??
0

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

Posez votre question
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
2 nov. 2004 à 17:17
Si mais c'est plus chiant, je trouve... Pour ce qui est du message, s'il n'est pas traité par Dialog il est transmis tel quel à Translate puis Dispatch, donc je ne vois pas le problème ?
0
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
2 nov. 2004 à 17:35
Exactement, regarde le if() : si Dialog retourne 0 (=message non traité), on appelle Translate/Dispatch et sinon, on passe au suivant ;-)
0
Lord_Patoche Messages postés 196 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 1 mai 2009 3
2 nov. 2004 à 19:47
Et bien merci beaucoup, ça fonctione depuis que j'ai rajouté
if (IsDialogMessage(hWnd, &Msg) == 0)
En revanche, je n'ai pas bien compris le princpe de cette fonction, ou du moins pourquoi elle est placé dans un If intégrant cette condition pour que le traitement de mon message fonctionne. Mes autres fenêtres seront elles affectées par ce changement ?
LaPatoshe
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
2 nov. 2004 à 19:50
Si le message recu est specifik a dialog (return 1), alors la fonction IsDialogMessage le traite, ds le cas contraire (return 0), elle le laisse passer a Translate et Dispatch.
Dans une dialogbox, le passage d'un controle a un autre se fait automatikement, donc ca permet de rajouter cette fonctionnalité a ta fenetre, et simplement cette fenetre.
0
Lord_Patoche Messages postés 196 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 1 mai 2009 3
2 nov. 2004 à 19:56
D'accord je pige un peu plus. Maintenant, petite info, dans mon prog J'ai plusieurs feuilles de travail, comment faut il que j'organise cette condition pour que chacune d'entre elles puissent avoir ces fonctionalité de TABSTOP ? faut il coder quelque chose comme if (IsDialogMessage(hFeuille1, &Msg) == 0) || (IsDialogMessage(hFeuille2, &Msg) == 0))...

LaPatoshe
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
2 nov. 2004 à 20:00
Tu rajoute cette condition ds chak boucle de message normalement non ? Tu utilises une seule boucle pour ttes tes fenetres ? je sais pas si c possible, j'utilise jamais les fenetre, jprefere les dialog ;) Enfin bon, si tu n'as kune boucle, je pense ke ca devrait marcher, fais un ptit test et tu verras.
0
Lord_Patoche Messages postés 196 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 1 mai 2009 3
2 nov. 2004 à 20:05
Grand Merci, à toi AlexMan que j'ai apparement en Direct, et à Nebula, pour ces infos que je cherche depuis un moment.
LaPatoshe
0
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
2 nov. 2004 à 23:05
De rien, je l'ai cherché un moment aussi dans les méandres de la MSDN cette foutue fonction... Happy coding ! ;-)
0
Lord_Patoche Messages postés 196 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 1 mai 2009 3
2 nov. 2004 à 23:48
Encore une petite chose, je viens de faire des essais du code avec une feuille dans laquelle j'ai des zones de texte multiligne. La fonction IsDialogMessage apparement en plus d'écarter les messages de tabulation pour en faire un raourcis de passage entre controles, m'empêche également de faire des retours chariot au moyen de la touche ENTREE dans mes zonnes de texte. Y a t il un moyen de sélectionner les touches de fonctions qui ne devront pas faire partie des mesages traités ? J'ai tenté d'utiliser WM_GETDLGCODE dans ma procédure de traitement de messages principal et renvoyer au traitement tout ce qui ne correspondait pas à DLG_WANTTAB, mais mes essais plantent. Apparement, d'après ce que j'ai pu traduire du SDK, cet évènement devrait être placé dans la procédure de traitement des messages adressés à mon controle zone de texte, seulement, mon controle n'a pas de procédure de traitement de messages spécifique, tout est dans la boucle de traitement des messages de la feuille le contenant. Comment faire donc ?LaPatoshe
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
2 nov. 2004 à 23:50
essaye de faire tes edits avec style ES_WANTRETURN.
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
2 nov. 2004 à 23:53
Et si tu veux un traitement de message specifik a ton edit, utilise le sous classement. Tu fais ca avec SetWindowLong(..) (msdn) et ensuite tu auras une 'wndproc' ou tu pourras recevoir les msg adressé a ton controle. Si tu n'utilise pas les msg recus, tu fais CallWindowProc(holdproc, ...), holdproc etant renvoyé lors de l'appel a SetWindowLong()..Enfin ya des exemples sur le site, c po compliké ;)

++
0
Lord_Patoche Messages postés 196 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 1 mai 2009 3
2 nov. 2004 à 23:57
ça y est ça fonctionne à merveille. Encore Merci pour ton investissement dans mon prob.
LaPatoshe
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
3 nov. 2004 à 00:02
bah de rien ;)
0
Rejoignez-nous