Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tato část obsahuje obecné informace o funkcích vlastního kreslení a poskytuje koncepční přehled o tom, jak může aplikace podporovat vlastní kreslení. V současné době podporují následující ovládací prvky vlastní funkce kreslení:
- Ovládací prvky záhlaví
- Ovládací prvky zobrazení seznamu
- Ovládací prvky výztuže
- Ovládací prvky panelu nástrojů
- Ovládací prvky nástroje nápovědy
- Ovládací prvky trackbaru
- Ovládací prvky stromového zobrazení
Informace o vlastních oznámeních o kreslení
Všechny běžné ovládací prvky, které podporují vlastní kreslení, odesílají kódy oznámení NM_CUSTOMDRAW v konkrétních bodech během operací kreslení. Tyto kódy oznámení popisují operace kreslení, které platí pro celý ovládací prvek, a také operace kreslení specifické pro položky v ovládacím prvku. Stejně jako mnoho kódů oznámení se oznámení NM_CUSTOMDRAW odesílají jako WM_NOTIFY zprávy.
Parametr lParam vlastního oznámení o kreslení bude adresa NMCUSTOMDRAW struktury nebo struktury specifické pro řízení, která obsahuje NMCUSTOMDRAW struktury jako prvního člena. Následující tabulka znázorňuje vztah mezi ovládacími prvky a strukturami, které používají.
| Struktura | Používáno |
|---|---|
| NMCUSTOMDRAW | Ovládací prvky panelu, trackbaru a záhlaví |
| NMLVCUSTOMDRAW | Ovládací prvky zobrazení seznamu |
| NMTBCUSTOMDRAW | Ovládací prvky panelu nástrojů |
| NMTTCUSTOMDRAW | Ovládací prvky nástroje nápovědy |
| NMTVCUSTOMDRAW | Ovládací prvky stromového zobrazení |
Cykly malby, fáze kreslení a oznamovací zprávy
Stejně jako všechny aplikace pro Windows se běžné ovládací prvky pravidelně malují a vymažou na základě zpráv přijatých ze systému nebo jiných aplikací. Proces, při kterém kontrolní obraz sám sebe maluje nebo maže, se nazývá cyklus malování. Ovládací prvky, které podporují vlastní vykreslování, odesílají NM_CUSTOMDRAW kódy oznámení pravidelně během každého cyklu vykreslování. Tento kód oznámení je doprovázen strukturou NMCUSTOMDRAW nebo další strukturou, která obsahuje jako jejího prvního člena strukturu NMCUSTOMDRAW.
Jednou z informací, které struktura NMCUSTOMDRAW obsahuje, je aktuální fáze malovacího cyklu. To se označuje jako fáze kreslení a je vyjádřeno hodnotou v členu dwDrawStage struktury . Ovládací prvek informuje nadřazený prvek o čtyřech základních fázích kreslení. Tyto základní nebo globální fáze kreslení jsou ve struktuře reprezentovány následujícími hodnotami příznaků (definovanými v Commctrl.h).
| Globální hodnoty fáze kreslení | Popis |
|---|---|
| CDDS_PREPAINT | Před zahájením malířského cyklu. |
| CDDS_POSTPAINT | Po dokončení cyklu malování. |
| CDDS_PREERASE | Před zahájením cyklu mazání. |
| CDDS_POSTERASE | Po dokončení cyklu mazání. |
Jednotlivé předchozí hodnoty lze kombinovat s příznakem CDDS_ITEM a určit fáze kreslení specifické pro položky. Pro usnadnění používání obsahuje commctrl.h následující hodnoty specifické pro položku.
| Hodnoty konkrétní fáze pro jednotlivé položky | Popis |
|---|---|
| CDDS_ITEMPREPAINT | Před vykreslení položky. |
| CDDS_ITEMPOSTPAINT | Po nakreslení položky |
| CDDS_ITEMPREERASE | Před vymazáním položky |
| CDDS_ITEMPOSTERASE | Po vymazání položky |
| CDDS_SUBITEM | Obecná kontrolní verze 4.71. Příznak v kombinaci s CDDS_ITEMPREPAINT nebo CDDS_ITEMPOSTPAINT, pokud se kreslí podpoložka. Tato hodnota se nastaví pouze tehdy, když je vrácena hodnota CDRF_NOTIFYITEMDRAW z CDDS_PREPAINT. |
Aplikace musí zpracovat kód oznámení NM_CUSTOMDRAW a pak vrátit konkrétní hodnotu, která informuje ovládací prvek, co musí udělat. Další informace o těchto vrácených hodnotách najdete v následujících částech.
Využití vlastních služeb pro vykreslování
Klíčem k využívání vlastních funkcí kreslení je reakce na kódy oznámení NM_CUSTOMDRAW, které ovládací prvek odesílá. Návratové hodnoty, které aplikace odešle v reakci na tato oznámení, určují chování ovládacího prvku pro daný cyklus malování.
Tato část obsahuje informace o tom, jak může vaše aplikace používat návratové hodnoty oznámení NM_CUSTOMDRAW k určení chování ovládacího prvku.
Podrobnosti jsou rozděleny do následujících témat:
- Reagování na oznámení o předmalování
- Žádost o upozornění specifická pro položky
- nakreslení předmětu osobně
- Změna písma a barev
Reakce na oznámení o předběžném natírání
Na začátku každého malovacího cyklu odešle ovládací prvek kód oznámení NM_CUSTOMDRAW, který určuje hodnotu CDDS_PREPAINT člen dwDrawStage doprovodné struktury NM_CUSTOMDRAW. Hodnota, kterou se aplikace vrátí k tomuto prvnímu oznámení, určuje, jak a kdy ovládací prvek odešle následná vlastní oznámení o kreslení pro zbytek tohoto cyklu malování. Aplikace může v reakci na první oznámení vrátit kombinaci následujících příznaků.
| Návratová hodnota | Efekt |
|---|---|
| CDRF_DODEFAULT | Ovládací prvek se nakreslí sám. Nebude odesílat další NM_CUSTOMDRAW oznámení pro tento cyklus malování. Tento příznak nelze použít v kombinaci s žádným jiným příznakem. |
| CDRF_DOERASE | Ovládací prvek bude kreslit pouze pozadí. |
| CDRF_NEWFONT | Vaše aplikace zadala nové písmo položky; ovládací prvek bude používat nové písmo. Další informace o změně písma najdete v tématu Změna písma a barev. K tomu dochází, když dwDrawStage se rovná CDDS_ITEMPREPAINT. |
| CDRF_NOTIFYITEMDRAW | Ovládací prvek upozorní nadřazenou komponentu na všechny operace kreslení specifické pro jednotlivé položky. Odešle NM_CUSTOMDRAW kódy oznámení před a poté, co načte položky. K tomu dochází, když dwDrawStage rovná CDDS_PREPAINT. |
| CDRF_NOTIFYPOSTERASE | Ovládací prvek oznámí rodiče po vymazání položky. K tomu dochází, když dwDrawStage se rovná CDDS_PREPAINT. |
| CDRF_NOTIFYPOSTPAINT | Ovládací prvek odešle oznámení NM_CUSTOMDRAW po dokončení procesu vykreslování pro celý ovládací prvek. K tomu dochází, když dwDrawStage se rovná CDDS_PREPAINT. |
| CDRF_NOTIFYSUBITEMDRAW | verze 4.71. Aplikace obdrží oznámení NM_CUSTOMDRAW s dwDrawStage nastavený na CDDS_ITEMPREPAINT | CDDS_SUBITEM předtím, než je vykreslena každá dílčí položka v zobrazení seznamu. Pak můžete zadat písmo a barvu pro každý dílčí znak samostatně nebo vrátit CDRF_DODEFAULT pro výchozí zpracování. K tomu dochází, když dwDrawStage se rovná CDDS_ITEMPREPAINT. |
| CDRF_SKIPDEFAULT | Aplikace položku nakreslila ručně. Ovládací prvek položku nenakreslí. K tomu dochází, když dwDrawStage se rovná CDDS_ITEMPREPAINT. |
| CDRF_SKIPPOSTPAINT | Ovládací prvek nenakreslí zvýrazňovací obdélník kolem položky. |
Žádosti o oznámení specifická pro jednotlivé položky
Pokud vaše aplikace vrátí CDRF_NOTIFYITEMDRAW pro počáteční notifikaci vlastního kreslení před malováním, ovládací prvek odešle notifikace pro každou položku, kterou vykreslí během tohoto cyklu vykreslování. Tato oznámení specifická pro položky budou mít hodnotu CDDS_ITEMPREPAINT jako člen ve struktuře dwDrawStage doprovodné struktury NMCUSTOMDRAW. Po nakreslení položky můžete požádat, aby ovládací prvek odeslal další oznámení, a to vrácením CDRF_NOTIFYPOSTPAINT do těchto oznámení specifických pro danou položku. V opačném případě vrátíte CDRF_DODEFAULT a ovládací prvek neoznámí nadřazené okno, dokud nezačíná kreslit další položku.
Nakreslení položky samostatně
Pokud vaše aplikace nakreslí celou položku, vraťte CDRF_SKIPDEFAULT. To umožňuje ovládacímu prvku přeskočit položky, které nemusí kreslit, a tím snížit režii systému. Mějte na paměti, že vrácení této hodnoty znamená, že ovládací prvek nebude kreslit žádnou část položky.
Změna písem a barev
Vaše aplikace může změnit písmo položky pomocí vlastního kreslení. Jednoduše vyberte HFONT, který chcete nastavit do kontextu zařízení zadaného členem hdc struktury NMCUSTOMDRAW přidružené k vlastnímu oznámení o kreslení. Vzhledem k tomu, že vybrané písmo může mít jiné metriky než výchozí písmo, nezapomeňte do návratové hodnoty zprávy s oznámením zahrnout CDRF_NEWFONT bit. Další informace o použití této funkce naleznete v ukázkovém kódu v Using Custom Draw. Písmo, které aplikace určuje, se použije k zobrazení této položky, když není vybraná. Vlastní kreslení neumožňuje měnit atributy písma pro vybrané položky.
Pokud chcete změnit barvy textu pro všechny ovládací prvky, které podporují vlastní kreslení s výjimkou zobrazení seznamu a stromového zobrazení, jednoduše nastavte požadovaný text a barvy pozadí v kontextu zařízení zadaném ve struktuře oznámení vlastního kreslení pomocí SetTextColor a SetBkColor funkcí. Chcete-li upravit barvy textu v zobrazení seznamu nebo stromovém zobrazení, je nutné umístit požadované hodnoty barev do členů clrText a clrTextBk struktury NMLVCUSTOMDRAW nebo NMTVCUSTOMDRAW.
Poznámka
Před verze 6.0 běžných ovládacích prvků panely nástrojů ignorují příznak CDRF_NEWFONT. Verze 6.0 podporuje příznak CDRF_NEWFONT a můžete ho použít k výběru jiného písma pro panel nástrojů. Pokud je však styl vizuálu aktivní, nemůžete změnit barvu panelu nástrojů. Pokud chcete změnit barvu panelu nástrojů ve verzi 6.0, musíte nejdřív zakázat vizuální styly voláním SetWindowTheme a zadáním žádného vizuálního stylu:
SetWindowTheme (hwnd, "", "");
Vlastní kreslení s ovládacími prvky List-View a Tree-View
Nejběžnější ovládací prvky se dají zpracovat v podstatě stejným způsobem. Ovládací prvky zobrazení seznamu a stromového zobrazení ale mají některé funkce, které vyžadují poněkud jiný přístup k vlastnímu kreslení.
U verze 5.0můžou tyto dva ovládací prvky zobrazit oříznutý text, pokud změníte písmo vrácením CDRF_NEWFONT. Toto chování je nezbytné pro zpětnou kompatibilitu s dřívějšími verzemi běžných ovládacích prvků. Pokud chcete změnit písmo ovládacího prvku zobrazení seznamu nebo stromového zobrazení, získáte lepší výsledky, pokud odešlete zprávu CCM_SETVERSION s hodnotou wParam nastavenou na hodnotu 5, než do ovládacího prvku přidáte jakékoli položky.
Vlastní kreslení s ovládacími prvky List-View
Vzhledem k tomu, že ovládací prvky zobrazení seznamu mají dílčí režimy a více režimů zobrazení, budete muset zpracovat oznámení NM_CUSTOMDRAW poněkud jinak než u ostatních běžných ovládacích prvků.
Pro režim sestavy použijte následující postup.
- První NM_CUSTOMDRAW oznámení bude mít dwDrawStage člen přidružené struktury NMCUSTOMDRAW nastaven na CDDS_PREPAINT. Vrátit CDRF_NOTIFYITEMDRAW.
- Pak obdržíte oznámení NM_CUSTOMDRAW s dwDrawStage nastaveným na CDDS_ITEMPREPAINT. Pokud zadáte nová písma nebo barvy a vrátíte CDRF_NEWFONT, změní se všechny dílčí položky. Pokud chcete místo toho zpracovat jednotlivé dílčí položky samostatně, vraťte CDRF_NOTIFYSUBITEMDRAW.
- Pokud jste vrátili CDRF_NOTIFYSUBITEMDRAW v předchozím kroku, obdržíte oznámení NM_CUSTOMDRAW pro každý dílčí objekt s dwDrawStage nastavenou na CDDS_SUBITEM | CDDS_ITEMPREPAINT. Chcete-li změnit písmo nebo barvu pro danou dílčí položku, zadejte nové písmo nebo barvu a vraťte CDRF_NEWFONT.
U velkých ikon, malých ikon a režimů seznamu použijte následující postup.
- První NM_CUSTOMDRAW oznámení bude mít dwDrawStage člen přidružené struktury NMCUSTOMDRAW nastaven na CDDS_PREPAINT. Vrátit CDRF_NOTIFYITEMDRAW.
- Pak obdržíte oznámení NM_CUSTOMDRAW s dwDrawStage nastaveným na CDDS_ITEMPREPAINT. Písma nebo barvy položky můžete změnit zadáním nových písem a barev a vrácením CDRF_NEWFONT. Protože tyto režimy nemají dílčí položky, nebudete dostávat žádné další NM_CUSTOMDRAW oznámení.
Podívejte se na příklad obslužné rutiny oznámení zobrazení seznamu NM_CUSTOMDRAW v části Použití vlastního kreslení.