cs_yves_r
Messages postés21Date d'inscriptionmercredi 27 octobre 2004StatutMembreDernière intervention27 avril 2005
-
27 nov. 2004 à 19:43
cs_yves_r
Messages postés21Date d'inscriptionmercredi 27 octobre 2004StatutMembreDernière intervention27 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.
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 ?
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 27 nov. 2004 à 20:58
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 28 nov. 2004 à 16:45
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?
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 28 nov. 2004 à 17:02
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...
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 28 nov. 2004 à 19:07
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:
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 28 nov. 2004 à 19:32
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.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 28 nov. 2004 à 19:33
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.
cs_AlexMAN
Messages postés1536Date d'inscriptionsamedi 21 décembre 2002StatutMembreDernière intervention24 mai 20091 28 nov. 2004 à 20:01
"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...
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 28 nov. 2004 à 22:44
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.