Cette note technique fournit des informations sur le nouveau message WM_NOTIFY et décrit la manière recommandée (et le plus commune) de la gestion des messages WM_NOTIFY à votre application MFC.
Messages de notification dans Windows 3.x
Dans Windows 3.x, contrôles avertir leurs parents des événements tels que les clics de souris, changements dans le contenu et la sélection et la peinture de fond contrôle en envoyant un message à la mère. Notifications simples sont envoyées comme messages WM_COMMAND spéciaux, avec le code de notification (comme BN_CLICKED) et contrôlent ID entassé dans wParam et le handle du contrôle en lParam. Notez que puisque le wParam et lParam sont remplis, il n'y a aucun moyen de passer des données supplémentaires, ces messages peuvent être seulement simple notification. Par exemple, dans la notification BN_CLICKED , il n'y a aucun moyen pour envoyer des informations sur l'emplacement du curseur de la souris lorsque le bouton l'utilisateur a cliqué.
Lorsque les contrôles dans Windows 3.x devront envoyer un message de notification qui inclut des données supplémentaires, ils utilisent une variété de messages spéciaux, y compris WM_CTLCOLOR, WM_VSCROLL, messages WM_HSCROLL, WM_DRAWITEM, WM_MEASUREITEM, WM_COMPAREITEM, WM_DELETEITEM, WM_CHARTOITEM, WM_VKEYTOITEMet ainsi de suite. Ces messages peuvent être réfléchis vers le contrôle qui a envoyé les. Pour plus d'informations, voir TN062 : réflexion Message pour les contrôles Windows.
Messages de notification dans Win32
Pour les contrôles qui ont existé dans Windows 3.1, l'API Win32 utilise la plupart des messages de notification qui ont été utilisés dans Windows 3.x. Cependant, ces contrôles Win32 ajoute également un certain nombre de contrôles sophistiqués et complexes à celles prises en charge dans Windows 3.x. souvent, besoin d'envoyer des données supplémentaires avec les messages de notification. Plutôt que d'ajouter un nouveau message WM_ * pour chaque nouvelle notification qui a besoin de données supplémentaires, les concepteurs de l'API Win32 a choisi d'ajouter un message WM_NOTIFY, qui peut passer une quantité de données supplémentaires d'une façon normalisée.
Messages WM_NOTIFY contient l'ID du contrôle envoyant le message wParam et un pointeur vers une structure de lParam. Cette structure est une structure NMHDR ou une structure plus vaste qui a une structure NMHDR comme premier membre. À noter que depuis le membre NMHDR est le premier, un pointeur vers cette structure peut être utilisé comme soit un pointeur vers un NMHDR ou un pointeur vers la structure plus vaste selon la façon dont vous le cast.
Dans la plupart des cas, le pointeur pointe vers une structure plus grande, et vous devrez lorsque vous l'utilisez. Dans seulement quelques notifications, telles que les notifications communes (dont les noms commencent par NM_) et du contrôle de la pointe de l'outil TTN_SHOW et notifications de TTN_POP , est une structure NMHDR effectivement utilisée.
La structure NMHDR ou membre initial contient le handle et l'ID du contrôle envoyant le message et le code de notification (comme TTN_SHOW). Le format de la structure NMHDR est ci-dessous :
typeDef struct tag&NMHDR {
nbsp ; HWND hwndFrom ;
UINT idFrom ;
Code de UINT ;
} NMHDR
Pour un message TTN_SHOW , les membres de code seraient définie de la TTN_SHOW.
La plupart des notifications passent un pointeur à une structure plus vaste qui contient une structure NMHDR comme premier membre. Par exemple, considérons la structure utilisée par LVN_KEYDOWN message de notification du contrôle liste qui est envoyé lorsqu'une touche est enfoncée dans un contrôle list view. Le pointeur pointe vers une structure LV_KEYDOWN qui est définie comme indiqué ci-dessous:
typeDef struct tagLV_KEYDOW&N {
nbsp ; NMHDR hdr ;
MOT wVKey ;
UINT flags ;
} LV_KEYDOWN
Notez que, étant donné que le membre NMHDR est le premier dans cette structure, le pointeur que vous êtes passé dans le message de notification peut être casté à un pointeur vers un NMHDR ou un pointeur vers un LV_KEYDOWN.
Avis commun à tous les nouveaux contrôles Windows
Certaines notifications sont communes à tous les nouveaux contrôles de Windows. Ces notifications de passent un pointeur vers une structure NMHDR.
| Code de notification | Envoyé parce que |
| NM_CLICK | Utilisateur a cliqué sur le bouton gauche de la souris dans le contrôle |
| NM_DBLCLK | Bouton de gauche de la souris double-clic utilisateur dans le contrôle |
| NM_RCLICK | Utilisateur a cliqué sur le bouton droit de la souris dans le contrôle |
| NM_RDBLCLK | Utilisateur double-clic bouton droit dans le contrôle |
| NM_RETURN | Utilisateur pressé la touche alors que le contrôle a input focus |
| NM_SETFOCUS | Contrôle a reçu le focus d'entrée |
| NM_KILLFOCUS | Contrôle perd le focus d'entrée |
| NM_OUTOFMEMORY | Contrôle Impossible de terminer l'opération car n'était pas assez de mémoire disponible |
ON_NOTIFY : Manutention WM_NOTIFY Messages dans des Applications MFC
La fonction CWnd::OnNotify gère les messages de notification. Sa mise en œuvre par défaut vérifie la table des messages pour les gestionnaires d'événements de notification appeler. En général, vous ne substituez pas OnNotify. Au lieu de cela, vous fournir une fonction de gestionnaire d'événements et ajoutez une entrée de message-carte pour ce gestionnaire d'événements à la carte de message de la classe de la fenêtre de votre propriétaire.
ClassWizard, via la feuille de propriétés de ClassWizard ou la barre Assistant, peut créer l'entrée de la carte-message ON_NOTIFY et vous fournir une fonction de gestionnaire d'événements squelette. Pour plus d'informations sur l'utilisation de ClassWizard pour rendre cela plus facile, voir Mappage de Messages à des fonctions dans le Guide du programmeur Visual C++.
La macro de message-carte ON_NOTIFY a la syntaxe suivante:
ON_NOTIFY ( wNotifyCode, id, memberFxn )
où les paramètres en italique sont remplacés par:
wNotifyCode
Le code pour le message de notification être manipulés, comme les LVN_KEYDOWN.
id
L'identificateur de l'enfant du contrôle pour lequel la notification est envoyée.
memberFxn
La fonction de membre d'être appelé lorsque cette notification est envoyée.
Votre fonction de membre doit être déclarée avec le prototype suivant:
afx_msgvoidmemberFxn()NMHDR*pNotifyStruct,LRESULT*résultat);
où les paramètres en italique sont:
pNotifyStruct
Un pointeur vers la structure de la notification, comme décrit dans la section ci-dessus.
résultat
Un pointeur vers le code de résultat, vous allez définir avant votre retour.
Exemple
Pour spécifier que vous souhaitez que la fonction membre OnKeydownList1 pour gérer les messages LVN_KEYDOWN de la CListCtrl dont l'ID est IDC_LIST1 , vous devez utiliser l'Assistant classe pour ajouter ce qui suit à votre carte message:
ON_NOTIFY (LVN_KEYDOWN, IDC_LIST1, OnKeydownList1)
Dans l'exemple ci-dessus, la fonction fournie par ClassWizard est:
vOID CMessageReflectionDlg::OnKeydownList1 (&NMHDR * pNMHDR, LRESULT * pResult)
{
LV_KEYDOWN * pLVKeyDow = (LV_KEYDOWN **) pNMHDR ;
/ / TODO : ajoutez à votre gestionnaire de notification de contrôle
/ / nbsp ; code ici
* pResult = 0 ;
}
Notez que ClassWizard fournit un pointeur de type approprié automatiquement. Vous pouvez accéder à la structure de la notification par le biais soit pNMHDR oupLVKeyDow.
Si vous avez besoin traiter le même message WM_NOTIFY pour un ensemble de contrôles, vous pouvez utiliser ON_NOTIFY_RANGE plutôt que ON_NOTIFY. Par exemple, vous pouvez avoir un ensemble de boutons pour lequel vous souhaitez exécuter la même action pour certain un message de notification.
Lorsque vous utilisez ON_NOTIFY_RANGE, vous spécifiez une plage contiguë des identificateurs de l'enfant pour lequel traiter le message de notification par spécifiant le début et de fin des identificateurs de l'enfant de la gamme.
ClassWizard ne gère pas les ON_NOTIFY_RANGE; pour l'utiliser, vous devez modifier votre carte message vous-même.
Voici l'entrée de message-carte et le prototype de fonction pour ON_NOTIFY_RANGE:
ON_NOTIFY_RANGE ( wNotifyCode, id, idLast, memberFxn )
où les paramètres en italique sont remplacés par:
wNotifyCode
Le code pour le message de notification être manipulés, comme les LVN_KEYDOWN.
id
Le premier identificateur dans la gamme contiguë des identificateurs.
idLast
Le dernier identificateur dans la gamme contiguë des identificateurs.
memberFxn
La fonction de membre d'être appelé lorsque cette notification est envoyée.
Votre fonction de membre doit être déclarée avec le prototype suivant:
afx_msgvoidmemberFxn()UINT idNMHDR*pNotifyStruct,LRESULT*résultat);
où les paramètres en italique sont:
id
L'identificateur du contrôle qui a envoyé la notification d'enfant.
pNotifyStruct
Un pointeur vers la structure de la notification, comme décrit ci-dessus.
résultat
Un pointeur vers le code de résultat, vous allez définir avant votre retour.
ON_NOTIFY_EX, ON_NOTIFY_EX_RANGE
Si vous souhaitez plus d'un objet dans la notification de routage pour gérer un message, vous pouvez utiliser ON_NOTIFY_EX (ou ON_NOTIFY_EX_RANGE) plutôt que de ON_NOTIFY (ou ON_NOTIFY_RANGE). La seule différence entre la version EX et la version régulière, c'est que la fonction de membre appelée pour la version EX retourne un Boolean qui indique si oui ou non le traitement de message devrait continuer. Faux de retour de cette fonction vous permet de traiter le même message à plus d'un objet.
ClassWizard ne gère pas les ON_NOTIFY_EX ou ON_NOTIFY_EX_RANGE; Si vous souhaitez utiliser une d'elles, vous devez modifier votre carte message vous-même.
L'entrée de la carte-message et le prototype de fonction pour ON_NOTIFY_EX et ON_NOTIFY_EX_RANGE sont les suivantes : La signification des paramètres est les mêmes que pour les non-EX versions.
ON_NOTIFY_EX ( nCode, id, memberFxn )
ON_NOTIFY_EX_RANGE ( wNotifyCode, id, idLast,memberFxn )
Le prototype de ce qui précède est le même:
afx_msgBOOLmemberFxn()UINT idNMHDR*pNotifyStruct,LRESULT*résultat);
Dans les deux cas, id est l'identificateur du contrôle qui a envoyé la notification d'enfant.
Votre fonction doit retourner TRUE si le message de notification a été complètement manipulé, ou FALSE si autres d'objets dans le routage de commandes devrait avoir la possibilité de gérer le message.
&Notes techniques par le numéro |nbsp ; Notes techniques par catégorie