2010-09-28 8 views
3

Je travaille sur un projet Windows avec une boîte de dialogue simple créée avec CreateWindowEx() et contenant plusieurs volets chargés avec CreateDialog() pour charger la mise en page à partir d'un fichier de ressources. Sur les panneaux enfants, il y a un certain nombre de contrôles, y compris des zones de texte et des boutons que j'aimerais utiliser pour naviguer, mais tout ce que j'ai, c'est le 'bing' de Windows qui me dit que la clé ne fait rien. Ma boucle de message ressemble à ceci:Création de la touche TAB dans la boîte de dialogue Windows

while(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) 
{ 
    if(!IsDialogMessage(0, &msg)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 

Et chaque fenêtre de contrôle a WS_TABSTOP défini dans le style ainsi que le volet propriétaire ayant ensemble WS_EX_CONTROLPARENT.

Y at-il autre chose que je dois faire pour l'onglet travail clé?

Merci, J

Répondre

3

Essayez ceci:

http://support.microsoft.com/kb/71450 (Comment utiliser un IsDialogMessage() Appel à modales Beaucoup Dialogs)

Vous vitres sont des boîtes de dialogue modales et IsDialogMessage est responsable de la gestion des clés de l'onglet. J'espère que cet article correspond exactement à votre cas.

+0

J'ai juste essayé la technique dans l'article et ça n'a malheureusement pas fait de différence. Est-ce la bonne façon de charger les ressources de dialogue ou existe-t-il un meilleur moyen? – JWood

2

Le style WS_TABSTOP Le style WS_TABSTOP spécifie les contrôles auxquels l'utilisateur peut se déplacer en appuyant sur les touches touche TAB ou MAJ + TAB.

Lorsque l'utilisateur appuie sur TAB ou MAJ + TAB, le système détermine d'abord si ces touches sont traitées par le contrôle qui a actuellement la mise au point d'entrée. Il envoie au contrôle un message WM_GETDLGCODE et si le contrôle renvoie DLGC_WANTTAB, le système transmet les clés au contrôle. Sinon, le système utilise la fonction GetNextDlgTabItem pour localiser le contrôle suivant qui est visible, non désactivé, et qui a le style WS_TABSTOP. La recherche commence avec le contrôle ayant actuellement le focus d'entrée et continue dans l'ordre dans lequel les contrôles ont été créés, c'est-à-dire dans l'ordre dans lequel ils sont définis dans le modèle de boîte de dialogue. Lorsque le système localise un contrôle ayant les caractéristiques requises, le système déplace le focus d'entrée vers celui-ci.

Si la recherche du contrôle suivant avec le style WS_TABSTOP rencontre une fenêtre avec le style WS_EX_CONTROLPARENT, le système recherche récursivement les enfants de la fenêtre.

Une application peut également utiliser GetNextDlgTabItem pour localiser les contrôles ayant le style WS_TABSTOP. La fonction récupère le handle de fenêtre du contrôle suivant ou précédent ayant le style WS_TABSTOP sans déplacer le focus d'entrée.

Source: MSDN.

+0

Merci pour l'info. Je suis tombé sur ceci dans le MSDN avant et il semble suggérer que ce que je fais est correct. Mon volet parent a le jeu de style WS_EX_CONTROLPARENT et mes zones de texte ont WS_TABSTOP ensemble mais toujours rien. – JWood

1
if(!IsDialogMessage(0, &msg)) 

Le premier argument ne devrait pas être NULL, il doit être la poignée d'une boîte de dialogue. Douloureux ici bien sûr.

Questions connexes