Partager via


À propos du dessin personnalisé

Cette section contient des informations générales sur la fonctionnalité de dessin personnalisé et fournit une vue d’ensemble conceptuelle de la façon dont une application peut prendre en charge le dessin personnalisé. Actuellement, les contrôles suivants prennent en charge la fonctionnalité de dessin personnalisé :

  • Contrôles d’en-tête
  • Contrôles d’affichage de liste
  • Contrôles de barre d’armature
  • Contrôles de barre d’outils
  • Contrôles d’info-bulle
  • Contrôles trackbar
  • Contrôles d’arborescence

À propos des messages de notification de dessin personnalisé

Tous les contrôles courants qui prennent en charge le dessin personnalisé envoient NM_CUSTOMDRAW codes de notification à des points spécifiques pendant les opérations de dessin. Ces codes de notification décrivent les opérations de dessin qui s’appliquent à l’ensemble du contrôle, ainsi que les opérations de dessin spécifiques aux éléments du contrôle. Comme de nombreux codes de notification, NM_CUSTOMDRAW notifications sont envoyées sous forme de messages WM_NOTIFY .

Le paramètre lParam d’une notification de dessin personnalisé sera l’adresse d’une structure NMCUSTOMDRAW ou d’une structure spécifique au contrôle qui contient une structure NMCUSTOMDRAW en tant que premier membre. Le tableau suivant illustre la relation entre les contrôles et les structures qu’ils utilisent.

Structure Utilisée par
NMCUSTOMDRAW Contrôles d’en-tête, de barre d’en-tête et de barre d’en-tête
NMLVCUSTOMDRAW Contrôles d’affichage de liste
NMTBCUSTOMDRAW Contrôles de barre d’outils
NMTTCUSTOMDRAW Contrôles d’info-bulle
NMTVCUSTOMDRAW Contrôles d’arborescence

 

Cycles de peinture, étapes de dessin et messages de notification

Comme toutes les applications Windows, les contrôles courants peignent et s’effacent régulièrement en fonction des messages reçus du système ou d’autres applications. Le processus d’une peinture de contrôle ou d’effacement lui-même est appelé cycle de peinture. Les contrôles qui prennent en charge le dessin personnalisé envoient régulièrement NM_CUSTOMDRAW codes de notification au cours de chaque cycle de peinture. Ce code de notification est accompagné d’une structure NMCUSTOMDRAW ou d’une autre structure qui contient une structure NMCUSTOMDRAW en tant que premier membre.

L’une des informations contenues dans la structure NMCUSTOMDRAW est l’étape actuelle du cycle de peinture. Cette étape est appelée étape de dessin et est représentée par la valeur dans le membre dwDrawStage de la structure. Un contrôle informe son parent de quatre étapes de dessin de base. Ces étapes de dessin de base ou globales sont représentées dans la structure par les valeurs d’indicateur suivantes (définies dans Commctrl.h).

Valeurs d’étape de dessin global Description
CDDS_PREPAINT Avant le début du cycle de peinture.
CDDS_POSTPAINT Une fois le cycle de peinture terminé.
CDDS_PREERASE Avant le début du cycle d’effacement.
CDDS_POSTERASE Une fois le cycle d’effacement terminé.

 

Chacune des valeurs précédentes peut être combinée avec l’indicateur CDDS_ITEM pour spécifier des étapes de dessin spécifiques aux éléments. Pour des raisons pratiques, Commctrl.h contient les valeurs spécifiques à l’élément suivantes.

Valeurs de l’étape de dessin spécifiques à un élément Description
CDDS_ITEMPREPAINT Avant qu’un élément ne soit dessiné.
CDDS_ITEMPOSTPAINT Une fois qu’un élément a été dessiné.
CDDS_ITEMPREERASE Avant l’effacement d’un élément.
CDDS_ITEMPOSTERASE Une fois qu’un élément a été effacé.
CDDS_SUBITEM Versions de contrôle courantes 4.71. Indicateur combiné à CDDS_ITEMPREPAINT ou CDDS_ITEMPOSTPAINT si un sous-élément est dessiné. Ce paramètre est défini uniquement si CDRF_NOTIFYITEMDRAW est retourné par CDDS_PREPAINT.

 

Votre application doit traiter le code de notification NM_CUSTOMDRAW , puis retourner une valeur spécifique qui indique au contrôle ce qu’elle doit faire. Pour plus d’informations sur ces valeurs de retour, consultez les sections suivantes.

Tirer parti des services de dessin personnalisés

La clé pour exploiter la fonctionnalité de dessin personnalisé consiste à répondre aux codes de notification NM_CUSTOMDRAW qu’un contrôle envoie. Les valeurs de retour que votre application envoie en réponse à ces notifications déterminent le comportement du contrôle pour ce cycle de peinture.

Cette section contient des informations sur la façon dont votre application peut utiliser NM_CUSTOMDRAW valeurs de retour de notification pour déterminer le comportement du contrôle.

Les détails sont répartis dans les rubriques suivantes :

Réponse à la notification de pré-peinture

Au début de chaque cycle de peinture, le contrôle envoie le code de notification NM_CUSTOMDRAW , en spécifiant la valeur CDDS_PREPAINT dans le membre dwDrawStage de la structure de NM_CUSTOMDRAW associée. La valeur que votre application retourne à cette première notification détermine comment et quand le contrôle envoie les notifications de dessin personnalisées suivantes pour le reste de ce cycle de peinture. Votre application peut retourner une combinaison des indicateurs suivants en réponse à la première notification.

Valeur retournée Effet
CDRF_DODEFAULT Le contrôle se dessine lui-même. Il n’envoie pas de notifications NM_CUSTOMDRAW supplémentaires pour ce cycle de peinture. Cet indicateur ne peut pas être utilisé avec un autre indicateur.
CDRF_DOERASE Le contrôle dessine uniquement l’arrière-plan.
CDRF_NEWFONT Votre application a spécifié une nouvelle police pour l’élément ; le contrôle utilisera la nouvelle police. Pour plus d’informations sur la modification des polices, consultez Modification des polices et des couleurs. Cela se produit lorsque dwDrawStage est égal à CDDS_ITEMPREPAINT.
CDRF_NOTIFYITEMDRAW Le contrôle avertit le parent de toutes les opérations de dessin spécifiques à un élément. Il envoie NM_CUSTOMDRAW codes de notification avant et après le dessin des éléments. Cela se produit lorsque dwDrawStage est égal à CDDS_PREPAINT.
CDRF_NOTIFYPOSTERASE Le contrôle avertit le parent après l’effacement d’un élément. Cela se produit lorsque dwDrawStage est égal à CDDS_PREPAINT.
CDRF_NOTIFYPOSTPAINT Le contrôle envoie une notification NM_CUSTOMDRAW lorsque le cycle de peinture de l’ensemble du contrôle est terminé. Cela se produit lorsque dwDrawStage est égal à CDDS_PREPAINT.
CDRF_NOTIFYSUBITEMDRAW Version 4.71. Votre application recevra une notification NM_CUSTOMDRAW avec dwDrawStage défini sur CDDS_ITEMPREPAINT | CDDS_SUBITEM avant que chaque sous-élément de vue de liste ne soit dessiné. Vous pouvez ensuite spécifier la police et la couleur pour chaque sous-élément séparément ou retourner CDRF_DODEFAULT pour le traitement par défaut. Cela se produit lorsque dwDrawStage est égal à CDDS_ITEMPREPAINT.
CDRF_SKIPDEFAULT Votre application a dessiné l’élément manuellement. Le contrôle ne dessine pas l’élément. Cela se produit lorsque dwDrawStage est égal à CDDS_ITEMPREPAINT.
CDRF_SKIPPOSTPAINT Le contrôle ne dessine pas le rectangle de focus autour d’un élément.

 

Demande de notifications spécifiques à un élément

Si votre application retourne CDRF_NOTIFYITEMDRAW à la notification de dessin personnalisé de pré-peinture initiale, le contrôle envoie des notifications pour chaque élément qu’il dessine pendant ce cycle de peinture. Ces notifications spécifiques à un élément auront la valeur CDDS_ITEMPREPAINT dans le membre dwDrawStage de la structure NMCUSTOMDRAW associée. Vous pouvez demander au contrôle d’envoyer une autre notification lorsqu’il a terminé de dessiner l’élément en retournant CDRF_NOTIFYPOSTPAINT à ces notifications spécifiques à l’élément. Sinon, retournez CDRF_DODEFAULT et le contrôle n’avertira pas la fenêtre parente tant qu’il ne commencera pas à dessiner l’élément suivant.

Dessin de l’élément vous-même

Si votre application dessine l’élément entier, retournez CDRF_SKIPDEFAULT. Cela permet au contrôle d’ignorer les éléments qu’il n’a pas besoin de dessiner, ce qui réduit la surcharge du système. Gardez à l’esprit que le renvoi de cette valeur signifie que le contrôle ne dessine aucune partie de l’élément.

Modification des polices et des couleurs

Votre application peut utiliser le dessin personnalisé pour modifier la police d’un élément. Sélectionnez simplement le FICHIER HFONT souhaité dans le contexte de l’appareil spécifié par le membre hdc de la structure NMCUSTOMDRAW associée à la notification de dessin personnalisé. Étant donné que la police que vous sélectionnez peut avoir des métriques différentes de la police par défaut, veillez à inclure le bit CDRF_NEWFONT dans la valeur de retour du message de notification. Pour plus d’informations sur l’utilisation de cette fonctionnalité, consultez l’exemple de code dans Utilisation d’un dessin personnalisé. La police spécifiée par votre application est utilisée pour afficher cet élément lorsqu’il n’est pas sélectionné. Le dessin personnalisé ne vous permet pas de modifier les attributs de police pour les éléments sélectionnés.

Pour modifier les couleurs du texte pour tous les contrôles qui prennent en charge le dessin personnalisé à l’exception de l’affichage liste et de l’arborescence, définissez simplement les couleurs de texte et d’arrière-plan souhaitées dans le contexte de l’appareil fourni dans la structure de notification de dessin personnalisée avec les fonctions SetTextColor et SetBkColor . Pour modifier les couleurs du texte dans l’affichage liste ou l’arborescence, vous devez placer les valeurs de couleur souhaitées dans les membres clrText et clrTextBk de la structure NMLVCUSTOMDRAW ou NMTVCUSTOMDRAW .

Notes

Avant la version 6.0 des contrôles courants, les barres d’outils ignorent l’indicateur CDRF_NEWFONT . La version 6.0 prend en charge l’indicateur CDRF_NEWFONT et vous pouvez l’utiliser pour sélectionner une autre police pour la barre d’outils. Toutefois, vous ne pouvez pas modifier la couleur d’une barre d’outils lorsqu’un style visuel est actif. Pour modifier la couleur d’une barre d’outils dans la version 6.0, vous devez d’abord désactiver les styles visuels en appelant SetWindowTheme et en spécifiant aucun style visuel :

 

SetWindowTheme (hwnd, "", "");

Dessin personnalisé avec des contrôles List-View et Tree-View

Les contrôles les plus courants peuvent être gérés essentiellement de la même manière. Toutefois, les contrôles d’affichage de liste et d’arborescence ont certaines fonctionnalités qui nécessitent une approche quelque peu différente du dessin personnalisé.

Pour la version 5.0, ces deux contrôles peuvent afficher du texte rogné si vous modifiez la police en retournant CDRF_NEWFONT. Ce comportement est nécessaire pour la compatibilité descendante avec les versions antérieures des contrôles courants. Si vous souhaitez modifier la police d’un contrôle d’affichage de liste ou d’arborescence, vous obtiendrez de meilleurs résultats si vous envoyez un message CCM_SETVERSION avec la valeur wParam définie sur 5 avant d’ajouter des éléments au contrôle. Pour obtenir un exemple de contrôle d’arborescence qui utilise un dessin personnalisé, consultez l’article de la Base de connaissances SAMPLE : CustDTv Illustrates Custom Draw in a TreeView (Q248496) .

Dessin personnalisé avec contrôles List-View

Étant donné que les contrôles d’affichage de liste ont des sous-éléments et plusieurs modes d’affichage, vous devez gérer la notification NM_CUSTOMDRAW un peu différemment des autres contrôles courants.

Pour le mode rapport, utilisez la procédure suivante.

  1. Lors de la première notification NM_CUSTOMDRAW, le membre dwDrawStage de la structure NMCUSTOMDRAW associée est défini sur CDDS_PREPAINT. Retournez CDRF_NOTIFYITEMDRAW.
  2. Vous recevrez ensuite une notification NM_CUSTOMDRAW avec dwDrawStage défini sur CDDS_ITEMPREPAINT. Si vous spécifiez de nouvelles polices ou couleurs et que vous retournez CDRF_NEWFONT, tous les sous-éléments de l’élément seront modifiés. Si vous souhaitez plutôt gérer chaque sous-élément séparément, retournez CDRF_NOTIFYSUBITEMDRAW.
  3. Si vous avez retourné CDRF_NOTIFYSUBITEMDRAW à l’étape précédente, vous recevrez alors une notification NM_CUSTOMDRAW pour chaque sous-élément avec dwDrawStage défini sur CDDS_SUBITEM | CDDS_ITEMPREPAINT. Pour modifier la police ou la couleur de ce sous-élément, spécifiez une nouvelle police ou couleur et retournez CDRF_NEWFONT.

Pour les modes grande icône, petite icône et liste, utilisez la procédure suivante.

  1. Lors de la première notification NM_CUSTOMDRAW, le membre dwDrawStage de la structure NMCUSTOMDRAW associée est défini sur CDDS_PREPAINT. Retournez CDRF_NOTIFYITEMDRAW.
  2. Vous recevrez ensuite une notification NM_CUSTOMDRAW avec dwDrawStage défini sur CDDS_ITEMPREPAINT. Vous pouvez modifier les polices ou les couleurs d’un élément en spécifiant de nouvelles polices et couleurs et en retournant CDRF_NEWFONT. Étant donné que ces modes n’ont pas de sous-éléments, vous ne recevrez pas de notifications NM_CUSTOMDRAW supplémentaires.

Pour obtenir un exemple de gestionnaire de notification NM_CUSTOMDRAW d’affichage de liste, consultez Utilisation d’un dessin personnalisé.

Conceptuel

Utilisation du dessin personnalisé

Informations de référence sur le dessin personnalisé

Autres ressources

EXEMPLE : CustDTv illustre le dessin personnalisé dans un TreeView (Q248496)