Delen via


Over aangepast tekenen

Deze sectie bevat algemene informatie over aangepaste tekenfunctionaliteit en biedt een conceptueel overzicht van hoe een toepassing aangepaste tekening kan ondersteunen. Momenteel bieden de volgende besturingselementen ondersteuning voor aangepaste tekenfunctionaliteit:

  • Besturingselementen voor kopteksten
  • Besturingselementen voor lijstweergave
  • Wapeningsstavenbesturingen
  • Werkbalkbedieningselementen
  • Besturingen voor tooltips
  • Besturingselementen voor de trackbar
  • Besturingselementen voor structuurweergave

Meldingen over aangepaste tekenopdrachten

Alle algemene besturingselementen die aangepaste tekenbewerkingen ondersteunen, verzenden NM_CUSTOMDRAW meldingscodes op specifieke punten tijdens tekenbewerkingen. Deze meldingscodes beschrijven tekenbewerkingen die van toepassing zijn op het hele besturingselement en tekenbewerkingen die specifiek zijn voor items in het besturingselement. Net als bij veel notificatiecodes worden NM_CUSTOMDRAW-meldingen verzonden als WM_NOTIFY berichten.

De parameter lParam van een aangepaste tekenmelding is het adres van een NMCUSTOMDRAW structuur of een controlespecifieke structuur die een NMCUSTOMDRAW- structuur bevat als eerste lid. De volgende tabel illustreert de relatie tussen de besturingselementen en de structuren die ze gebruiken.

Structuur Gebruikt door
NMCUSTOMDRAW Besturingselementen voor opnieuw balk, trackbar en koptekst
NMLVCUSTOMDRAW Besturingselementen voor lijstweergave
NMTBCUSTOMDRAW Werkbalkbedieningselementen
NMTTCUSTOMDRAW Besturingen voor tooltips
NMTVCUSTOMDRAW Besturingselementen voor structuurweergave

Verfcycli, tekenfasen en meldingsberichten

Net als bij alle Windows-toepassingen worden algemene besturingselementen regelmatig geschilderd en gewist op basis van berichten die zijn ontvangen van het systeem of andere toepassingen. Het proces van een controleschilderij of het wissen zelf wordt een verfcyclusgenoemd. Besturingselementen die aangepast tekenen ondersteunen, verzenden NM_CUSTOMDRAW meldingscodes periodiek tijdens elke verfcyclus. Deze meldingscode gaat vergezeld van een NMCUSTOMDRAW structuur of een andere structuur die een NMCUSTOMDRAW structuur bevat als eerste lid.

Een stukje informatie dat de NMCUSTOMDRAW structuur bevat, is de huidige fase van de verfcyclus. Dit wordt de tekenfase genoemd en wordt vertegenwoordigd door de waarde in het dwDrawStage- lid van de structuur. Een besturingselement informeert het bovenliggende element over vier basistekenfasen. Deze basis- of globale tekenfasen worden weergegeven in de structuur door de volgende vlagwaarden (gedefinieerd in Commctrl.h).

Algemene tekenfasewaarden Beschrijving
CDDS_PREPAINT Voordat de verfcyclus begint.
CDDS_POSTPAINT Nadat de verfcyclus is voltooid.
CDDS_PREERASE Voordat de wiscyclus begint.
CDDS_POSTERASE Nadat de wiscyclus is voltooid.

Elk van de voorgaande waarden kan worden gecombineerd met de vlag CDDS_ITEM om tekenfasen op te geven die specifiek zijn voor items. Voor het gemak bevat Commctrl.h de volgende itemspecifieke waarden.

Itemspecifieke tekenfasewaarden Beschrijving
CDDS_ITEMPREPAINT Voordat een item wordt getrokken.
CDDS_ITEMPOSTPAINT Nadat een item is getrokken.
CDDS_ITEMPREERASE Voordat een item wordt gewist.
CDDS_ITEMPOSTERASE Nadat een item is gewist.
CDDS_SUBITEM Common Control Versions 4.71. Vlag gecombineerd met CDDS_ITEMPREPAINT of CDDS_ITEMPOSTPAINT als een subitem wordt getekend. Dit wordt alleen ingesteld als CDRF_NOTIFYITEMDRAW vanuit CDDS_PREPAINT wordt geretourneerd.

Uw toepassing moet de NM_CUSTOMDRAW meldingscode verwerken en vervolgens een specifieke waarde retourneren die het besturingselement informeert wat er moet worden gedaan. Zie de volgende secties voor meer informatie over deze retourwaarden.

Gebruik maken van aangepaste tekenservices

De sleutel voor het benutten van aangepaste tekenfunctionaliteit is het reageren op de NM_CUSTOMDRAW meldingscodes die door een besturingselement worden verzonden. De geretourneerde waarden die uw toepassing verzendt als reactie op deze meldingen, bepalen het gedrag van het besturingselement voor die verfcyclus.

Deze sectie bevat informatie over hoe uw toepassing NM_CUSTOMDRAW retourwaarden voor meldingen kan gebruiken om het gedrag van het besturingselement te bepalen.

Details worden onderverdeeld in de volgende onderwerpen:

Reageren op de prepaintmelding

Aan het begin van elke verfcyclus verzendt het besturingselement de NM_CUSTOMDRAW-meldingscode, waarbij de waarde CDDS_PREPAINT wordt opgegeven in het dwDrawStage- lid van de bijbehorende NM_CUSTOMDRAW-structuur. De waarde die uw toepassing retourneert naar deze eerste melding bepaalt hoe en wanneer het besturingselement volgende aangepaste tekenmeldingen verzendt voor de rest van die verfcyclus. Uw toepassing kan een combinatie van de volgende vlaggen retourneren als reactie op de eerste melding.

Retourwaarde Effect
CDRF_DODEFAULT Het besturingselement tekent zichzelf. Er worden geen extra NM_CUSTOMDRAW meldingen voor deze verfcyclus verzonden. Deze vlag kan niet worden gebruikt met een andere vlag.
CDRF_DOERASE De controle tekent alleen de achtergrond.
CDRF_NEWFONT Uw toepassing heeft een nieuw lettertype voor het item opgegeven; het besturingselement gebruikt het nieuwe lettertype. Zie Lettertypen en kleuren wijzigenvoor meer informatie over het wijzigen van lettertypen. Dit gebeurt wanneer dwDrawStage- gelijk is aan CDDS_ITEMPREPAINT.
CDRF_NOTIFYITEMDRAW Het besturingselement informeert de bovenliggende ouder over alle itemspecifieke tekenbewerkingen. Er worden NM_CUSTOMDRAW meldingscodes verzonden voor en na het tekenen van items. Dit gebeurt wanneer dwDrawStage- gelijk is aan CDDS_PREPAINT.
CDRF_NOTIFYPOSTERASE Het besturingselement informeert de oudercomponent nadat een item is gewist. Dit gebeurt wanneer dwDrawStage- gelijk is aan CDDS_PREPAINT.
CDRF_NOTIFYPOSTPAINT Het besturingselement stuurt een NM_CUSTOMDRAW melding wanneer de tekeningscyclus voor het gehele besturingselement is voltooid. Dit gebeurt wanneer dwDrawStage- gelijk is aan CDDS_PREPAINT.
CDRF_NOTIFYSUBITEMDRAW versie 4.71. Uw toepassing ontvangt een NM_CUSTOMDRAW melding met dwDrawStage ingesteld op CDDS_ITEMPREPAINT | CDDS_SUBITEM voordat elk subitem van de lijstweergave wordt gerenderd. Vervolgens kunt u voor elke subitem afzonderlijk lettertype en kleur opgeven of CDRF_DODEFAULT retourneren voor standaardverwerking. Dit gebeurt wanneer dwDrawStage- gelijk is aan CDDS_ITEMPREPAINT.
CDRF_SKIPDEFAULT Uw toepassing heeft het item handmatig getekend. Het besturingselement tekent het item niet. Dit gebeurt wanneer dwDrawStage- gelijk is aan CDDS_ITEMPREPAINT.
CDRF_SKIPPOSTPAINT Het besturingselement tekent de focusrechthoek niet rond een item.

Itemspecifieke meldingen aanvragen

Als uw toepassing CDRF_NOTIFYITEMDRAW retourneert naar de initiële aangepaste tekenmelding, verzendt het besturingselement meldingen voor elk item dat tijdens die verfcyclus wordt getekend. Deze itemspecifieke meldingen hebben de waarde CDDS_ITEMPREPAINT in het dwDrawStage lid van de bijbehorende NMCUSTOMDRAW structuur. U kunt aanvragen dat het besturingselement een andere melding verzendt wanneer het klaar is met het tekenen van het item door CDRF_NOTIFYPOSTPAINT terug te sturen naar deze itemspecifieke meldingen. Anders geeft u CDRF_DODEFAULT terug en zal het bovenliggende venster pas op de hoogte worden gesteld zodra het volgende item begint te tekenen.

Het item zelf tekenen

Als uw toepassing het hele item tekent, retourneert u CDRF_SKIPDEFAULT. Hierdoor kan het besturingselement items overslaan die niet hoeven te worden getekend, waardoor de systeemoverhead wordt verminderd. Houd er rekening mee dat het retourneren van deze waarde betekent dat het besturingselement geen deel van het item tekent.

Lettertypen en kleuren wijzigen

Uw toepassing kan aangepast tekenen gebruiken om het lettertype van een item te wijzigen. Selecteer de HFONT die u wilt opnemen in de apparaatcontext die is opgegeven door de hdc lid van de NMCUSTOMDRAW structuur die is gekoppeld aan de aangepaste tekenmelding. Omdat het lettertype dat u selecteert mogelijk andere metrische gegevens bevat dan het standaardlettertype, moet u ervoor zorgen dat u de CDRF_NEWFONT bit opneemt in de retourwaarde voor het meldingsbericht. Voor meer informatie over het gebruik van deze functionaliteit, zie de voorbeeldcode in Using Custom Draw. Het lettertype dat uw toepassing opgeeft, wordt gebruikt om dat item weer te geven wanneer het niet is geselecteerd. Met aangepast tekenen kunt u de lettertypekenmerken voor geselecteerde items niet wijzigen.

Als u tekstkleuren wilt wijzigen voor alle besturingselementen die aangepaste tekenopties ondersteunen, met uitzondering van de lijstweergave en structuurweergave, stelt u de gewenste tekst- en achtergrondkleuren in de apparaatcontext in die is opgegeven in de aangepaste tekenmeldingsstructuur met de SetTextColor- en SetBkColor--functies. Als u de tekstkleuren in de lijstweergave of structuurweergave wilt wijzigen, moet u de gewenste kleurwaarden in de clrText en clrTextBk leden van de NMLVCUSTOMDRAW- of NMTVCUSTOMDRAW structuur plaatsen.

Notitie

Vóór versie 6.0 van de algemene besturingselementen, negeren werkbalken de vlag CDRF_NEWFONT. Versie 6.0 ondersteunt de vlag CDRF_NEWFONT en u kunt deze gebruiken om een ander lettertype voor de werkbalk te selecteren. U kunt de kleur van een werkbalk echter niet wijzigen wanneer een visuele stijl actief is. Als u de kleur van een werkbalk in versie 6.0 wilt wijzigen, moet u eerst visuele stijlen uitschakelen door SetWindowTheme- aan te roepen en geen visuele stijl op te geven:

SetWindowTheme (hwnd, "", "");

Aangepast tekenen met List-View en Tree-View besturing

De meest voorkomende besturingselementen kunnen op dezelfde manier worden verwerkt. De besturingselementen voor lijstweergave en structuurweergave hebben echter enkele functies waarvoor een enigszins andere benadering van aangepaste tekening is vereist.

Voor versie 5.0kunnen deze twee besturingselementen afgeknipte tekst weergeven als u het lettertype wijzigt door CDRF_NEWFONTte retourneren. Dit gedrag is nodig voor achterwaartse compatibiliteit met eerdere versies van de algemene besturingselementen. Als u het lettertype van een besturingselement lijstweergave of structuurweergave wilt wijzigen, krijgt u betere resultaten als u een CCM_SETVERSION bericht verzendt met de wParam-waarde ingesteld op 5 voordat u items aan het besturingselement toevoegt.

Aangepast tekenen met List-View bedienelementen

Omdat besturingselementen voor lijstweergave subitems en meerdere weergavemodi hebben, moet u de melding NM_CUSTOMDRAW enigszins anders afhandelen dan voor de andere algemene besturingselementen.

Gebruik de volgende procedure voor de rapportmodus.

  1. De eerste NM_CUSTOMDRAW melding bevat de dwDrawStage- lid van de gekoppelde NMCUSTOMDRAW structuur ingesteld op CDDS_PREPAINT. Retourneer CDRF_NOTIFYITEMDRAW.
  2. Vervolgens ontvangt u een NM_CUSTOMDRAW melding met dwDrawStage- ingesteld op CDDS_ITEMPREPAINT. Als u nieuwe lettertypen of kleuren opgeeft en CDRF_NEWFONTretourneert, worden alle subitems van het item gewijzigd. Als u in plaats daarvan elke subitem afzonderlijk wilt verwerken, retourneert u CDRF_NOTIFYSUBITEMDRAW.
  3. Als u CDRF_NOTIFYSUBITEMDRAW in de vorige stap hebt geretourneerd, ontvangt u vervolgens een NM_CUSTOMDRAW melding voor elke subitem met dwDrawStage- ingesteld op CDDS_SUBITEM | CDDS_ITEMPREPAINT. Als u het lettertype of de kleur voor dat subitem wilt wijzigen, geeft u een nieuw lettertype of een nieuwe kleur op en retourneert u CDRF_NEWFONT.

Gebruik de volgende procedure voor het grote pictogram, het kleine pictogram en de lijstmodi.

  1. De eerste NM_CUSTOMDRAW melding bevat de dwDrawStage- lid van de gekoppelde NMCUSTOMDRAW structuur ingesteld op CDDS_PREPAINT. Retourneer CDRF_NOTIFYITEMDRAW.
  2. Vervolgens ontvangt u een NM_CUSTOMDRAW melding met dwDrawStage- ingesteld op CDDS_ITEMPREPAINT. U kunt de lettertypen of kleuren van een item wijzigen door nieuwe lettertypen en kleuren op te geven en CDRF_NEWFONTte retourneren. Omdat deze modi geen subitems hebben, ontvangt u geen extra NM_CUSTOMDRAW meldingen.

Voor een voorbeeld van een NM_CUSTOMDRAW meldingshandler voor lijstweergave, zie Aangepast tekenen gebruiken.