Touche Tab inopérationelle

[Résolu]
Signaler
Messages postés
245
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
26 septembre 2008
-
Messages postés
245
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
26 septembre 2008
-
Bonjour,

depuis que je programme avec l'API WIN32 en C, j'ai remarqué, que la touche tab de mes programmes ne fonctionne pas. Par exemple, je suis dans un Edit, je veux passer dans un autre, j'appuie sur Tab, j'entend juste un son et le focus reste sur le meme edit. Un autre problème un peu lié est le fait que bien que j'ajoute le style BS_DEFPUSHBUTTON a un de mes button, j'ai beau appuyé sur Entrée, rien ne se passe.

Comment cela se fait-il ?

Merci d'avances pour vos réponses.

Apprendre le VB6

5 réponses

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Pour le bouton par défaut, je viens de trouver une solution très simple. Le bouton doit avoir le style BS_DEFPUSHBUTTON et avoir IDOK comme identificateur. La boucle des messages modifiée comme précisé plus haut est indispensable:
hBouton=CreateWindowEx(0, "Button", "Ok", WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON  | WS_TABSTOP , 20, 20, 60, 20, hDlg, (HMENU)IDOK, 0, 0);
Je viens de faire des tests, ça marche nickel.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Je suppose que tu utilises une boite de dialogue. Dans ce cas c'est simple, il suffit de donner à chaque controle le style WS_TABSTOP.
Pour le style BS_DEFPUSHBUTTON, j'avais rencontré ce problème il y'a longtemps déjà. Il parait qu'il ne sert à rien de l'ajouter. En effet, malgré ce style, la boite de dialogue ne le reconnait pas. Il suffit donc de le lui signaler avec le message DM_SETDEFID. Ce  message permet de changer l'identificateur du controle par défaut agissant à la pression de la touche ENTREE.
Voici un petit exemple:
HWND hBouton;
hBouton= CreateWindowEx(0, "Button", "Ok", WS_VISIBLE | WS_CHILD | WS_TABSTOP , 20, 20, 60, 20, hDlg, (HMENU)1000, 0, 0);
SendMessage(hDlg, DM_SETDEFID ,1000,0);

Notre bouton à comme identificateur 1000 . C'est ce dernier qui sera envoyé à notre boite de dialogue via le message DM_SETDEFID.
A noter que je n'ai pas mis le style BS_DEFPUSHBUTTON pendant la création du bouton car c'est inutile.

<link href ="../../../../../css/ie4.css" type="text/css" rel="stylesheet" /><!-- @ --><link href="../../../../../css/inetsdk.css" type="text/css" rel="stylesheet" /><!-- @ --><style type="text/css"><![CDATA[
PRE.clsCode { font-size:110%; }
PRE.clsSyntax { font-size:100%; }
TD DIV.clsBeta { display:none;}

A:link { color:#0000ff; text-decoration:underline;}
A:visited { color:#0000ff; text-decoration:underline;}
A:hover { color:#3366ff; text-decoration:underline;}
MSHelp\:link {
color:#0000ff;
text-decoration:underline;
cursor:hand;
hoverColor:#3366ff;
filterString: ;}
]]></style><link href="ms-help://Hx/HxRuntime/HxLink.css" type="text/css" rel="stylesheet" />

<xml id="_topicdata" pagetype="winmsg" proj="WinUIHXS" name="DM_SETDEFID" pubpath="/WinUI/WindowsUserInterface/Windowing/DialogBoxes/DialogBoxReference/DialogBoxMessages/DM_SETDEFID.htm"><!-- topic data --><root></root></xml>

<xml xmlns=""><mshelp:keyword index="A" term="_win32_DM_SETDEFID"></mshelp:keyword><mshelp:keyword index="A" term="_win32_DM_SETDEFID_cpp"></mshelp:keyword><mshelp:toctitle title="DM_SETDEFID Message"></mshelp:toctitle><mshelp:rltitle title="DM_SETDEFID Message ()"></mshelp:rltitle><mshelp:keyword index="F" term="DM_SETDEFID"></mshelp:keyword><mshelp:keyword index="K" term="DM_SETDEFID"></mshelp:keyword><mshelp:attr name="TopicType" value="kbRef"></mshelp:attr><mshelp:attr name="Locale" value="kbEnglish"></mshelp:attr><mshelp:attr name="DevLang" value="C++"></mshelp:attr><mshelp:attr name="Technology" value="WinUI"></mshelp:attr><mshelp:attr name="TechnologyVers" value="kbWinUI"></mshelp:attr><mshelp:attr name="DocSet" value="WCSDK"></mshelp:attr><mshelp:attr name="DocSet" value="LHSDK"></mshelp:attr><mshelp:attr name="DocSet" value="PSDK"></mshelp:attr><mshelp:attr name="TargetOS" value="Windows"></mshelp:attr><mshelp:attr name="TopicType" value="apiref"></mshelp:attr><mshelp:attr name="APIName" value="DM_SETDEFID"></mshelp:attr><mshelp:attr name="APIType" value="NA"></mshelp:attr><mshelp:attr name="TopicType" value="kbSyntax"></mshelp:attr></xml>
Messages postés
245
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
26 septembre 2008

Salut,

il ne s'agit pas d'une DialogBox, il s'agit d'une fenetre principale. J'ai quand meme essayé ce que tu m'as dit pour la touche tab mais cela ne fonctionne pas.

Ensuite pour le bouton, j'ai mis le message, il l'encadre de la bordure noire pour montrer qu'il est par défaut celui qui s'enfoncera à la pression de la touche Entrée, mais rien ne se passe quand j'appuye sur entré alors que l'Edit a le focus ... J'entend un son système (un chti doooooong) mais rien d'autre ...

Apprendre le VB6
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Bonjour,
Dans ce cas il suffit de modifier la boucle des messages dans ta winmain pour qu'elle ressemble à ceci:
    MSG msg;
    while (GetMessage(&msg, 0, 0, 0) )
    {
        if (!IsDialogMessage(hwnd, &msg) )
        {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
        }
    }
Ceci permet le fonctionnement des tabulations dans une fenêtre mais ne résoud pas le problème du bouton par défaut. Personnellement je n'ai jamais eu besoin d'utiliser un tel bouton dans mes fenêtres. Si je trouve une solution pour ce cas spécial, je te la montrerai.
Messages postés
245
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
26 septembre 2008

Ah voilà, ca fonctionne maintenant, je me suis un peu renseigné sur msdn sur IsDialogMessage que tu m'as indiqué et j'ai compris pourquoi tu fais cela.

Merci beaucoup de ton aide :p

Apprendre le VB6