TN024 : messages et ressources définis par MFC
Remarque
La note technique suivante n'a pas été mise à jour depuis son inclusion initiale dans la documentation en ligne. Par conséquent, certaines procédures et rubriques peuvent être obsolètes ou incorrectes. Pour obtenir les informations les plus récentes, il est recommandé de rechercher l'objet qui vous intéresse dans l'index de la documentation en ligne.
Cette note décrit les messages Windows internes et les formats de ressources utilisés par MFC. Ces informations expliquent l’implémentation de l’infrastructure et vous aideront à déboguer votre application. Pour l’aventure, même si toutes ces informations ne sont officiellement pas prises en charge, vous pouvez utiliser certaines de ces informations pour des implémentations avancées.
Cette note contient les détails de l’implémentation privée MFC ; tous les contenus sont susceptibles de changer à l’avenir. Les messages Windows privés MFC ont une signification dans l’étendue d’une seule application, mais changeront à l’avenir pour contenir des messages à l’échelle du système.
La plage de messages Windows privés MFC et les types de ressources se trouvent dans la plage réservée « système » mise de côté par Microsoft Windows. Actuellement, tous les nombres des plages ne sont pas utilisés et, à l’avenir, de nouveaux nombres dans la plage peuvent être utilisés. Les nombres actuellement utilisés peuvent être modifiés.
Les messages Windows privés MFC se trouvent dans la plage 0x360-0x37F>.
Les types de ressources privées MFC se trouvent dans la plage 0xF0-0xFF>.
Messages Windows privés MFC
Ces messages Windows sont utilisés à la place de fonctions virtuelles C++ où un couplage relativement libre est requis entre les objets de fenêtre et où une fonction virtuelle C++ ne serait pas appropriée.
Ces messages Windows privés et structures de paramètres associées sont déclarés dans l’en-tête privé MFC ' AFXPRIV. H'. Soyez averti que l’un de vos codes qui inclut cet en-tête peut s’appuyer sur un comportement non documenté et risque de s’interrompre dans les futures versions de MFC.
Dans les rares cas où vous avez besoin de gérer l’un de ces messages, vous devez utiliser la macro de mappage de messages ON_MESSAGE et gérer le message au format LRESULT/WPARAM/LPARAM générique.
WM_QUERYAFXWNDPROC
Ce message est envoyé à une fenêtre en cours de création. Ceci est envoyé très tôt dans le processus de création en tant que méthode de détermination si le WndProc est AfxWndProc. AfxWndProc retourne 1.
Paramètres et valeur de retour | Description |
---|---|
wParam | Inutilisé |
lParam | Inutilisé |
renvoie | 1 si traité par AfxWndProc |
WM_SIZEPARENT
Ce message est envoyé par une fenêtre frame à ses enfants immédiats pendant le redimensionnement (CFrameWnd::OnSize
appels CFrameWnd::RecalcLayout
qui appellent CWnd::RepositionBars
) pour repositionner les barres de contrôle autour du côté du cadre. La structure AFX_SIZEPARENTPARAMS contient le rectangle client disponible actuel du parent et d’un HDWP (qui peut être NULL) avec lequel appeler DeferWindowPos
pour réduire la réinitialisation.
Paramètres et valeur de retour | Description |
---|---|
wParam | Inutilisé |
lParam | Adresse d’une structure de AFX_SIZEPARENTPARAMS |
renvoie | Non utilisé (0) |
Ignorer le message indique que la fenêtre ne prend pas part à la disposition.
WM_SETMESSAGESTRING
Ce message est envoyé à une fenêtre frame pour lui demander de mettre à jour la ligne de message dans la barre d’état. Un ID de chaîne ou un LPCSTR peut être spécifié (mais pas les deux).
Paramètres et valeur de retour | Description |
---|---|
wParam | ID de chaîne (ou zéro) |
lParam | LPCSTR pour la chaîne (ou NULL) |
renvoie | Non utilisé (0) |
WM_IDLEUPDATECMDUI
Ce message est envoyé dans le temps d’inactivité pour implémenter la mise à jour de l’heure d’inactivité des gestionnaires d’interface utilisateur update-command. Si la fenêtre (généralement une barre de contrôle) gère le message, elle crée un CCmdUI
objet (ou un objet d’une classe dérivée) et appelle CCmdUI::DoUpdate
chacun des « éléments » dans la fenêtre. Cela case activée pour un gestionnaire de ON_UPDATE_COMMAND_UI pour les objets de la chaîne de gestionnaires de commandes.
Paramètres et valeur de retour | Description |
---|---|
wParam | BOOL bDisableIfNoHandler |
lParam | Non utilisé (0) |
renvoie | Non utilisé (0) |
bDisableIfNoHandler n’est pas différent de zéro pour désactiver l’objet d’interface utilisateur s’il n’existe ni de ON_UPDATE_COMMAND_UI ni de gestionnaire de ON_COMMAND.
WM_EXITHELPMODE
Ce message est publié dans un CFrameWnd
message qui permet de quitter le mode d’aide sensible au contexte. La réception de ce message met fin à la boucle modale démarrée par CFrameWnd::OnContextHelp
.
Valeur de paramètre et de retour | Description |
---|---|
wParam | Non utilisé (0) |
lParam | Non utilisé (0) |
renvoie | Inutilisé |
WM_INITIALUPDATE
Ce message est envoyé par le modèle de document à tous les descendants d’une fenêtre frame lorsqu’il est sûr qu’ils effectuent leur mise à jour initiale. Il mappe à un appel, CView::OnInitialUpdate
mais peut être utilisé dans d’autres CWnd
classes dérivées pour d’autres mises à jour ponctuelles.
Paramètres et valeur de retour | Description |
---|---|
wParam | Non utilisé (0) |
lParam | Non utilisé (0) |
renvoie | Non utilisé (0) |
WM_RECALCPARENT
Ce message est envoyé par une vue à sa fenêtre parente (obtenue via GetParent
) pour forcer un recalcul de disposition (généralement, le parent appellera RecalcLayout
). Cela est utilisé dans les applications serveur OLE, où il est nécessaire que l’image augmente à mesure que la taille totale de la vue augmente.
Si la fenêtre parente traite ce message, elle doit retourner TRUE et remplir le RECT passé dans lParam avec la nouvelle taille de la zone cliente. Cela est utilisé pour CScrollView
gérer correctement les barres de défilement (placer ensuite à l’extérieur de la fenêtre lorsqu’elles sont ajoutées) lorsqu’un objet serveur est activé sur place.
Paramètres et valeur de retour | Description |
---|---|
wParam | Non utilisé (0) |
lParam | LPRECT rectClient peut être NULL |
renvoie | TRUE si le nouveau rectangle client est retourné, FALSE sinon |
WM_SIZECHILD
Ce message est envoyé par COleResizeBar
sa fenêtre propriétaire (via GetOwner
) lorsque l’utilisateur redimensionne la barre de redimensionnement avec les poignées de redimensionnement. COleIPFrameWnd
répond à ce message en tentant de repositionner la fenêtre frame comme l’utilisateur l’a demandé.
Le nouveau rectangle, donné dans les coordonnées du client par rapport à la fenêtre de cadre qui contient la barre de redimensionnement, est pointé par lParam.
Paramètres et valeur de retour | Description |
---|---|
wParam | Non utilisé (0) |
lParam | LPRECT rectNew |
renvoie | Non utilisé (0) |
WM_DISABLEMODAL
Ce message est envoyé à toutes les fenêtres contextuelles appartenant à une fenêtre frame en cours de désactivation. La fenêtre frame utilise le résultat pour déterminer s’il faut ou non désactiver la fenêtre contextuelle.
Vous pouvez l’utiliser pour effectuer un traitement spécial dans votre fenêtre contextuelle lorsque le cadre entre dans un état modal ou pour empêcher la désactivation de certaines fenêtres contextuelles. Les info-bulles utilisent ce message pour se détruire lorsque la fenêtre frame passe dans un état modal, par exemple.
Paramètres et valeur de retour | Description |
---|---|
wParam | Non utilisé (0) |
lParam | Non utilisé (0) |
renvoie | Non zéro pour ne pas désactiver la fenêtre, 0 indique que la fenêtre sera désactivée |
WM_FLOATSTATUS
Ce message est envoyé à toutes les fenêtres contextuelles appartenant à une fenêtre frame lorsque le cadre est activé ou désactivé par une autre fenêtre frame de niveau supérieur. Cela est utilisé par l’implémentation de MFS_SYNCACTIVE dans CMiniFrameWnd
, pour maintenir l’activation de ces fenêtres contextuelles synchronisées avec l’activation de la fenêtre frame de niveau supérieur.
Paramètres | Description |
---|---|
wParam | Est l’une des valeurs suivantes : FS_SHOW FS_HIDE FS_ACTIVATE FS_DEACTIVATE FS_ENABLEFS_DISABLE FS_SYNCACTIVE |
lParam | Non utilisé (0) |
La valeur de retour doit être différente de zéro si FS_SYNCACTIVE est définie et que la fenêtre synchronise son activation avec le cadre parent. CMiniFrameWnd
retourne une valeur différente de zéro lorsque le style est défini sur MFS_SYNCACTIVE.
Pour plus d’informations, consultez l’implémentation de CMiniFrameWnd
.
WM_ACTIVATETOPLEVEL
Ce message est envoyé à une fenêtre de niveau supérieur lorsqu’une fenêtre de son « groupe de niveau supérieur » est activée ou désactivée. Une fenêtre fait partie d’un groupe de niveau supérieur s’il s’agit d’une fenêtre de niveau supérieur (aucun parent ou propriétaire) ou qu’elle appartient à une telle fenêtre. Ce message est similaire à WM_ACTIVATEAPP, mais fonctionne dans des situations où les fenêtres appartenant à différents processus sont mélangées dans une hiérarchie à fenêtre unique (courante dans les applications OLE).
WM_COMMANDHELP, WM_HELPHITTEST, WM_EXITHELPMODE
Ces messages sont utilisés dans l’implémentation de l’aide contextuelle. Pour plus d’informations, consultez la note technique 28 .
Formats de ressources privées MFC
Actuellement, MFC définit deux formats de ressources privées : RT_TOOLBAR et RT_DLGINIT.
format de ressource RT_TOOLBAR
La barre d’outils par défaut fournie par AppWizard est basée sur une ressource personnalisée RT_TOOLBAR, qui a été introduite dans MFC 4.0. Vous pouvez modifier cette ressource à l’aide de l’éditeur de barre d’outils.
format de ressource RT_DLGINIT
Un format de ressource privée MFC est utilisé pour stocker des informations d’initialisation de boîte de dialogue supplémentaires. Cela inclut les chaînes initiales stockées dans une zone de liste déroulante. Le format de cette ressource n’est pas conçu pour être modifié manuellement, mais géré par Visual C++.
Visual C++ et cette ressource RT_DLGINIT ne sont pas nécessaires pour utiliser les fonctionnalités associées de MFC, car il existe une alternative d’API à l’utilisation des informations dans la ressource. L’utilisation de Visual C++ facilite l’écriture, la maintenance et la traduction de votre application à long terme.
La structure de base d’une ressource RT_DLGINIT est la suivante :
+---------------+ \
| Control ID | UINT |
+---------------+ |
| Message # | UINT |
+---------------+ |
|length of data | DWORD |
+---------------+ | Repeated
| Data | Variable Length | for each control
| ... | and Format | and message
+---------------+ /
| 0 | BYTE
+---------------+
Une section répétée contient l’ID de contrôle auquel envoyer le message, le message # à envoyer (message Windows normal) et une longueur variable de données. Le message Windows est envoyé dans un formulaire :
SendDlgItemMessage(<Control ID>, <Message #>, 0, &<Data>);
Il s’agit d’un format très général, autorisant tous les messages Windows et le contenu des données. L’éditeur de ressources Visual C++ et MFC prennent uniquement en charge un sous-ensemble limité de messages Windows : CB_ADDSTRING pour les options de liste initiale pour les zones de liste modifiable (les données sont une chaîne de texte).