Considérations relatives à la programmation des boîtes de dialogue
Cette vue d’ensemble présente certaines considérations relatives à la programmation concernant les boîtes de dialogue.
La vue d’ensemble comprend les rubriques suivantes.
- Procédures de boîte de dialogue
- Interface clavier de la boîte de dialogue
- Paramètres de la boîte de dialogue
- Boîtes de dialogue personnalisées
Procédures de boîte de dialogue
Une procédure de boîte de dialogue est similaire à une procédure de fenêtre en ce que le système envoie des messages à la procédure lorsqu’il a des informations à fournir ou des tâches à exécuter. Contrairement à une procédure de fenêtre, une procédure de boîte de dialogue n’appelle jamais la fonction DefWindowProc . Au lieu de cela, elle retourne TRUE s’il traite un message ou FALSE si ce n’est pas le cas.
Chaque procédure de boîte de dialogue se présente sous la forme suivante :
BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
// Place message cases here.
default:
return FALSE;
}
}
Les paramètres de procédure ont le même rôle que dans une procédure de fenêtre, le paramètre hwndDlg recevant le handle de fenêtre de la boîte de dialogue.
La plupart des procédures de boîte de dialogue traitent le message WM_INITDIALOG et les messages WM_COMMAND envoyés par les contrôles, mais traitent peu ou pas d’autres messages. Si une procédure de boîte de dialogue ne traite pas de message, elle doit retourner FALSE pour indiquer au système de traiter les messages en interne. La seule exception à cette règle est le message WM_INITDIALOG . La procédure de boîte de dialogue doit retourner TRUE pour diriger le système vers le traitement ultérieur du message WM_INITDIALOG . Dans tous les cas, la procédure ne doit pas appeler DefWindowProc.
- The WM_INITDIALOG Message
- The WM_COMMAND Message
- The WM_PARENTNOTIFY Message
- Messages de couleur de contrôle
- Traitement des messages par défaut de la boîte de dialogue
The WM_INITDIALOG Message
Le système n’envoie pas de message WM_CREATE à la procédure de boîte de dialogue. Au lieu de cela, il envoie un message WM_INITDIALOG lorsqu’il crée la boîte de dialogue et tous ses contrôles, mais avant d’afficher la boîte de dialogue. La procédure doit effectuer toute initialisation requise pour s’assurer que la boîte de dialogue affiche les paramètres actuels associés à la tâche. Par exemple, lorsqu’une boîte de dialogue contient un contrôle pour afficher le lecteur et le répertoire actuels, la procédure doit déterminer le lecteur et le répertoire actuels et définir le contrôle sur cette valeur.
La procédure peut initialiser des contrôles à l’aide de fonctions telles que SetDlgItemText et CheckDlgButton. Étant donné que les contrôles sont des fenêtres, la procédure peut également les manipuler à l’aide de fonctions de gestion des fenêtres telles que EnableWindow et SetFocus. La procédure peut récupérer le handle de fenêtre dans un contrôle à l’aide de la fonction GetDlgItem .
La procédure de boîte de dialogue peut modifier le contenu, l’état et la position de n’importe quel contrôle en fonction des besoins. Par exemple, dans une boîte de dialogue qui contient une zone de liste de noms de fichiers et un bouton Ouvrir , la procédure peut désactiver le bouton Ouvrir jusqu’à ce que l’utilisateur sélectionne un fichier dans la liste. Dans cet exemple, le modèle de boîte de dialogue spécifie le style WS_DISABLED pour le bouton Ouvrir et le système désactive automatiquement le bouton lors de sa création. Lorsque la procédure de boîte de dialogue reçoit un message de notification de la zone de liste indiquant que l’utilisateur a sélectionné un fichier, la procédure appelle la fonction EnableWindow pour activer le bouton Ouvrir .
Pour afficher une icône personnalisée dans la barre de légende de la boîte de dialogue, votre gestionnaire de WM_INITDIALOG peut envoyer le message WM_SETICON à la boîte de dialogue.
Si l’application crée la boîte de dialogue à l’aide de l’une des fonctions DialogBoxParam, DialogBoxIndirectParam, CreateDialogParam ou CreateDialogIndirectParam, le paramètre lParam pour le message WM_INITDIALOG contient le paramètre supplémentaire passé à la fonction. Les applications utilisent généralement ce paramètre supplémentaire pour passer un pointeur vers des informations d’initialisation supplémentaires à la procédure de boîte de dialogue, mais la procédure de boîte de dialogue doit déterminer la signification du paramètre. Si l’application utilise une autre fonction pour créer la boîte de dialogue, le système définit le paramètre lParam sur NULL.
Avant de revenir du message WM_INITDIALOG , la procédure doit déterminer si elle doit définir le focus d’entrée sur un contrôle spécifié. Si la procédure de boîte de dialogue retourne TRUE, le système définit automatiquement le focus d’entrée sur le contrôle dont le handle de fenêtre se trouve dans le paramètre wParam . Si le contrôle recevant le focus par défaut n’est pas approprié, il peut définir le focus sur le contrôle approprié à l’aide de la fonction SetFocus . Si la procédure définit le focus d’entrée, elle doit retourner FALSE pour empêcher le système de définir le focus par défaut. Le contrôle recevant le focus d’entrée par défaut est toujours le premier contrôle spécifié dans le modèle qui est visible, non désactivé et qui a le style WS_TABSTOP . S’il n’existe aucun contrôle de ce type, le système définit le focus d’entrée par défaut sur le premier contrôle du modèle.
The WM_COMMAND Message
Un contrôle peut envoyer un message WM_COMMAND à la procédure de boîte de dialogue lorsque l’utilisateur effectue une action dans le contrôle. Ces messages, appelés messages de notification, informent la procédure d’entrée de l’utilisateur et lui permettent d’effectuer les réponses appropriées.
Tous les contrôles prédéfinis, à l’exception des contrôles statiques, envoient des messages de notification pour les actions utilisateur sélectionnées. Par exemple, un bouton d’envoi envoie le message de notification BN_CLICKED chaque fois que l’utilisateur clique sur le bouton. Dans tous les cas, le mot d’ordre inférieur du paramètre wParam contient l’identificateur de contrôle, le mot d’ordre supérieur de wParam contient le code de notification et le paramètre lParam contient le handle de fenêtre de contrôle.
La procédure de boîte de dialogue doit surveiller et traiter les messages de notification. En particulier, la procédure doit traiter les messages ayant les identificateurs IDOK ou IDCANCEL ; ces messages représentent une demande de l’utilisateur de fermer la boîte de dialogue. La procédure doit fermer la boîte de dialogue à l’aide de la fonction EndDialog pour les boîtes de dialogue modales et de la fonction DestroyWindow pour les boîtes de dialogue sans mode.
Le système envoie également WM_COMMAND messages à la procédure de boîte de dialogue si la boîte de dialogue a un menu, tel que le menu fenêtre , et que l’utilisateur clique sur un élément de menu. En particulier, le système envoie un message WM_COMMAND avec le paramètre wParam défini sur IDCANCEL chaque fois que l’utilisateur clique sur Fermer dans le menu de la fenêtre de la boîte de dialogue. Le message est presque identique au message de notification envoyé par le bouton Annuler et doit être traité exactement de la même façon.
The WM_PARENTNOTIFY Message
Un contrôle envoie un message WM_PARENTNOTIFY chaque fois que l’utilisateur appuie sur un bouton de la souris tout en pointant sur le contrôle. Certaines applications interprètent ce message comme un signal pour effectuer une action liée au contrôle, telle que l’affichage d’une ligne de texte décrivant l’objectif du contrôle.
Le système envoie également WM_PARENTNOTIFY messages lorsqu’il crée et détruit une fenêtre, mais pas pour les contrôles créés à partir d’un modèle de boîte de dialogue. Le système empêche ces messages en spécifiant le style WS_EX_NOPARENTNOTIFY lors de la création des contrôles. Une application ne peut pas remplacer ce comportement par défaut, sauf si elle crée ses propres contrôles pour la boîte de dialogue.
Control-Color Messages
Les contrôles et le système peuvent envoyer des messages de couleur de contrôle lorsqu’ils souhaitent que la procédure de boîte de dialogue peigne l’arrière-plan d’un contrôle ou d’une autre fenêtre à l’aide d’un pinceau et de couleurs spécifiques. Cela peut être utile lorsque les applications remplacent les couleurs par défaut utilisées dans les boîtes de dialogue et leurs contrôles. Voici les messages de couleur de contrôle, qui ont remplacé le message WM_CTLCOLOR .
- WM_CTLCOLORBTN
- WM_CTLCOLORDLG
- WM_CTLCOLOREDIT
- WM_CTLCOLORLISTBOX
- WM_CTLCOLORSCROLLBAR
- WM_CTLCOLORSTATIC
Un contrôle envoie un message de couleur de contrôle à la procédure de boîte de dialogue juste avant de peindre son propre arrière-plan. Le message permet à la procédure de spécifier le pinceau à utiliser et de définir les couleurs d’arrière-plan et de premier plan. La procédure spécifie un pinceau en retournant la poignée de pinceau. Pour définir les couleurs d’arrière-plan et de premier plan, la procédure utilise les fonctions SetBkColor et SetTextColor avec le contexte de l’appareil d’affichage du contrôle. Le message de couleur de contrôle transmet un handle au contexte de l’appareil d’affichage à la procédure dans le paramètre wParam du message.
Le système envoie un message WM_CTLCOLORDLG à la procédure de boîte de dialogue si la procédure ne traite pas le message WM_ERASEBKGND . La classe de boîte de dialogue prédéfinie n’ayant pas de pinceau d’arrière-plan de classe, ce message permet à la procédure de définir son propre arrière-plan sans avoir à inclure le code pour effectuer le travail.
Dans tous les cas, lorsqu’une procédure de boîte de dialogue ne traite pas de message de couleur de contrôle, le système utilise un pinceau avec la couleur de fenêtre par défaut pour peindre l’arrière-plan de tous les contrôles et fenêtres à l’exception des barres de défilement. Une application peut récupérer la couleur de fenêtre par défaut en passant la valeur COLOR_WINDOW à la fonction GetSysColor . Lorsque l’arrière-plan est peint, la couleur de premier plan du contexte de l’appareil d’affichage est définie sur la couleur de texte par défaut (COLOR_WINDOWTEXT). Pour les barres de défilement, le système utilise un pinceau ayant la couleur de barre de défilement par défaut (COLOR_SCROLLBAR). Dans ce cas, les couleurs d’arrière-plan et de premier plan du contexte de l’appareil d’affichage sont respectivement définies sur le blanc et le noir.
Traitement des messages par défaut de boîte de dialogue
La procédure de fenêtre de la classe de boîte de dialogue prédéfinie effectue le traitement par défaut de tous les messages que la procédure de boîte de dialogue ne traite pas. Lorsque la procédure de boîte de dialogue retourne FALSE pour n’importe quel message, la procédure de fenêtre prédéfinie vérifie les messages et effectue les actions par défaut suivantes :
Message | Action par défaut |
---|---|
DM_GETDEFID | Vous pouvez envoyer ce message à une boîte de dialogue. La boîte de dialogue retourne l’identificateur de contrôle du bouton push par défaut, si la boîte de dialogue en contient un ; sinon, il retourne zéro. |
DM_REPOSITION | Vous pouvez envoyer ce message à une boîte de dialogue de niveau supérieur. La boîte de dialogue se repositionne pour qu’elle s’intègre dans la zone du bureau. |
DM_SETDEFID | Vous pouvez envoyer ce message à une boîte de dialogue. La boîte de dialogue définit le bouton push par défaut sur le contrôle spécifié par l’identificateur de contrôle dans le paramètre wParam . |
WM_ACTIVATE | Restaure le focus d’entrée sur le contrôle identifié par le handle précédemment enregistré si la boîte de dialogue est activée. Sinon, la procédure enregistre le handle dans le contrôle ayant le focus d’entrée. |
WM_CHARTOITEM | Retourne zéro. |
WM_CLOSE | Publie le message de notification BN_CLICKED dans la boîte de dialogue, en spécifiant IDCANCEL comme identificateur de contrôle. Si la boîte de dialogue a un identificateur de contrôle IDCANCEL et que le contrôle est actuellement désactivé, la procédure sonne un avertissement et ne publie pas le message. |
WM_COMPAREITEM | Retourne zéro. |
WM_ERASEBKGND | Remplit la zone cliente de la boîte de dialogue à l’aide du pinceau retourné à partir du message WM_CTLCOLORDLG ou avec la couleur de fenêtre par défaut. |
WM_GETFONT | Retourne un handle à la police de boîte de dialogue définie par l’application. |
WM_INITDIALOG | Retourne zéro. |
WM_LBUTTONDOWN | Envoie un message CB_SHOWDROPDOWN à la zone de liste déroulante avec le focus d’entrée, en indiquant au contrôle de masquer sa zone de liste déroulante. La procédure appelle DefWindowProc pour effectuer l’action par défaut. |
WM_NCDESTROY | Libère la mémoire globale allouée aux contrôles de modification dans la boîte de dialogue (s’applique aux boîtes de dialogue qui spécifient le style DS_LOCALEDIT ) et libère toute police définie par l’application (s’applique aux boîtes de dialogue qui spécifient le style DS_SETFONT ou DS_SHELLFONT ). La procédure appelle la fonction DefWindowProc pour effectuer l’action par défaut. |
WM_NCLBUTTONDOWN | Envoie un message CB_SHOWDROPDOWN à la zone de liste déroulante avec le focus d’entrée, en indiquant au contrôle de masquer sa zone de liste déroulante. La procédure appelle DefWindowProc pour effectuer l’action par défaut. |
WM_NEXTDLGCTL | Définit le focus d’entrée sur le contrôle suivant ou précédent dans la boîte de dialogue, sur le contrôle identifié par le handle dans le paramètre wParam ou sur le premier contrôle de la boîte de dialogue qui est visible, non désactivé et qui a le style WS_TABSTOP . La procédure ignore ce message si la fenêtre active avec le focus d’entrée n’est pas un contrôle. |
WM_SETFOCUS | Définit le focus d’entrée sur le contrôle identifié par un handle de fenêtre de contrôle précédemment enregistré. S’il n’existe aucun handle de ce type, la procédure définit le focus d’entrée sur le premier contrôle dans le modèle de boîte de dialogue qui est visible, non désactivé, et qui a le style WS_TABSTOP . S’il n’existe aucun contrôle de ce type, la procédure définit le focus d’entrée sur le premier contrôle du modèle. |
WM_SHOWWINDOW | Enregistre un handle dans le contrôle avec le focus d’entrée si la boîte de dialogue est masquée, puis appelle DefWindowProc pour terminer l’action par défaut. |
WM_SYSCOMMAND | Enregistre un handle dans le contrôle avec le focus d’entrée si la boîte de dialogue est réduite, puis appelle DefWindowProc pour terminer l’action par défaut. |
WM_VKEYTOITEM | Retourne zéro. |
La procédure de fenêtre prédéfinie transmet tous les autres messages à DefWindowProc pour le traitement par défaut.
Interface clavier de boîte de dialogue
Le système fournit une interface clavier spéciale pour les boîtes de dialogue qui effectue un traitement spécial pour plusieurs touches. L’interface génère des messages qui correspondent à certains boutons de la boîte de dialogue ou modifie le focus d’entrée d’un contrôle à un autre. Voici les clés utilisées dans cette interface et leurs actions respectives.
Clé | Action |
---|---|
ALT+mnémonique | Déplace le focus d’entrée vers le premier contrôle (avec le style WS_TABSTOP ) après le contrôle statique contenant le mnémonique spécifié. |
INACTIF | Déplace le focus d’entrée vers le contrôle suivant dans le groupe. |
ENTRÉE | Envoie un message WM_COMMAND à la procédure de boîte de dialogue. Le paramètre wParam est défini sur IDOK ou l’identificateur de contrôle du bouton push par défaut. |
ÉCHAP | Envoie un message WM_COMMAND à la procédure de boîte de dialogue. Le paramètre wParam est défini sur IDCANCEL. |
LEFT | Déplace le focus d’entrée vers le contrôle précédent du groupe. |
Mnémonique | Déplace le focus d’entrée vers le premier contrôle (avec le style WS_TABSTOP ) après le contrôle statique contenant le mnémonique spécifié. |
RIGHT | Déplace le focus d’entrée vers le contrôle suivant dans le groupe. |
Maj+Tab | Déplace le focus d’entrée vers le contrôle précédent qui a le style WS_TABSTOP . |
Tab | Déplace le focus d’entrée vers le contrôle suivant qui a le style WS_TABSTOP . |
UP | Déplace le focus d’entrée vers le contrôle précédent du groupe. |
Le système fournit automatiquement l’interface clavier pour toutes les boîtes de dialogue modales. Il ne fournit pas l’interface pour les boîtes de dialogue modeless, sauf si l’application appelle la fonction IsDialogMessage pour filtrer les messages dans sa boucle de message main. Cela signifie que l’application doit passer le message à IsDialogMessage immédiatement après avoir récupéré le message de la file d’attente des messages. La fonction traite les messages s’il s’agit de la boîte de dialogue et retourne une valeur différente de zéro pour indiquer que le message a été traité et ne doit pas être passé à la fonction TranslateMessage ou DispatchMessage .
Étant donné que l’interface clavier de la boîte de dialogue utilise des touches de direction pour se déplacer entre les contrôles d’une boîte de dialogue, une application ne peut pas utiliser ces touches pour faire défiler le contenu d’une boîte de dialogue modale ou d’une boîte de dialogue sans mode pour laquelle IsDialogMessage est appelé. Lorsqu’une boîte de dialogue comporte des barres de défilement, l’application doit fournir une autre interface clavier pour les barres de défilement. Notez que l’interface souris pour le défilement est disponible lorsque le système inclut une souris.
The WS_TABSTOP Style
Le style WS_TABSTOP spécifie les contrôles vers lesquels l’utilisateur peut se déplacer en appuyant sur la touche TAB ou maj+tabulation.
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 le focus d’entrée. Il envoie au contrôle un message WM_GETDLGCODE , et si le contrôle retourne 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 par le contrôle qui a actuellement le focus d’entrée et se poursuit 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 de manière récursive 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.
The WS_GROUP Style
Par défaut, le système déplace le focus d’entrée sur le contrôle suivant ou précédent chaque fois que l’utilisateur appuie sur une touche de direction. Tant que le contrôle actuel avec le focus d’entrée ne traite pas ces clés et que le contrôle suivant ou précédent n’est pas un contrôle statique, le système continue à déplacer le focus d’entrée dans tous les contrôles de la boîte de dialogue à mesure que l’utilisateur continue d’appuyer sur les touches de direction.
Une application peut utiliser le style WS_GROUP pour modifier ce comportement par défaut. Le style marque le début d’un groupe de contrôles. Si un contrôle du groupe a le focus d’entrée lorsque l’utilisateur commence à appuyer sur les touches de direction, le focus reste dans le groupe. En général, le premier contrôle d’un groupe doit avoir le style WS_GROUP et tous les autres contrôles du groupe ne doivent pas avoir ce style. Tous les contrôles du groupe doivent être contigus, c’est-à-dire qu’ils doivent avoir été créés consécutivement sans qu’aucun contrôle n’intervienne.
Lorsque l’utilisateur appuie sur une touche de direction, le système détermine d’abord si le contrôle actuel ayant le focus d’entrée traite les touches de direction. Le système envoie un message WM_GETDLGCODE au contrôle et, si le contrôle retourne la valeur DLGC_WANTARROWS , transmet la clé au contrôle. Sinon, le système utilise la fonction GetNextDlgGroupItem pour déterminer le contrôle suivant dans le groupe.
GetNextDlgGroupItem recherche les contrôles dans l’ordre (ou l’ordre inverse) dans lequel ils ont été créés. Si l’utilisateur appuie sur la touche DROITE ou BAS, GetNextDlgGroupItem retourne le contrôle suivant si ce contrôle n’a pas le style WS_GROUP. Sinon, la fonction inverse l’ordre de la recherche et retourne le premier contrôle qui a le style WS_GROUP . Si l’utilisateur appuie sur la touche GAUCHE ou HAUT, la fonction retourne le contrôle précédent, sauf si le contrôle actuel a déjà le style WS_GROUP . Si le contrôle actuel a ce style, la fonction inverse l’ordre de la recherche, recherche le premier contrôle ayant le style WS_GROUP et retourne le contrôle qui précède immédiatement le contrôle situé.
Si la recherche du contrôle suivant dans le groupe rencontre une fenêtre avec le style WS_EX_CONTROLPARENT , le système recherche de manière récursive les enfants de la fenêtre.
Une fois que le système a le contrôle suivant ou précédent, il envoie un message WM_GETDLGCODE au contrôle pour déterminer le type de contrôle. Le système déplace ensuite le focus d’entrée pour contrôler s’il ne s’agit pas d’un contrôle statique. Si le contrôle est une case d’option automatique, le système lui envoie un message BM_CLICK . Une application peut également utiliser GetNextDlgGroupItem pour localiser des contrôles dans un groupe.
En règle générale, le premier contrôle du groupe combine les styles WS_GROUP et WS_TABSTOP afin que l’utilisateur puisse passer d’un groupe à l’autre à l’aide de la touche TAB. Si le groupe contient des cases d’option, l’application doit appliquer le style WS_TABSTOP uniquement au premier contrôle du groupe. Le système déplace automatiquement le style lorsque l’utilisateur se déplace entre les contrôles du groupe. Cela garantit que le focus d’entrée sera toujours sur le dernier contrôle sélectionné lorsque l’utilisateur passe au groupe à l’aide de la touche TAB.
Mnemonics
Un mnémonique est une lettre ou un chiffre sélectionné dans l’étiquette d’un bouton ou dans le texte d’un contrôle statique. Le système déplace le focus d’entrée sur le contrôle associé au mnémonique chaque fois que l’utilisateur appuie sur la touche qui correspond au mnémonique ou appuie sur cette touche et la touche ALT en combinaison. Les mnémoniques permettent à l’utilisateur de passer rapidement à un contrôle spécifié à l’aide du clavier.
Une application crée un mnémonique pour un contrôle en insérant l’esperluette (&) juste avant la lettre ou le chiffre sélectionné dans l’étiquette ou le texte du contrôle. Dans la plupart des cas, la chaîne terminée par null fournie avec le contrôle dans le modèle de boîte de dialogue contient l’esperluette. Toutefois, une application peut créer un mnémonique à tout moment en remplaçant l’étiquette ou le texte existant d’un contrôle à l’aide de la fonction SetDlgItemText . Un seul mnémonique peut être spécifié pour chaque contrôle. Bien qu’il soit recommandé, les mnémoniques dans une boîte de dialogue n’ont pas besoin d’être uniques.
Lorsque l’utilisateur appuie sur une lettre ou une touche numérique, le système détermine d’abord si le contrôle actuel ayant le focus d’entrée traite la clé. Le système envoie un message WM_GETDLGCODE au contrôle, et si le contrôle retourne la valeur DLGC_WANTALLKEYS ou DLG_WANTMESSAGE , le système transmet la clé au contrôle. Sinon, il recherche un contrôle dont le mnémonique correspond à la lettre ou au chiffre spécifié. Il continue à rechercher jusqu’à ce qu’il localise un contrôle ou qu’il ait examiné tous les contrôles. Pendant la recherche, il ignore tous les contrôles statiques qui ont le style SS_NOPREFIX .
Si la recherche d’un contrôle avec un mnémonique correspondant rencontre une fenêtre avec le style WS_EX_CONTROLPARENT , le système recherche de manière récursive les enfants de la fenêtre.
Si le système localise un contrôle statique et que le contrôle n’est pas désactivé, le système déplace le focus d’entrée sur le premier contrôle après le contrôle statique qui est visible, non désactivé et qui a le style WS_TABSTOP . Si le système localise un autre contrôle qui a un mnémonique correspondant, il déplace le focus d’entrée sur ce contrôle. Si le contrôle est un bouton pousseur par défaut, le système envoie un message de notification BN_CLICKED à la procédure de boîte de dialogue. Si le contrôle est un autre style de bouton et qu’aucun autre contrôle dans la boîte de dialogue n’a le même mnémonique, le système envoie le message BM_CLICK au contrôle.
Paramètres de la boîte de dialogue
Les paramètres de la boîte de dialogue sont les sélections et les valeurs actuelles des contrôles dans la boîte de dialogue. La procédure de boîte de dialogue est chargée d’initialiser les contrôles à ces paramètres lors de la création de la boîte de dialogue. Il est également chargé de récupérer les paramètres actuels à partir des contrôles avant de détruire la boîte de dialogue. Les méthodes utilisées pour initialiser et récupérer des paramètres dépendent du type de contrôle.
Pour plus d'informations, voir les rubriques suivantes :
- Cases d’option et cases à cocher
- Contrôles de modification de la boîte de dialogue
- Zones de liste, zones de liste déroulante et listes de répertoires
- Messages de contrôle de boîte de dialogue
Cases d’option et cases à cocher
Les boîtes de dialogue utilisent des cases d’option et des zones case activée pour permettre à l’utilisateur de choisir dans une liste d’options. Les cases d’option permettent à l’utilisateur de choisir parmi des options mutuellement exclusives ; case activée zones permettent à l’utilisateur de choisir une combinaison d’options.
La procédure de boîte de dialogue peut définir l’état initial d’une zone de case activée à l’aide de la fonction CheckDlgButton, qui définit ou désactive la zone case activée. Pour les cases d’option d’un groupe de cases d’option mutuellement exclusives, la procédure de boîte de dialogue peut utiliser la fonction CheckRadioButton pour définir la case d’option appropriée et effacer automatiquement toute autre case d’option.
Avant la fin d’une boîte de dialogue, la procédure de boîte de dialogue peut case activée l’état de chaque case d’option et case activée zone à l’aide de la fonction IsDlgButtonChecked, qui retourne l’état actuel du bouton. Une boîte de dialogue enregistre généralement ces informations pour initialiser les boutons lors de la prochaine création de la boîte de dialogue.
Contrôles de modification de la boîte de dialogue
De nombreuses boîtes de dialogue ont des contrôles d’édition qui permettent à l’utilisateur de fournir du texte comme entrée. La plupart des procédures de boîte de dialogue initialisent un contrôle d’édition lors du premier démarrage de la boîte de dialogue. Par exemple, la procédure de boîte de dialogue peut placer un nom de fichier proposé dans le contrôle que l’utilisateur peut ensuite sélectionner, modifier ou remplacer. La procédure de boîte de dialogue peut définir le texte dans un contrôle d’édition à l’aide de la fonction SetDlgItemText , qui copie le texte d’une mémoire tampon spécifiée dans le contrôle d’édition. Lorsque le contrôle d’édition reçoit le focus d’entrée, il sélectionne automatiquement le texte complet à modifier.
Étant donné que les contrôles d’édition ne retournent pas automatiquement leur texte dans la boîte de dialogue, la procédure de boîte de dialogue doit récupérer le texte avant qu’il ne se termine. Il peut récupérer le texte à l’aide de la fonction GetDlgItemText , qui copie le texte du contrôle d’édition dans une mémoire tampon. La procédure de boîte de dialogue enregistre généralement ce texte pour initialiser le contrôle d’édition ultérieurement ou le transmet à la fenêtre parente pour traitement.
Certaines boîtes de dialogue utilisent des contrôles de modification qui permettent à l’utilisateur d’entrer des nombres. La procédure de boîte de dialogue peut récupérer un nombre à partir d’un contrôle d’édition à l’aide de la fonction GetDlgItemInt , qui récupère le texte du contrôle d’édition et convertit le texte en valeur décimale. L’utilisateur tape le nombre en chiffres décimaux. Il peut être signé ou non signé. La procédure de boîte de dialogue peut afficher un entier à l’aide de la fonction SetDlgItemInt . SetDlgItemInt convertit un entier signé ou non signé en une chaîne de chiffres décimaux.
Zones de liste, zones de liste déroulante et listes de répertoires
Certaines boîtes de dialogue affichent des listes de noms à partir desquelles l’utilisateur peut sélectionner un ou plusieurs noms. Pour afficher une liste de noms de fichiers, par exemple, une boîte de dialogue utilise généralement une zone de liste et les fonctions DlgDirList et DlgDirSelectEx . La fonction DlgDirList remplit automatiquement une zone de liste avec les noms de fichiers dans le répertoire actif. La fonction DlgDirSelect récupère le nom de fichier sélectionné à partir de la zone de liste. Ensemble, ces deux fonctions offrent un moyen pratique pour une boîte de dialogue d’afficher une liste de répertoires afin que l’utilisateur puisse sélectionner un fichier sans avoir à taper son nom et son emplacement.
Une boîte de dialogue peut également utiliser une zone de liste déroulante pour afficher une liste de noms de fichiers. La fonction DlgDirListComboBox remplit automatiquement une partie de zone de liste de la zone de liste modifiable avec les noms de fichiers dans le répertoire actif. La fonction DlgDirSelectComboBoxEx récupère un nom de fichier sélectionné à partir de la partie de la zone de liste.
Messages de contrôle de boîte de dialogue
De nombreux contrôles reconnaissent les messages prédéfinis qui, lorsqu’ils sont reçus par les contrôles, les amènent à effectuer une action. Par exemple, le message BM_SETCHECK définit le case activée dans une zone de case activée et le message EM_GETSEL récupère la partie du texte du contrôle actuellement sélectionnée. Les messages de contrôle donnent à une procédure de dialogue un accès plus large et plus flexible aux contrôles que les fonctions standard. Ils sont donc souvent utilisés lorsque la boîte de dialogue nécessite des interactions complexes avec l’utilisateur.
Une procédure de boîte de dialogue peut envoyer un message à un contrôle en fournissant l’identificateur du contrôle et en utilisant la fonction SendDlgItemMessage , qui est identique à la fonction SendMessage , sauf qu’elle utilise un identificateur de contrôle au lieu d’un handle de fenêtre pour identifier le contrôle qui doit recevoir le message. Un message spécifié peut nécessiter que la procédure de dialogue envoie des paramètres avec le message, et le message peut avoir des valeurs de retour correspondantes. L’opération et les exigences de chaque message de contrôle dépendent de l’objectif du message et du contrôle qui le traite.
Pour plus d’informations sur les messages de contrôle, consultez Contrôles Windows.
Boîtes de dialogue personnalisées
Une application peut créer des boîtes de dialogue personnalisées à l’aide d’une classe de fenêtre définie par l’application pour les boîtes de dialogue au lieu d’utiliser la classe de boîte de dialogue prédéfinie. Les applications utilisent généralement cette méthode lorsqu’une boîte de dialogue est leur fenêtre main, mais elle est également utile pour créer des boîtes de dialogue modales et sans mode pour les applications qui ont des fenêtres standard qui se chevauchent.
La classe de fenêtre définie par l’application permet à l’application de définir une procédure de fenêtre pour la boîte de dialogue et de traiter les messages avant de les envoyer à la procédure de boîte de dialogue. Il permet également à l’application de définir une icône de classe, un pinceau d’arrière-plan de classe et un menu de classe pour la boîte de dialogue. L’application doit inscrire la classe window avant de tenter de créer une boîte de dialogue et doit fournir le modèle de boîte de dialogue avec la valeur atom ou le nom de la classe de fenêtre.
De nombreuses applications créent une classe de boîte de dialogue en récupérant d’abord les informations de classe pour la classe de boîte de dialogue prédéfinie et en les transmettant à la fonction GetClassInfo , qui remplit une structure WNDCLASS avec les informations. L’application modifie des membres individuels de la structure, tels que le nom de la classe, le pinceau et l’icône, puis inscrit la nouvelle classe à l’aide de la fonction RegisterClass . Si une application remplit la structure WNDCLASS seule, elle doit définir le membre cbWndExtra sur DLGWINDOWEXTRA, qui correspond au nombre d’octets supplémentaires requis par le système pour chaque boîte de dialogue. Si une application utilise également des octets supplémentaires pour chaque boîte de dialogue, ils doivent être au-delà des octets supplémentaires requis par le système.
La procédure de fenêtre pour la boîte de dialogue personnalisée a les mêmes paramètres et exigences que toute autre procédure de fenêtre. Toutefois, contrairement à d’autres procédures de fenêtre, la procédure de fenêtre de cette boîte de dialogue doit appeler la fonction DefDlgProc au lieu de la fonction DefWindowProc pour tous les messages qu’elle ne traite pas. DefDlgProc effectue le même traitement de message par défaut que la procédure de fenêtre pour la boîte de dialogue prédéfinie, qui inclut l’appel de la procédure de boîte de dialogue.
Une application peut également créer des boîtes de dialogue personnalisées en sous-classant la procédure de fenêtre de la boîte de dialogue prédéfinie. La fonction SetWindowLong permet à une application de spécifier la procédure de fenêtre pour une fenêtre spécifiée. L’application peut également tenter de sous-classe à l’aide de la fonction SetClassLong , mais cela affecte toutes les boîtes de dialogue du système, pas seulement celles qui appartiennent à l’application.
Les applications qui créent des boîtes de dialogue personnalisées fournissent parfois une autre interface clavier pour les boîtes de dialogue. Pour les boîtes de dialogue sans mode, cela peut signifier que l’application n’appelle pas la fonction IsDialogMessage et traite à la place toutes les entrées clavier dans la procédure de fenêtre personnalisée. Dans ce cas, l’application peut utiliser le message WM_NEXTDLGCTL pour réduire le code nécessaire pour déplacer le focus d’entrée d’un contrôle à un autre. Ce message, lorsqu’il est passé à DefDlgProc, déplace le focus d’entrée vers un contrôle spécifié et met à jour l’apparence des contrôles, comme le déplacement de la bordure du bouton poussif par défaut ou la définition d’une case d’option automatique.