C++, Windows: se positionner sur un champ de saisie à l'ouverture d'une fenetre [Résolu]

Messages postés
21
Date d'inscription
mercredi 27 octobre 2004
Statut
Membre
Dernière intervention
27 avril 2005
- - Dernière réponse : cs_yves_r
Messages postés
21
Date d'inscription
mercredi 27 octobre 2004
Statut
Membre
Dernière intervention
27 avril 2005
- 1 déc. 2004 à 15:41
C++, Windows:

Comment puis-je me positionner sur un champ de saisie défini à l'ouverture d'une fenetre ?
Par défaut, il se positionne sur le bouton de validation, et je ne trouve rien pour changer cela.

Merci.

Yves R
Afficher la suite 

13 réponses

Meilleure réponse
Messages postés
21
Date d'inscription
mercredi 27 octobre 2004
Statut
Membre
Dernière intervention
27 avril 2005
3
Merci
Merci à tous.

le code suivant fonctionne très bien:
---------------------------------------------------
case WM_INITDIALOG:

HWND lHandleField;

// Obtient le handle du champ choisi
lHandleField = GetDlgItem(hDlg, IDC_champ);

//Position du curseur sur le champ (Focus)
SetFocus(lHandleField);

return false;
-------------------------------------------------

Par contre j'aurai bien aimé utiliser l'autre méthode (surtout si elle est conseillée par le MSDN:
--------------------------------------
SendMessage(hDlg,WM_NEXTDLGCTL,(WPARAM)IDC_champ, LPARAM)1);
--------------------------------------
Mais ça ne marche pas. Y-a-t-il autre chose à ajouter pour que ça marche ?

Yves

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 132 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_yves_r
Messages postés
1537
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
1
3
Merci
wparam doit etre handle du controle sur lekel mettre le focus, non pas son ID.

+2(p - n)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 132 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_AlexMAN
Messages postés
21
Date d'inscription
mercredi 27 octobre 2004
Statut
Membre
Dernière intervention
27 avril 2005
3
Merci
Super. Ca marche aussi avec le sendMessage().

Merci encore. :big)

Yves R

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 132 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_yves_r
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
7
0
Merci
Salut,
Je pense qu'il faut utiliser la fonction SetFocus():
SetFocus(hChamp);
hChamp est le HWND du contrôle servant de champ, un EDIT par exemple. Il est préférable d'appeler cette fonction juste à la fin du traitement du message WM_CREATE. Ainsi tu peux te positionner sur n'importe quel contrôle à l'ouverture de la fenêtre.
J'espère que ça correspond à ce que tu cherches.
Commenter la réponse de racpp
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
Si c'est un dialog, retourne TRUE dans WM_INITDIALOG et mets hChamp dans wParam
Commenter la réponse de vecchio56
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
7
0
Merci
Salut,
vecchio56 >> Pour qu'un contrôle ait le focus au lancement de la boite de dialogue il faut qu'on retourne FALSE dans WM_INITDIALOG comme ceci:
case WM_INITDIALOG:
//.....
SetFocus(hChamp);
return  FALSE;

Si on retourne TRUE, aucun contrôle ne peut avoir le focus au lancement de la boite de dialogue. C'est précisé dans MSDN.
Tu es sûr que ta méthode marche? Si oui comment tu fais exactement?
Commenter la réponse de racpp
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
Oui j'ai dû me tromper, j'ai mal lu en fait on ne peut pas choisir ce qu'il y a dans wParam.
"The dialog box procedure should return TRUE to direct the system to set the keyboard focus to the control specified by wParam"
Je pensais que si on mettait le controle dans wParam et qu'on retourne TRUE ca marchait, mais apparemment non.

Mais pour un Dialog, je crois qu'il fat utiliser WM_NEXTDLGCTL plutot que la fonction SetFocus...
Commenter la réponse de vecchio56
Messages postés
1537
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
1
0
Merci
Oui, il faut 'poster' WM_NEXTDLGCTL avec en wparam le handle du controle, et lparam a 1.

+2(p - n)
Commenter la réponse de cs_AlexMAN
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
7
0
Merci
C'est vrai, on ne peut pas agir sur wParam car selon MSDN c'est le système qui lui attribue le HWND du contrôle:
"The control to receive the default keyboard focus is always the first control in the dialog box that is visible, not disabled, and that has the WS_TABSTOP style. When the dialog box procedure returns TRUE, the system checks the control to ensure that the procedure has not disabled it. If it has been disabled, the system sets the keyboard focus to the next control that is visible, not disabled, and has the WS_TABSTOP.
An application can return FALSE only if it has set the keyboard focus to one of the controls of the dialog box."

Pourquoi plutôt WM_NEXTDLGCTL que SetFocus()? J'utilise toujours SetFocus() dans ce genre de cas et ca marche sans aucun problème. Et je trouve nettement plus pratique de faire:
SetFocus(hChamp);

que de faire:
SendMessage(hDlg,WM_NEXTDLGCTL,(WPARAM)hChamp,(LPARAM)1);

Pourquoi devrais-je préférer "WM_NEXTDLGCTL" ??
Commenter la réponse de racpp
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
Moi j'utilise WM_NEXTDLGCTL depuis le jour ou j'ai voulu utiliser SetFocus et que ca n'a pas marché. Cela dit, il est possible que ce soit équivalent dans WM_INITDIALOG. Mon truc si je me souviens bien c'était Appuyer sur un bouton, afficher une MessageBox et mettre le curseur dans un EDIT, et ca ne marchait pas avec SetFocus, alors qu'avec WM_NEXTDLGCTL aucun probleme.
De toute facon, regarde comment est présenté WM_NEXTDLGCTL dans la MSDN, et tu verras que c'est bien celui la qu'il faut utiliser avec une DialogBox.
Commenter la réponse de vecchio56
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
D'ailleurs ya une remarque la dessus sur MSDN que j'avais pas vue:
"This message performs additional dialog box management operations beyond those performed by the SetFocus function WM_NEXTDLGCTL updates the default pushbutton border, sets the default control identifier, and automatically selects the text of an edit control (if the target window is an edit control). "
Je dois être fatigué parce que j'arrive pas a comprendre la phrase.
Commenter la réponse de vecchio56
Messages postés
1537
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
1
0
Merci
"Ce message effectue des operations de 'management' additionnelles au dela de celles proposées par la fonction SetFocus()...etc"
Il est donc preferable d'utiliser ce message dans certains cas.
Mais Brunews a tjrs dit qu'il FALLAIT utiliser WM_NEXTDLGCTL, je comprends pas trop kan mm...

+2(p - n)
Commenter la réponse de cs_AlexMAN
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
7
0
Merci
En tous cas, SetFocus() a toujours fonctionné pour moi avec les EDITs dans une boite de dialogue. Le cas des boutons est un peu particulier. Dans les cas où SetFocus() ne suffit plus, j'utiliserais WM_NEXTDLGCTL.
Commenter la réponse de racpp