Cette note décrit la prise en charge MFC pour les contrôles personnalisés et self-drawing. Sous-classement dynamique est également décrite. Conseils généraux sur la propriété des objets CWnd vs HWNDs sont présenté.
L'exemple d'application MFC CTRLTEST illustre plusieurs de ces caractéristiques. Veuillez consulter le code source de l'exemple MFC général CTRLTEST et aide en ligne.
Owner-Draw contrôles/Menus
Windows fournit le support pour les menus et les contrôles « owner draw ». Il s'agit de messages Windows, envoyés à une fenêtre parente d'un contrôle ou un menu qui vous permettent de personnaliser l'apparence et le comportement du contrôle ou du menu.
MFC appuie directement owner draw avec les entrées de la carte message:
Vous pouvez substituer ces dans votre CWnd-classe (habituellement une boîte de dialogue ou fenêtre frame principale) pour implémenter le comportement owner-draw dérivée.
Cette approche ne conduit pas au code réutilisable. Si vous avez deux contrôles similaires dans deux différentes boîtes de dialogue, vous devez implémenter le comportement du contrôle personnalisé en deux endroits. L'architecture de contrôle-prise en charge MFC des self-drawing résout ce problème.
Menus et contrôles self-Drawing
MFC fournit une implémentation par défaut (en CWnd et CMenu) pour les messages standard owner-draw. Cette implémentation par défaut va décoder les paramètres owner-draw et déléguer les messages owner-draw pour le contrôle ou le menu. Ceci est appelé « self-draw » étant donné que le code de dessin (/ mesure/comparaison) est dans la classe du contrôle ou du menu, pas dans la fenêtre propriétaire.
Cela vous permet de construire des classes de contrôle réutilisable qui affichent le contrôle à l'aide de la sémantique « propriétaire dessiner ». Le code pour dessiner le contrôle, pas le propriétaire du contrôle, est dans la classe du contrôle. Il s'agit d'une approche orientée objet de programmation du contrôle personnalisé.
CButto&n:DrawItem(LPDRAWITEMSTRUCT) ;
nbsp ; / / dessiner ce bouton
CMe&nu:MeasureItem(LPMEASUREITEMSTRUCT) ;
nbsp ; / / mesurer la taille d'un élément de ce menu
CMenu:DrawItem(LPDRAWITEMSTRUCT) ;
/ / dessiner un élément de ce menu
CListBox:MeasureItem(LPMEASUREITEMSTRUCT) ;
  ; / / mesurer la taille d'un élément dans la liste
CListBox:DrawItem(LPDRAWITEMSTRUCT) ;
/ / dessiner un élément dans la liste
CListBox:CompareItem(LPCOMPAREITEMSTRUCT) ;
/ / comparer deux éléments dans la liste si LBS_SORT
CListBox:DeleteItem(LPDELETEITEMSTRUCT) ;
/ / suppression d'un élément de cette zone de liste
CComboBox:MeasureItem(LPMEASUREITEMSTRUCT) ;
  ; / / mesurer la taille d'un élément dans cette zone de liste modifiable
CComboBox:DrawItem(LPDRAWITEMSTRUCT) ;
/ / dessiner un élément dans cette liste déroulante
CComboBox:CompareItem(LPCOMPAREITEMSTRUCT) ;
/ / comparer deux éléments dans cette liste déroulante si CBS_SORT
CComboBox:DeleteItem(LPDELETEITEMSTRUCT) ;
/ / suppression d'un élément dans cette liste déroulante
Pour plus d'informations sur le propriétaire-tirage au sort des structures (DRAWITEMSTRUCT, MEASUREITEMSTRUCT, COMPAREITEMSTRUCTet DELETEITEMSTRUCT) reportez-vous à la documentation de MFC pour CWnd::OnDrawItem, CWnd::OnMeasureItem, CWnd::OnCompareItemet CWnd::OnDeleteItem respectivement.
À l'aide des menus et des contrôles self-drawing
Pour les menus self-drawing, vous devez substituer les fonctions membres fois MeasureItem et DrawItem.
Pour self-drawing les zones de liste et zones de liste déroulante, vous devez substituer MeasureItem et DrawItem. Vous devez spécifier le style OWNERDRAWVARIABLE dans le modèle de la boîte de dialogue (LBS_OWNERDRAWVARIABLE et CBS_OWNERDRAWVARIABLE respectivement). Le style OWNERDRAWFIXED ne fonctionnera pas avec self-drawing points, étant donné que la hauteur de l'élément fixe est déterminée avant que les contrôles self-drawing sont attachés à la zone de liste. (Le membre de Win 3.1 les fonctions CListBox::SetItemHeight et CComboBox::SetItemHeight peut être utilisée pour contourner cette limitation).
En outre, notez que la commutation d'un style OWNERDRAWVARIABLE affectera le style NOINTEGRALHEIGHT . Parce que le contrôle ne peut pas calculer une hauteur intégrale avec éléments de tailles variable, le style par défaut de INTEGRALHEIGHT est ignorée et le contrôle est toujours NOINTEGRALHEIGHT. Si vos articles sont fixés à hauteur, vous pouvez empêcher des éléments partiels de dessiné en spécifiant la taille du contrôle pour être un multiplicateur partie intégrante de la taille de l'élément.
Pour self-drawing des zones de liste et zones de liste déroulante avec le style de la sorte (LBS_SORT et CBS_SORT respectivement), vous devez substituer la fonction membre CompareItem.
Pour self-drawing les zones de liste et zones de liste déroulante, DeleteItem n'est pas normalement substituée. DeleteItem peut être substituée, si le mémoire supplémentaire ou autres ressources sont stockées avec chaque élément de zone de liste déroulante ou de zone.
Exemples de contrôles et Menus Self-Drawing
L'exemple MFC général CTRLTEST fournit des échantillons d'un menu self-draw (montrant les couleurs) et une zone de liste self-draw (montrant aussi les couleurs).
L'exemple typique de plus d'un bouton de self-drawing est un bouton bitmap (un bouton qui affiche une, deux ou trois des images bitmap pour les différents États). Ceci est fourni dans la classe MFC CBitmapButton.
Sous-classement dynamique
Sous-classement est le terme de Windows pour remplacement WndProc d'une fenêtre avec un autre WndProc et appeler le vieux WndProc pour obtenir des fonctionnalités par défaut (superclasse).
Il ne faut pas la confondre avec une dérivation de classe C++ (C++ terminologie utilise les mots « de base » et « tiré », tandis que le modèle d'objet Windows utilise « super » et « sub »). Dérivation de C++ avec MFC et les fenêtres de sous-classement sont fonctionnellement très semblable, sauf que C++ ne soutient pas une fonctionnalité similaire à sous-classement dynamique.
La classe CWnd fournit la connexion entre un objet C++ (dérivée de CWnd) et un objet de fenêtre de Windows (également connu sous le nom un HWND).
Il existe trois façons communes, que celles-ci sont liées:
Ce dernier cas est fait avec les fonctions de membre:
Les deux routines attachent un objet CWnd à un HWNDdes fenêtres existantes. SubclassWindow prend le HWND directement, et SubclassDlgItem est une aide qui prend un ID de contrôle et de la fenêtre parent (habituellement une boîte de dialogue). SubclassDlgItem est conçu pour attacher des objets C++ aux contrôles de la boîte de dialogue créés à partir d'un modèle de boîte de dialogue.
Veuillez vous référer à la exemple CTRLTEST pour plusieurs exemples à suivre pour utiliser SubclassWindow et SubclassDlgItem.
&Notes techniques par le numéro |nbsp ; Notes techniques par catégorie