2009-07-20 6 views
3

Dans un projet C++ Win32 API, j'ai un dialogue avec un onglet de contrôle (3 onglets) et 3 boîtes de dialogue qui sont enfants du contrôle de tabulation. Je charge la boîte de dialogue principale avec le contrôle de tabulation en utilisant DialogBoxParam, et les boîtes de dialogue enfant à partir de ressources avec CreateDialogParam. La boîte de dialogue principale apparaît avec les boîtes de dialogue enfant. En cliquant sur les onglets affiche/cache la bonne boîte de dialogue enfant, tout fonctionne bien. Après avoir cherché autour des ordres de tabulation, j'ai trouvé le style WS_EX_CONTROLPARENT à définir dans le contrôle onglets pour que la tabulation fonctionne dans les fenêtres de dialogue enfant. Cela fonctionne très bien, sauf pour un problème: Le contrôle de tabulation lui-même ne reçoit jamais le focus, donc je ne peux pas tabuler sur le contrôle de tabulation pour passer à un onglet différent avec le clavier. Le focus clavier passe par la boîte de dialogue enfant, par les boutons de la boîte de dialogue principale, puis directement par la boîte de dialogue enfant, et ne s'arrête jamais sur le contrôle onglet lui-même, donc je dois cliquer sur le tabulation pour changer d'onglet. Ça me rend fou. Aucune suggestion?Ordre des onglets dans un contrôle onglet avec des boîtes de dialogue imbriquées (WS_EX_CONTROLPARENT)

Mise à jour: J'ai réussi à contourner le problème en oubliant complètement WS_EX_CONTROLPARENT, et en faisant l'enfant dialogues frères et soeurs du contrôle onglet. Seul l'effet secondaire semble être plus clignotant des contrôles au cours d'une repeinte, mais aimerait toujours une réponse, depuis que les fils de dialogue de l'enfant de l'onglet semble plus propre.

Répondre

3

Ce n'est pas plus propre. La méthode recommandée pour créer des boîtes de dialogue à onglets consiste à rendre les pages à onglet enfants de la boîte de dialogue. Le contrôle de tabulation contrôle simplement laquelle des pages est visible, mais n'est pas leur parent.

Ceci est particulièrement important lorsque vous essayez de faire fonctionner le thème XP dans la boîte de dialogue.

WS_EX_CONTROLPARENT est un style destiné à être défini dans les boîtes de dialogue 'onglet' réelles.

Je suppose que vous avez défini WS_TABSTOP sur le contrôle onglet lui-même? J'imagine que WS_TABSTOP et WS_EX_CONTROLPARENT sont en conflit lors de la configuration simultanée car ils disent au gestionnaire de dialogues de faire deux choses complètement différentes et conflictuelles lorsque le cycle de tabulation atteint le contrôle.

Enfin, je ne vois aucune raison que le scintillement devrait augmenter parce que les pages de dialogue sont des enfants de la boîte de dialogue plutôt que le contrôle onglet.

+0

Fonctionne pour moi. Trop d'exemples sur le net de rendre les enfants de dialogue du contrôle onglet, et MS ne le rend pas clair dans les docs. Depuis, j'ai activé le thème de l'onglet xp, et cela fonctionne très bien. – Jay

0

Vous ne pouvez pas AFAIK parce que la tabulation fait défiler les contrôles enfants d'une boîte de dialogue. Le mieux que vous puissiez faire est de pré-traiter l'événement de tabulation de tabulation et si c'est après le focus sur le dernier contrôle de la boîte de dialogue, mettez au point la page à onglets et ignorez l'événement. Pas plus propre que la solution que vous avez déjà, il me semble.

+0

Semble que le DialogProc n'a pas la chance de gérer la touche de tabulation, et je ne veux pas écrire ma propre boucle de message juste pour résoudre ce problème. J'ai donc décidé de laisser la solution que j'avais et de passer à autre chose. Je suis surpris de ne pas trouver quelqu'un d'autre avec le même problème en ligne. Tout le monde dit d'utiliser WS_EX_CONTROLPARENT, qui produit alors ce nouveau problème. – Jay

Questions connexes