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 informace o ovládacích prvcích definovaných aplikacím nebo vlastních ovládacích prvcích.
Probírají se následující témata.
- vytváření ovládacích prvků Owner-Drawn
- Podtřída třídy okna existujícího ovládacího prvku
- Implementace Application-Defined třídy okna
- Odesílání oznámení z řídicího panelu
- Přístupnost
- související témata
Vytváření ovládacích prvků Owner-Drawn
Tlačítka, nabídky, statické textové ovládací prvky, rozevírací seznamy a kombinovaná pole lze vytvořit pomocí příznaku stylu nakreslené vlastníkem. Pokud má ovládací prvek styl nakreslený vlastníkem, systém zpracovává interakci uživatele s ovládacím prvku obvyklým způsobem, provádí takové úlohy, jako je zjišťování, kdy uživatel vybral tlačítko a oznámí vlastníkovi události. Vzhledem k tomu, že ovládací prvek je vykreslen vlastníkem, je nadřazené okno ovládacího prvku zodpovědné za vizuální vzhled ovládacího prvku. Nadřazené okno obdrží zprávu, kdykoli je třeba vykreslit ovládací prvek.
U tlačítek a statických textových ovládacích prvků má vlastníkům kreslený styl vliv na to, jak systém vykreslí celý ovládací prvek. U seznamových a kombo boxů nadřazené okno nakreslí položky v ovládacím prvku a ovládací prvek nakreslí svůj vlastní obrys. Aplikace může například přizpůsobit seznam tak, aby zobrazovala malý rastrový obrázek vedle každé položky v seznamu.
Následující ukázkový kód ukazuje, jak vytvořit ovládací prvek statického textu nakreslený vlastníkem. Předpokládejme, že je definována sada Unicode.
// g_myStatic is a global HWND variable.
g_myStatic = CreateWindowEx(0, L"STATIC", L"Some static text",
WS_CHILD | WS_VISIBLE | SS_OWNERDRAW,
25, 125, 150, 20, hDlg, 0, 0, 0);
V následujícím příkladu z procedury okna dialogového okna, který obsahuje ovládací prvek vytvořený v předchozím příkladu, je zpráva WM_DRAWITEM zpracována tak, že text je zobrazen ve vlastní barvě pomocí výchozího písma. Všimněte si, že při zpracování WM_DRAWITEMnení nutné volat BeginPaint a EndPaint.
case WM_DRAWITEM:
{
LPDRAWITEMSTRUCT pDIS = (LPDRAWITEMSTRUCT)lParam;
if (pDIS->hwndItem == g_myStatic)
{
SetTextColor(pDIS->hDC, RGB(100, 0, 100));
WCHAR staticText[99];
int len = SendMessage(myStatic, WM_GETTEXT,
ARRAYSIZE(staticText), (LPARAM)staticText);
TextOut(pDIS->hDC, pDIS->rcItem.left, pDIS->rcItem.top, staticText, len);
}
return TRUE;
}
Další informace o ručně vykreslovaných ovládacích prvcích naleznete v tématu Vytvoření seznamu vykreslovaného vlastníkem a Kombinovaná pole nakreslená vlastníkem.
Změna podtřídy okenní třídy u stávajícího ovládacího prvku
Podtřídy existujícího ovládacího prvku je dalším způsobem, jak vytvořit vlastní ovládací prvek. Procedura podtřídy může změnit vybrané chování ovládacího prvku zpracováním zpráv, které ovlivňují vybrané chování. Všechny ostatní zprávy se předávají původní proceduře okna pro ovládací prvek. Aplikace může například zobrazit malý rastrový obrázek vedle textu v ovládacím prvku pro úpravy jen pro čtení přidáním podtřídy k ovládacímu prvku a zpracováním zprávy WM_PAINT. Další informace naleznete v tématu O procedurách oken a ovládací prvky podtřídy.
Implementace třídy okna Application-Defined
Chcete-li vytvořit ovládací prvek, který není explicitně založen na existujícím ovládacím prvku, musí aplikace vytvořit a zaregistrovat třídu okna. Proces registrace třídy okna definované aplikací pro vlastní ovládací prvek je stejný jako registrace třídy pro běžné okno. Chcete-li vytvořit vlastní ovládací prvek, zadejte název třídy okna v CreateWindowEx funkce nebo v šabloně dialogového okna. Každá třída musí mít jedinečný název, odpovídající proceduru okna a další informace.
Procedura okna alespoň nakreslí ovládací prvek. Pokud aplikace používá ovládací prvek k povolení informací o typu uživatele, procedura okna také zpracuje vstupní zprávy z klávesnice a myši a odešle zprávy s oznámením do nadřazeného okna. Kromě toho, pokud ovládací prvek podporuje řídicí zprávy, procedura okna zpracovává zprávy odeslané do něj nadřazeným oknem nebo jinými okny. Ovládací prvky například často zpracovávají WM_GETDLGCODE zprávu odesílanou dialogovými okny, aby dialogové okno nasměrovály na zpracování vstupu klávesnice určitým způsobem.
Procedura okna pro ovládací prvek definovaný aplikací by měla zpracovat všechny předdefinované řídicí zprávy v následující tabulce, pokud zpráva ovlivňuje operaci ovládacího prvku.
Zpráva | Doporučení |
---|---|
WM_GETDLGCODE | Proces, pokud ovládací prvek používá klávesy ENTER, ESC, TAB nebo šipkové klávesy. Funkce IsDialogMessage odešle tuto zprávu ovládacím prvkům v dialogovém okně, aby bylo možné určit, zda se mají klíče zpracovat nebo předat ovládacímu prvku. |
WM_GETFONT | Proces, pokud je zpracována také zpráva WM_SETFONT. |
WM_GETTEXT | Proces, pokud text ovládacího prvku není stejný jako název zadaný funkcí CreateWindowEx. |
WM_GETTEXTLENGTH | Proces, pokud text ovládacího prvku není stejný jako název zadaný funkcí CreateWindowEx. |
WM_KILLFOCUS | Pokud ovládací prvek zobrazuje kurzor, obdélník fokus, nebo jinou položku, označuje to, že má vstupní fokus. |
WM_SETFOCUS | Proces, pokud ovládací prvek zobrazuje kurzor, rámeček zaostření nebo jinou položku, která označuje, že má zadávací zaostření. |
WM_SETTEXT | Proces, pokud text ovládacího prvku není stejný jako název zadaný funkcí CreateWindowEx. |
WM_SETFONT | Proces, pokud ovládací prvek zobrazí text. Systém odešle tuto zprávu při vytváření dialogového okna, které má styl DS_SETFONT. |
Řídicí zprávy definované aplikací jsou specifické pro daný ovládací prvek a musí být explicitně odeslány do ovládacího prvku pomocí SendMessage nebo SendDlgItemMessage funkce. Číselná hodnota pro každou zprávu musí být jedinečná a nesmí být v konfliktu s hodnotami jiných zpráv okna. Aby se zajistilo, že hodnoty zpráv definované aplikací nejsou v konfliktu, měla by aplikace vytvořit každou hodnotu přidáním jedinečného čísla do hodnoty WM_USER.
Odesílání oznámení z ovládacího prvku
Vlastní ovládací prvky můžou být potřeba k odesílání oznámení událostí do nadřazeného okna, aby hostitelská aplikace mohla na tyto události reagovat. Vlastní zobrazení seznamu může například odeslat oznámení, když uživatel vybere položku, a další oznámení, když je položka vybrána dvojitým kliknutím.
Oznámení se odesílají jako zprávy WM_COMMAND nebo WM_NOTIFY. Zprávy WM_NOTIFY obsahují více informací než zprávy WM_COMMAND.
Identifikátor ovládacího prvku je jedinečné číslo, které aplikace používá k identifikaci ovládacího prvku odesílajícího zprávu. Aplikace při vytváření ovládacího prvku nastaví identifikátor ovládacího prvku. Aplikace určuje identifikátor buď v hMenu parametru CreateWindowEx nebo v ID člen DLGITEMTEMPLATEEX struktury.
Vzhledem k tomu, že samotný ovládací prvek nenastavuje identifikátor ovládacího prvku, musí ho před odesláním oznámení načíst. Ovládací prvek musí použít funkci GetDlgCtrlID k načtení vlastního identifikátoru ovládacího prvku. Přestože je identifikátor ovládacího prvku zadán jako popisovač nabídky při vytváření ovládacího prvku, nelze k načtení identifikátoru použít funkci GetMenu. Případně může ovládací prvek načíst identifikátor z hMenu člena v CREATESTRUCT struktury během zpracování zprávy WM_CREATE.
Následující příklady, kde hwndControl je popisovač ovládacího okna a CN_VALUECHANGED je vlastní definice oznámení, ukazují dva způsoby odeslání oznámení specifické pro ovládací prvek.
// Send as WM_COMMAND.
SendMessage(GetParent(hwndControl),
WM_COMMAND,
MAKEWPARAM(GetDlgCtrlID(hwndControl), CN_VALUECHANGED),
(LPARAM)hwndControl);
// Send as WM_NOTIFY.
NMHDR nmh;
nmh.code = CN_VALUECHANGED;
nmh.idFrom = GetDlgCtrlID(hwndControl);
nmh.hwndFrom = hwndControl;
SendMessage(GetParent(hwndControl),
WM_NOTIFY,
(WPARAM)hwndControl,
(LPARAM)&nmh);
Všimněte si, že struktura NMHDR může být součástí větší řídicí struktury, která obsahuje další informace. V tomto příkladu mohou být staré a nové hodnoty ovládacího prvku obsaženy v této struktuře. (Tyto rozšířené struktury se používají s mnoha standardními oznámeními; viz například LVN_INSERTITEM, která používá NMLISTVIEW strukturu.)
Přístupnost
Všechny běžné ovládací prvky podporují funkci Microsoft Active Accessibility (MSAA), která umožňuje programový přístup k aplikacím s podporou přístupnosti, jako jsou čtečky obrazovky. MSAA také umožňuje automatizaci uživatelského rozhraní, novější technologii, pracovat s ovládacími prvky.
Vlastní ovládací prvky by měly implementovat rozhraní IAccessible (pro podporu MSAA) nebo rozhraní automatizace uživatelského rozhraní nebo obojí. V opačném případě budou technologie přístupnosti moci získat pouze velmi omezené informace o ovládacím okně, nebudou mít přístup k vlastnostem ovládacího prvku a nebudou moci aktivovat události v ovládacím prvku.
Další informace o zajištění přístupnosti vašeho ovládacího prvku najdete v tématu Windows Automation API.
Související témata
-
konceptuální
-
Přizpůsobení vzhledu ovládacího prvku pomocí vlastního vykreslení
-
Použití vizuálních stylů s ovládacími prvky Owner-Drawn