Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Visual C++ et MFC] TabIndex

9 réponses
Avatar
Olivier Miakinen
Bonjour,

Je n'ai pas résolu mon problème précédent, mais j'ai quand même une
autre question.

Il s'agit d'une boîte de dialogue dont une partie est créée de manière
dynamique. Je voudrais gérer l'ordre de navigation par la touche
tabulation, et je ne peux bien sûr pas le faire de manière statique
dans les fichiers de ressource pour les contrôles créés dynamiquement.
Comment puis-je faire ?

Une recherche via Google ou sur MSDN indique des pistes à base de
TabStop et TabIndex ou de put_tabIndex(), mais je ne trouve rien
de tel dans la classe CWnd (ni dans aucune autre classe où j'aie
cherché). Est-ce que quelqu'un saurait comment faire ?

Cordialement,
--
Olivier Miakinen

9 réponses

Avatar
Christian ASTOR
On 29 fév, 16:27, Olivier Miakinen <om+ wrote:

Il s'agit d'une boîte de dialogue dont une partie est créée de mani ère
dynamique. Je voudrais gérer l'ordre de navigation par la touche
tabulation, et je ne peux bien sûr pas le faire de manière statique
dans les fichiers de ressource pour les contrôles créés dynamiquemen t.
Comment puis-je faire ?



SetWindowPos()
Avatar
Olivier Miakinen
Bonjour,

Le 29/02/2008 18:44, Christian ASTOR a écrit :

Il s'agit d'une boîte de dialogue dont une partie est créée de manière
dynamique. Je voudrais gérer l'ordre de navigation par la touche
tabulation, et je ne peux bien sûr pas le faire de manière statique
dans les fichiers de ressource pour les contrôles créés dynamiquement.
Comment puis-je faire ?



SetWindowPos()



Je te remercie de ta réponse, mais je n'ai pas dû être clair dans ma
question, ou alors je ne comprends pas la doc Windows de SetWindowPos().
Il me semble que cette fonction permet de gérer la position d'une
fenêtre par rapport aux autres fenêtres, alors que ce que je cherche
à faire est de gérer l'ordre de navigation de différents contrôles au
sein d'une même fenêtre (une boîte de dialogue).

Par exemple, je voudrais spécifier que lorsqu'on tape Tabulation à
partir du champ de saisie du login ça aille au champ de saisie du mot de
passe, et que lorsque l'on tape Tabulation à partir de la saisie du mot
de passe ça aille au bouton OK. Bien sûr, si je tape Shift+Tabulation ça
tournera dans l'autre sens.
Avatar
Vincent Burel
"Olivier Miakinen" <om+ wrote in message
news:47c84b1b$
Bonjour,

Le 29/02/2008 18:44, Christian ASTOR a écrit :
>
>> Il s'agit d'une boîte de dialogue dont une partie est créée de manière
>> dynamique. Je voudrais gérer l'ordre de navigation par la touche
>> tabulation, et je ne peux bien sûr pas le faire de manière statique
>> dans les fichiers de ressource pour les contrôles créés dynamiquement.
>> Comment puis-je faire ?
>
> SetWindowPos()

Je te remercie de ta réponse, mais je n'ai pas dû être clair dans ma
question, ou alors je ne comprends pas la doc Windows de SetWindowPos().
Il me semble que cette fonction permet de gérer la position d'une
fenêtre par rapport aux autres fenêtres, alors que ce que je cherche
à faire est de gérer l'ordre de navigation de différents contrôles au
sein d'une même fenêtre (une boîte de dialogue).

Par exemple, je voudrais spécifier que lorsqu'on tape Tabulation à
partir du champ de saisie du login ça aille au champ de saisie du mot de
passe, et que lorsque l'on tape Tabulation à partir de la saisie du mot
de passe ça aille au bouton OK. Bien sûr, si je tape Shift+Tabulation ça
tournera dans l'autre sens.



Il faut créer ses controle avec le style WS_TABSTOP et ensuite il faut les
créer dans l'ordre dans lequel vous voulez naviguer avec les touche (TAB ou
SHIFT+TAB). Sinon le mieux c'est de gérer soi même la navigation dans ses
controles...

remarque : il me semble que cela est géré automatiquement uniquement dans
les Modal-Dialog Box... sinon il faut se faire sa procédure de navigation :

exemple :

int PREFIX_DialogProcessFocus(HWND hparent,UINT uMsg,WPARAM wParam,LPARAM
lParam)
{
short b_shift;
HWND hwf,hwfirst,hwnext;
hwf=GetFocus();
b_shift= GetKeyState(VK_LSHIFT) & 0x8000;
b_shift = b_shift | (GetKeyState(VK_SHIFT) & 0x8000);

if (((int)wParam == VK_TAB) && (b_shift ==0))
{
if ((hwf==NULL) || (hwf == hparent))
{
hwf=GetWindow(hparent,GW_CHILD);
hwfirst=hwf;
if (IsWindowEnabled(hwf)==0L)
{
hwnext=GetNextWindow(hwf,GW_HWNDNEXT);
if ((hwnext==NULL) || (hwnext==hparent))
{
hwnext=GetWindow(hparent,GW_CHILD);
}
while ((hwnext != hwfirst) && (IsWindowEnabled(hwnext)==0L))
{
hwnext=GetNextWindow(hwnext,GW_HWNDNEXT);
if ((hwnext==NULL) || (hwnext==hparent))
{
hwnext=GetWindow(hparent,GW_CHILD);
}
}
SetFocus(hwnext);
}
else SetFocus(hwf);
}
else
{
hwfirst=hwf;
hwnext=GetNextWindow(hwf,GW_HWNDNEXT);
if ((hwnext==NULL) || (hwnext==hparent))
{
hwnext=GetWindow(hparent,GW_CHILD);
}
while ((hwnext != hwfirst) && (IsWindowEnabled(hwnext)==0L))
{
hwnext=GetNextWindow(hwnext,GW_HWNDNEXT);
if ((hwnext==NULL) || (hwnext==hparent))
{
hwnext=GetWindow(hparent,GW_CHILD);
}
}
SetFocus(hwnext);
}
return 0;
}
//Back
if (((int)wParam == VK_TAB) && (b_shift !=0))
{
if ((hwf==NULL) || (hwf == hparent))
{
hwf=GetWindow(hparent,GW_CHILD);
hwfirst=hwf;
if (IsWindowEnabled(hwf)==0L)
{
hwnext=GetNextWindow(hwf,GW_HWNDPREV);
if ((hwnext==NULL) || (hwnext==hparent))
{
hwnext=GetWindow(hparent,GW_CHILD);
}
while ((hwnext != hwfirst) && (IsWindowEnabled(hwnext)==0L))
{
hwnext=GetNextWindow(hwnext,GW_HWNDPREV);
if ((hwnext==NULL) || (hwnext==hparent))
{
hwnext=GetWindow(hparent,GW_CHILD);
}
}
SetFocus(hwnext);
}
else SetFocus(hwf);
}
else
{
hwfirst=hwf;
hwnext=GetNextWindow(hwf,GW_HWNDPREV);
if ((hwnext==NULL) || (hwnext==hparent))
{
hwnext=GetWindow(hparent,GW_CHILD);
}
while ((hwnext != hwfirst) && (IsWindowEnabled(hwnext)==0L))
{
hwnext=GetNextWindow(hwnext,GW_HWNDPREV);
if ((hwnext==NULL) || (hwnext==hparent))
{
hwnext=GetWindow(hparent,GW_CHILD);
}
}
SetFocus(hwnext);
}
return 0;
}
return 1;
}


Mouaif...
VB
Avatar
Olivier Miakinen
Le 29/02/2008 20:21, Vincent Burel me répondait :

Il faut créer ses controle avec le style WS_TABSTOP



Je suppose que c'est bien le cas par défaut, car la touche tabulation
permet effectivement d'accéder aux contrôles créés dynamiquement. Il y a
juste qu'ils ne sont pas dans le bon ordre.

et ensuite il faut les créer dans l'ordre dans lequel vous voulez
naviguer avec les touche (TAB ou SHIFT+TAB).



Ça me semble un peu compliqué à gérer car je les reçois un par un, et
c'est au fur et à mesure que je sais si le dernier reçu doit être placé
avant ou après les autres.

Sinon le mieux c'est de gérer soi même la navigation dans ses
controles...



Ah, je ne savais pas que c'était possible. Quoique ça me semble très
compliqué aussi, je le ferai s'il n'y a pas d'autre solution.

remarque : il me semble que cela est géré automatiquement uniquement dans
les Modal-Dialog Box... sinon il faut se faire sa procédure de navigation :



D'expérience, je n'ai pas vu de différence entre les boîtes de dialogues
modales et les non modales. Pour les ressources statiques, l'ordre de
parcours est tout simplement l'ordre des contrôles dans le fichier .rc .

exemple :

int PREFIX_DialogProcessFocus(HWND hparent,UINT uMsg,WPARAM wParam,LPARAM
lParam)
{
[...]
}



Merci pour cet exemple. Y a-t-il une déclaration particulière
ON_WM_XXX() à faire, ou bien est-ce que c'est une fonction virtuelle
qui est redéfinie ?
Avatar
Christian ASTOR
Olivier Miakinen wrote:


Je te remercie de ta réponse, mais je n'ai pas dû être clair dans ma
question, ou alors je ne comprends pas la doc Windows de SetWindowPos().
Il me semble que cette fonction permet de gérer la position d'une
fenêtre par rapport aux autres fenêtres, alors que ce que je cherche
à faire est de gérer l'ordre de navigation de différents contrôles au
sein d'une même fenêtre (une boîte de dialogue).

Par exemple, je voudrais spécifier que lorsqu'on tape Tabulation à
partir du champ de saisie du login ça aille au champ de saisie du mot de
passe, et que lorsque l'on tape Tabulation à partir de la saisie du mot
de passe ça aille au bouton OK. Bien sûr, si je tape Shift+Tabulation ça
tournera dans l'autre sens.



Oui, ça s'appelle le Z Order et c'est ce que fait SetWindowPos()
Avatar
Olivier Miakinen
Le 29/02/2008 20:52, Christian ASTOR a écrit :

Je te remercie de ta réponse, mais je n'ai pas dû être clair dans ma
question, ou alors je ne comprends pas la doc Windows de SetWindowPos().
[...]



Oui, ça s'appelle le Z Order et c'est ce que fait SetWindowPos()



D'accord. Pardon d'avoir douté. :-)

Si j'ai bien compris, je dois boucler sur tous les contrôles, dans
l'ordre, en appelant à chaque fois :
SetWindowPos(hWnd_numéro_n, hWnd_numéro_n+1, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE)

J'ai bon ?
Avatar
antoine
Olivier Miakinen wrote:
Le 29/02/2008 20:52, Christian ASTOR a écrit :
Je te remercie de ta réponse, mais je n'ai pas dû être clair dans ma
question, ou alors je ne comprends pas la doc Windows de SetWindowPos().
[...]


Oui, ça s'appelle le Z Order et c'est ce que fait SetWindowPos()



D'accord. Pardon d'avoir douté. :-)

Si j'ai bien compris, je dois boucler sur tous les contrôles, dans
l'ordre, en appelant à chaque fois :
SetWindowPos(hWnd_numéro_n, hWnd_numéro_n+1, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE)

J'ai bon ?




T'es pas obligé de boucler forcément sur tous : que ceux que tu veux
repositionner.
Avatar
Olivier Miakinen
Le 29/02/2008 21:23, antoine a écrit :

Si j'ai bien compris, je dois boucler sur tous les contrôles, dans
l'ordre, en appelant à chaque fois :
SetWindowPos(hWnd_numéro_n, hWnd_numéro_n+1, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE)



T'es pas obligé de boucler forcément sur tous : que ceux que tu veux
repositionner.



Sympa, ça m'évitera de le faire pour les contrôles statiques, et aussi
pour ceux qui se mettent d'office dans le bon ordre. Merci à tous trois,
j'essaierai ça lundi.
Avatar
Olivier Miakinen
Le 29/02/2008 22:44, Olivier Miakinen a écrit :

Si j'ai bien compris, je dois boucler sur tous les contrôles, dans
l'ordre, en appelant à chaque fois :
SetWindowPos(hWnd_numéro_n, hWnd_numéro_n+1, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE)







En réalité, dans mon cas, c'était plutôt :
cWnd_numéro_n+1->SetWindowPos(cWnd_numéro_n, 0,0,0,0, ...)

Merci à tous trois, j'essaierai ça lundi.



Ça maaaarche ! Encore merci à tous.