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 les fonctionnalités de dessin personnalisées :

  • Contrôles d’en-tête
  • Contrôles d’affichage de liste
  • Contrôles de barre de rebar
  • 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és

Tous les contrôles courants qui prennent en charge l’envoi de dessins personnalisés envoient des codes de notification NM_CUSTOMDRAW à 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é par
nmCUSTOMDRAW Barres de barres, barres de suivi et contrôles 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 peintnt et 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 des codes de notification NM_CUSTOMDRAW à 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 que contient la structure NMCUSTOMDRAW est l’étape actuelle du cycle de peinture. Il s’agit de la phase de dessin et est représentée par la valeur du membre dwDrawStage de la structure. Un contrôle informe son parent de quatre étapes de dessin de base. Ces phases 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 globales de la phase de dessin Descriptif
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 plus de commodité, Commctrl.h contient les valeurs spécifiques à l’élément suivantes.

Valeurs d’étape de dessin spécifiques à l’élément Descriptif
CDDS_ITEMPREPAINT Avant qu’un élément soit dessiné.
CDDS_ITEMPOSTPAINT Une fois qu’un élément a été dessiné.
CDDS_ITEMPREERASE Avant d’effacer un élément.
CDDS_ITEMPOSTERASE Une fois qu’un élément a été effacé.
CDDS_SUBITEM Versions courantes du contrôle 4.71. Indicateur combiné à CDDS_ITEMPREPAINT ou CDDS_ITEMPOSTPAINT si un sous-élément est dessiné. Cela ne sera défini que 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 informe le contrôle de 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 les fonctionnalités de dessin personnalisées consiste à répondre aux codes de notification NM_CUSTOMDRAW qu’un contrôle envoie. Les valeurs de retour envoyées par votre application 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 préliminaire

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 NM_CUSTOMDRAW associée. La valeur que votre application retourne à cette première notification détermine comment et quand le contrôle envoie des notifications de dessin personnalisées ultérieures 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 Résultat
CDRF_DODEFAULT Le contrôle se dessine lui-même. Il n’envoie pas de notifications de 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 utilise 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 des opérations de dessin spécifiques à un élément. Il envoie NM_CUSTOMDRAW codes de notification avant et après qu’il dessine 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 de 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 reçoit une notification de NM_CUSTOMDRAW avec dwDrawStage défini sur CDDS_ITEMPREPAINT | CDDS_SUBITEM avant que chaque sous-élément d’affichage de liste soit dessiné. Vous pouvez ensuite spécifier la police et la couleur de 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ée prédéfinie initiale, le contrôle envoie des notifications pour chaque élément qu’elle dessine pendant ce cycle de peinture. Ces notifications spécifiques à l’é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 est 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’elle ne commence 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 système. N’oubliez pas que le retour 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 un dessin personnalisé pour modifier la police d’un élément. Sélectionnez simplement le protocole 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ée. É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 des é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 de 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 de 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 .

Remarque

Avant la version 6.0 des contrôles courants, les barres d’outils ignorent l’indicateur de 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

La plupart des contrôles courants peuvent être gérés de la même façon. 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 clippé 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.

Dessin personnalisé avec des 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. La première notification NM_CUSTOMDRAW aura le membre dwDrawStage de la structure NMCUSTOMDRAW associée définie sur CDDS_PREPAINT. Retourne 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 retournez CDRF_NEWFONT, tous les sous-éléments de l’élément seront modifiés. Si vous souhaitez 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 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 grandes icônes, les petites icônes et les modes de liste, utilisez la procédure suivante.

  1. La première notification NM_CUSTOMDRAW aura le membre dwDrawStage de la structure NMCUSTOMDRAW associée définie sur CDDS_PREPAINT. Retourne 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 aucune notification de NM_CUSTOMDRAW supplémentaire.

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