Personnalisation des boîtes de dialogue courantes

Vous pouvez utiliser les boîtes de dialogue courantes dans leur forme standard, ou vous pouvez les personnaliser. Du point de vue de l’utilisateur, le principal avantage de la boîte de dialogue commune est son apparence et ses fonctionnalités cohérentes d’une application à l’autre. Par conséquent, il est important de personnaliser une boîte de dialogue commune uniquement lorsque cela est absolument nécessaire pour une application. Sinon, l’apparence cohérente et l’interface de codage simple sont perdues. Les personnalisations appropriées laissent intactes autant de contrôles d’origine que possible. L’augmentation de la taille de la boîte de dialogue ou l’ajout de nouveaux contrôles dans l’espace déjà disponible dans la boîte de dialogue est une personnalisation appropriée. Le masquage des contrôles d’origine ou la modification des fonctionnalités prévues des contrôles d’origine est une personnalisation moins appropriée.

Cette section décrit les méthodes suivantes pour personnaliser une boîte de dialogue commune :

Modèles personnalisés

Les boîtes de dialogue courantes ont des modèles par défaut qui définissent le nombre, le type et la position des contrôles standard dans la boîte de dialogue. Vous pouvez définir un modèle personnalisé pour permettre aux utilisateurs d’accéder à des contrôles supplémentaires propres à votre application.

Pour toutes les boîtes de dialogue courantes, à l’exception des boîtes de dialogue Ouvrir et Enregistrer sous de style Explorer, vous modifiez le modèle par défaut pour créer un modèle personnalisé qui remplace le modèle par défaut. Le modèle personnalisé définit le type et la position des contrôles standard, ainsi que tous les contrôles supplémentaires.

Lorsque vous créez un modèle de boîte de dialogue personnalisé en modifiant le modèle de boîte de dialogue par défaut, assurez-vous que les identificateurs des contrôles ajoutés sont uniques et ne sont pas en conflit avec les identificateurs des contrôles standard. Le tableau suivant répertorie le nom du fichier de modèle par défaut et le fichier include pour chacun des types de boîte de dialogue courants.

Type de boîte de dialogue Fichier de modèle Inclut le fichier
Color Color.dlg ColorDlg.h
Rechercher Findtext.dlg Dlgs.h
Police Font.dlg Dlgs.h
Ouvrir (sélection multiple) Fileopen.dlg Dlgs.h
Ouvrir (sélection unique) Fileopen.dlg Dlgs.h
Mise en page Prnsetup.dlg Dlgs.h
Imprimer Prnsetup.dlg Dlgs.h
Configuration d’impression (obsolète) Prnsetup.dlg Dlgs.h
Replace Findtext.dlg Dlgs.h

Pour activer un modèle personnalisé, vous devez définir un indicateur dans le membre Indicateurs de la structure correspondante pour la boîte de dialogue. Si le modèle est une ressource dans une application ou une bibliothèque de liens dynamiques, définissez un indicateur ENABLETEMPLATE dans le membre Flags et utilisez les membres hInstance et lpTemplateName de la structure pour identifier le nom du module et de la ressource. Si le modèle est déjà en mémoire, définissez un indicateur ENABLETEMPLATEHANDLE dans le membre Flags et utilisez le membre hInstance pour identifier l’objet mémoire qui contient le modèle.

Dans la plupart des cas, vous devez également activer une procédure de hook pour la boîte de dialogue afin de prendre en charge et traiter les entrées pour les contrôles supplémentaires dans votre modèle personnalisé.

Pour les boîtes de dialogue Ouvrir et Enregistrer sous de style Explorer, les modèles par défaut ne sont pas disponibles pour modification. Au lieu de cela, votre modèle personnalisé définit une boîte de dialogue enfant qui inclut uniquement les éléments à ajouter à la boîte de dialogue standard. Le modèle personnalisé peut également définir un contrôle statique qui spécifie l’emplacement du cluster de contrôles standard dans la boîte de dialogue enfant. Pour plus d’informations, consultez Modèles personnalisés de style Explorer.

Procédures de hook pour les boîtes de dialogue courantes

Pour chacune des boîtes de dialogue courantes, vous pouvez activer une procédure de hook pour traiter les messages de la procédure de boîte de dialogue par défaut. Il existe deux types généraux de procédures de hook de dialogue courantes :

  • Procédure de crochet standard utilisée avec les boîtes de dialogue les plus courantes
  • Procédure de crochet de style Explorer prise en charge par les boîtes de dialogue Ouvrir et Enregistrer sous

Lorsque vous fournissez une procédure de hook standard pour l’une des boîtes de dialogue courantes, la procédure de boîte de dialogue par défaut gère ses messages comme suit.

Message Gestion
WM_INITDIALOG La procédure de boîte de dialogue par défaut traite le message avant de le passer à la procédure de hook. Le paramètre lParam du message est un pointeur vers la structure d’initialisation spécifiée lors de la création du dialogue.
Tous les autres messages La procédure de hook reçoit le message en premier. Ensuite, la valeur de retour de la procédure de hook détermine si la procédure de dialogue par défaut traite le message ou l’ignore.

Pour les boîtes de dialogue Ouvrir et Enregistrer sous de style Explorer, la procédure de crochet ne reçoit pas de messages destinés aux contrôles standard dans la boîte de dialogue. Au lieu de cela, il reçoit des messages de notification de la boîte de dialogue et des messages pour tous les contrôles supplémentaires que vous avez définis dans un modèle personnalisé. Pour plus d’informations, consultez Procédures de crochet de style Explorer.

Pour activer une procédure de hook, définissez une valeur ENABLEHOOK dans le membre Flags de la structure correspondante pour la boîte de dialogue. Si un indicateur ENABLEHOOK est défini, un membre lpfnHook de la structure doit spécifier l’adresse de la procédure de hook.

Le tableau suivant montre le type de procédure de hook à fournir pour chacune des boîtes de dialogue courantes.

Type de boîte de dialogue Procédure hook
Color CCHookProc
Rechercher ou remplacer FRHookProc
Police CFHookProc
Ouvrir ou Enregistrer sous (style Explorer) OFNHookProc
Ouvrir ou Enregistrer sous (ancien style) OFNHookProcOldStyle
Imprimer PrintHookProc
Mise en page PageSetupHook

Pour la boîte de dialogue Mise en page , vous pouvez également spécifier une procédure de crochet PagePaintHook . Il s’agit d’une procédure de hook spéciale que vous pouvez utiliser pour personnaliser l’apparence de l’exemple de page affiché par la boîte de dialogue Mise en page.

Notes

La boîte de dialogue Configuration d’impression a été remplacée par la boîte de dialogue Mise en page . Les applications doivent utiliser la boîte de dialogue Mise en page . Toutefois, à des fins de compatibilité, la fonction PrintDlg continue de prendre en charge l’affichage de la boîte de dialogue Configuration d’impression . Vous pouvez fournir une procédure de crochet SetupHookProc pour la boîte de dialogue Configuration d’impression .

Messages de boîte de dialogue courants

Les boîtes de dialogue courantes utilisent des messages pour notifier votre procédure de fenêtre ou votre procédure de hook lorsque certains événements se produisent. En outre, vous pouvez envoyer des messages à une boîte de dialogue commune pour récupérer des informations ou contrôler le comportement ou l’apparence de la boîte de dialogue. Cette section décrit les messages de boîte de dialogue courants inscrits par la fonction RegisterWindowMessage, les messages utilisés par les boîtes de dialogue Police et Mise en page, ainsi que les messages utilisés par les boîtes de dialogue Ouvrir et Enregistrer sous de style Explorer.

La bibliothèque de boîtes de dialogue commune définit un ensemble de chaînes de message. Vous pouvez passer une constante associée à l’une de ces chaînes de message à RegisterWindowMessage pour obtenir un identificateur de message. Vous pouvez ensuite utiliser l’identificateur pour détecter et traiter les messages envoyés à partir d’une boîte de dialogue commune ou pour envoyer des messages à une boîte de dialogue commune. Le tableau suivant montre les constantes de message et décrit leur utilisation.

Contants Utilisation
COLOROKSTRING Une boîte de dialogue Couleur envoie ce message à la procédure de crochet lorsque l’utilisateur sélectionne une couleur et clique sur le bouton OK . La procédure de crochet peut accepter la couleur ou la rejeter et forcer l’ouverture de la boîte de dialogue.
FILEOKSTRING Une boîte de dialogue Ouvrir ou Enregistrer sous envoie ce message à la procédure de crochet lorsque l’utilisateur sélectionne un nom de fichier et clique sur le bouton OK . La procédure de crochet peut accepter le nom du fichier, ou le rejeter et forcer la boîte de dialogue à rester ouverte. Pour les boîtes de dialogue Ouvrir et Enregistrer sous de style Explorer, ce message a été remplacé par le message de notification CDN_FILEOK.
FINDMSGSTRING Une boîte de dialogue Rechercher ou remplacer envoie ce message à la procédure de fenêtre de sa fenêtre parente lorsque l’utilisateur clique sur Rechercher suivant, Remplacer ou Remplacer tout, ou ferme la boîte de dialogue. Le paramètre lParam du message est un pointeur vers une structure FINDREPLACE contenant l’entrée de l’utilisateur.
HELPMSGSTRING Toutes les boîtes de dialogue courantes envoient ce message à la procédure de fenêtre de leur fenêtre parente lorsque l’utilisateur clique sur le bouton Aide . Pour les boîtes de dialogue Ouvrir et Enregistrer sous de style Explorer, ce message a été remplacé par le message de notification CDN_HELP.
LBSELCHSTRING Une boîte de dialogue Ouvrir ou Enregistrer sous envoie ce message à la procédure de hook lorsque l’utilisateur modifie la sélection dans la zone de liste Nom de fichier . Pour les boîtes de dialogue Ouvrir et Enregistrer sous de style Explorer, ce message a été remplacé par le message de notification CDN_SELCHANGE.
SETRGBSTRING Une procédure de crochet peut envoyer ce message à une boîte de dialogue Couleur pour définir la sélection de couleur actuelle.
SHAREVISTRING Une boîte de dialogue Ouvrir ou Enregistrer sous envoie ce message à la procédure de hook si une violation de partage se produit pour le fichier sélectionné lorsque l’utilisateur clique sur le bouton OK . Pour les boîtes de dialogue Ouvrir et Enregistrer sous de style Explorer, ce message a été remplacé par le message de notification CDN_SHAREVIOLATION.

Certaines boîtes de dialogue courantes envoient et reçoivent d’autres messages de fenêtre. La procédure de crochet d’une boîte de dialogue Police peut envoyer n’importe lequel des messages WM_CHOOSEFONT_* à la boîte de dialogue Police . Pour plus d’informations, consultez Boîte de dialogue Police. La boîte de dialogue Mise en page envoie les messages WM_PSD_* si vous avez activé une procédure de crochet PagePaintHook . Pour plus d’informations, consultez Boîte de dialogue Mise en page.

Les boîtes de dialogue Ouvrir et Enregistrer sous de style Explorer prennent en charge un ensemble de messages prédéfinis. Il s’agit notamment des messages de notification envoyés sous la forme d’un message WM_NOTIFY à votre procédure de hook et des messages que votre procédure de hook peut envoyer à la boîte de dialogue. Pour obtenir la liste complète de ces messages, consultez Procédures de crochet de style Explorer.

Support d’aide

Les boîtes de dialogue courantes fournissent une aide contextuelle pour les contrôles standard de la boîte de dialogue. Pour fournir une aide supplémentaire pour une boîte de dialogue commune, vous pouvez afficher un bouton Aide et traiter les messages générés lorsque l’utilisateur clique sur le bouton. Le bouton Aide est un complément à l’aide contextuelle par défaut. Le bouton Aide est utile pour décrire l’objectif général de la boîte de dialogue telle qu’elle s’applique à votre application.

aide Context-Sensitive

Toutes les boîtes de dialogue courantes fournissent une aide contextuelle pour les contrôles standard de la boîte de dialogue. L’utilisateur peut afficher de l’aide pour les contrôles individuels à l’aide de l’une des méthodes suivantes :

  • Sélectionnez le contrôle et appuyez sur la touche F1.
  • Cliquez sur le bouton ? dans la barre de titre, puis cliquez sur un contrôle.
  • Cliquez sur le bouton droit de la souris sur un contrôle.

Si vous personnalisez une boîte de dialogue en ajoutant de nouveaux contrôles, vous devez également étendre la prise en charge de l’aide pour ces contrôles en traitant les demandes d’aide dans la procédure de hook. La procédure de hook reçoit les messages suivants lorsque l’utilisateur demande de l’aide.

Action requise Message
Cliquez sur le bouton droit de la souris sur un contrôle. WM_CONTEXTMENU
Appuyez sur la touche F1 . WM_HELP
Cliquez sur le bouton ? de la barre de titre, puis cliquez sur un contrôle. WM_HELP

Vous devez traiter ces messages pour les contrôles que vous avez ajoutés, mais laissez la procédure de boîte de dialogue par défaut traiter les messages pour les contrôles standard. Pour plus d’informations sur le traitement de ces messages, consultez Aide.

Bouton d'aide

Vous pouvez afficher un bouton Aide dans l’une des boîtes de dialogue courantes en définissant une valeur SHOWHELP dans le membre Indicateurs de la structure d’initialisation de la boîte de dialogue. Si vous affichez le bouton Aide , vous devez traiter la demande d’aide de l’utilisateur. Le traitement peut être effectué dans l’une des procédures de fenêtre de votre application ou dans une procédure de hook pour la boîte de dialogue. En règle générale, vous traitez la demande d’aide en appelant la fonction WinHelp .

Pour traiter les messages d’aide dans l’une de vos procédures de fenêtre, vous devez obtenir un identificateur de message pour la chaîne définie par la valeur HELPMSGSTRING et identifier la fenêtre pour recevoir les messages. Pour obtenir l’identificateur de message, spécifiez HELPMSGSTRING comme paramètre dans un appel à la fonction RegisterWindowMessage . Lorsque vous créez la boîte de dialogue, utilisez le membre hwndOwner de la structure d’initialisation de la boîte de dialogue pour identifier la fenêtre qui doit recevoir les messages. La procédure de boîte de dialogue envoie le message à la procédure de fenêtre chaque fois que l’utilisateur clique sur le bouton Aide .

Pour traiter les messages d’aide dans une procédure de hook, vous devez traiter le message WM_COMMAND . La procédure de hook fournit de l’aide si le paramètre wParam de ce message indique que l’utilisateur a cliqué sur le bouton Aide . L’identificateur du bouton Aide est la constante pshHelp définie dans le fichier Dlgs.h.

Les procédures de crochet pour les boîtes de dialogue Ouvrir et Enregistrer sous de style Explorer ne reçoivent pas de messages WM_COMMAND pour le bouton Aide. Au lieu de cela, la boîte de dialogue envoie un message de notification CDN_HELP à la procédure de crochet lorsque vous cliquez sur le bouton Aide .