Sdílet prostřednictvím


Aspekty programování dialogového okna

Tento přehled popisuje některé aspekty programování týkající se dialogových oken.

Přehled obsahuje následující témata.

Procedury dialogového okna

Procedura dialogového okna je podobná proceduře okna v tom, že systém odesílá zprávy do procedury, pokud má informace k předání nebo úkoly k provedení. Na rozdíl od procedury okna procedura dialogového okna nikdy nevolá funkci DefWindowProc. Místo toho vrátí TRUE, pokud zpracuje zprávu nebo FALSE, pokud ne.

Každá procedura dialogového okna má následující formulář:

BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
 
        // Place message cases here. 
 
        default: 
            return FALSE; 
    } 
}

Parametry procedury slouží ke stejnému účelu jako v proceduře okna, přičemž parametr hwndDlg přijímá popisovač okna dialogu.

Většina postupů dialogového okna zpracovává WM_INITDIALOG zprávu a WM_COMMAND zprávy odeslané ovládacími prvky, ale zpracovává jen málo, pokud vůbec nějaké, jiné zprávy. Pokud procedura dialogového okna nezpracovává zprávu, musí vrátit FALSE, aby systém interně zpracovával zprávy. Jedinou výjimkou tohoto pravidla je zpráva WM_INITDIALOG. Procedura dialogového okna musí vrátit TRUE, aby systém dále zpracovával WM_INITDIALOG zprávu. V žádném případě nesmí procedura volat DefWindowProc.

Zpráva WM_INITDIALOG

Systém neodesílá WM_CREATE zprávu do dialogového okna. Místo toho odešle zprávu WM_INITDIALOG při vytváření dialogového okna a všech jeho ovládacích prvků, ale před zobrazením dialogového okna. Tento postup by měl provést všechny inicializace potřebné k zajištění, že dialogové okno zobrazí aktuální nastavení přidružená k úloze. Pokud například dialogové okno obsahuje ovládací prvek pro zobrazení aktuální jednotky a adresáře, musí procedura určit aktuální jednotku a adresář a nastavit ovládací prvek na danou hodnotu.

Procedura může inicializovat ovládací prvky pomocí funkcí, jako je SetDlgItemText a CheckDlgButton. Vzhledem k tomu, že ovládací prvky jsou okna, lze s nimi manipulovat také pomocí funkcí pro správu oken, jako jsou EnableWindow a SetFocus. Procedura může načíst popisovač okna do ovládacího prvku pomocí funkce GetDlgItem.

Procedura dialogového okna může podle potřeby změnit obsah, stav a umístění libovolného ovládacího prvku. Například v dialogovém okně, které obsahuje seznam názvů souborů a tlačítko Otevřít, může procedura zakázat tlačítko Otevřít, dokud uživatel ze seznamu nevybere soubor. V tomto příkladu šablona dialogového okna určuje styl WS_DISABLED pro tlačítko Otevřít a systém tlačítko při vytváření automaticky zakáže. Když procedura dialogového okna obdrží ze seznamu zprávu s oznámením, že uživatel vybral soubor, procedura volá funkci EnableWindow povolit tlačítko Otevřít.

Pokud chcete zobrazit vlastní ikonu na řádku titulků dialogového okna, může obslužná rutina WM_INITDIALOG odeslat WM_SETICON zprávu do dialogového okna.

Pokud aplikace vytvoří dialogové okno pomocí jedné z funkcí DialogBoxParam, DialogBoxIndirectParam, CreateDialogParamnebo CreateDialogIndirectParam, lParam parametr pro zprávu WM_INITDIALOG obsahuje další parametr předaný funkci. Aplikace obvykle tento dodatečný parametr používají k předání ukazatele na další inicializační informace do procedury dialogového okna, ale procedura dialogového okna musí určit význam parametru. Pokud aplikace používá k vytvoření dialogového okna jinou funkci, systém nastaví parametr lParam na NULL.

Před návratem ze zprávy WM_INITDIALOG by měl postup určit, jestli má vstupní fokus nastavit na zadaný ovládací prvek. Pokud procedura dialogového okna vrátí TRUE, systém automaticky nastaví vstupní fokus na ovládací prvek, jehož popisovač okna je v parametru wParam. Pokud ovládací prvek, který přijímá výchozí fokus, není vhodný, může fokus nastavit na příslušný ovládací prvek pomocí funkce SetFocus. Pokud procedura nastaví vstupní fokus, musí vrátit FALSE, aby zabránila systému v nastavení výchozího fokusu. Ovládací prvek, který přijímá výchozí vstupní fokus, je vždy první ovládací prvek zadaný v šabloně, který je viditelný, není zakázaný a má WS_TABSTOP styl. Pokud takový ovládací prvek neexistuje, nastaví systém výchozí vstupní fokus na první ovládací prvek v šabloně.

Zpráva WM_COMMAND

Ovládací prvek může odeslat zprávu WM_COMMAND do procedury dialogového okna, když uživatel provede akci v ovládacím prvku. Tyto zprávy, označované jako zprávy s oznámením, informují o postupu vstupu uživatele a umožňují jí provádět příslušné odpovědi.

Všechny předdefinované ovládací prvky kromě statických ovládacích prvků odesílají zprávy s oznámením pro vybrané akce uživatele. Například tlačítko odešle zprávu BN_CLICKED pokaždé, když uživatel klikne na tlačítko. Ve všech případech obsahuje nižší část slova wParam identifikátor ovládacího prvku, vyšší část slova wParam obsahuje kód oznámení a parametr lParam obsahuje popisovač ovládacího okna.

Procedura dialogového okna by měla monitorovat a zpracovávat zprávy oznámení. Zejména musí procedura zpracovávat zprávy s identifikátory IDOK nebo IDCANCEL; tyto zprávy představují požadavek uživatele k zavření dialogového okna. Postup by měl dialogové okno zavřít pomocí funkce EndDialog pro modální dialogová okna a funkce DestroyWindow pro bezmodální dialogová okna.

Systém také odesílá WM_COMMAND zprávy do procedury dialogového okna, pokud má dialogové okno nabídku, například okno menu, a uživatel klikne na položku nabídky. Konkrétně systém odešle WM_COMMAND zprávu s parametrem wParam nastaveným na IDCANCEL pokaždé, když uživatel klikne na Zavřít v nabídce okna dialogového okna. Zpráva je téměř stejná jako zpráva s oznámením poslaným tlačítkem Zrušit a měla by být zpracována stejným způsobem.

Zpráva WM_PARENTNOTIFY

Ovládací prvek odešle zprávu WM_PARENTNOTIFY pokaždé, když uživatel při nasměrování na ovládací prvek stiskne tlačítko myši. Některé aplikace interpretují tuto zprávu jako signál k provedení akce související s ovládacím prvek, například zobrazení řádku textu popisujícího účel ovládacího prvku.

Systém také odesílá WM_PARENTNOTIFY zprávy při vytváření a zničení okna, ale ne pro ovládací prvky vytvořené ze šablony dialogového okna. Systém brání těmto zprávám zadáním stylu WS_EX_NOPARENTNOTIFY při vytváření ovládacích prvků. Aplikace nemůže toto výchozí chování přepsat, pokud pro toto dialogové okno nespíše vlastní ovládací prvky.

Control-Color Zprávy

Ovládací prvky a systém můžou posílat zprávy o barvě ovládacího prvku, pokud chtějí, aby procedura dialogového okna malovala pozadí ovládacího prvku nebo jiného okna pomocí štětce a barev. To může být užitečné, když aplikace přepíší výchozí barvy použité v dialogových oknech a jejich ovládacích prvcích. Následující barevné zprávy ovládacích prvků nahradily zprávu WM_CTLCOLOR.

Ovládací prvek odešle do dialogového okna zprávu o barvě ovládacího prvku těsně před tím, než nakreslí vlastní pozadí. Zpráva umožňuje postupem určit, který štětec se má použít, a nastavit pozadí a barvy popředí. Postup určuje štětec vrácením úchytu štětce. Chcete-li nastavit barvy pozadí a popředí, procedura používá funkce SetBkColor a SetTextColor pomocí kontextu zobrazovacího zařízení ovládacího prvku. Zpráva barvy ovládacího prvku předá identifikátor kontextu zobrazovacího zařízení do procedury ve wParam parametru zprávy .

Systém odešle WM_CTLCOLORDLG zprávu do dialogového okna, pokud procedura nezpracová WM_ERASEBKGND zprávu. Předdefinovaná třída dialogového okna nemá štětec pro pozadí třídy, takže tato zpráva umožňuje proceduře definovat si vlastní pozadí, aniž by bylo nutné zahrnout kód k provedení této práce.

V každém případě, když procedura dialogového okna nezpracuje zprávu s barvou ovládacího prvku, systém používá štětec s výchozí barvou okna k malování pozadí pro všechny ovládací prvky a okna s výjimkou posuvníků. Aplikace může načíst výchozí barvu okna předáním hodnoty COLOR_WINDOW funkci GetSysColor. Při malování pozadí je barva popředí kontextu zařízení pro zobrazení nastavena na výchozí barvu textu (COLOR_WINDOWTEXT). Pro posuvníky systém používá štětec s výchozí barvou posuvníku (COLOR_SCROLLBAR). V tomto případě jsou barvy pozadí a popředí kontextu zařízení pro zobrazení nastaveny na bílou a černou.

Výchozí zpracování zpráv v dialogovém okně

Procedura okna pro předdefinovanou třídu dialogového okna provádí výchozí zpracování pro všechny zprávy, které procedura dialogového okna nezpracová. Když procedura dialogového okna vrátí FALSE pro libovolnou zprávu, předdefinovaná procedura okna zkontroluje zprávy a provede následující výchozí akce:

Zpráva Výchozí akce
DM_GETDEFID Tuto zprávu můžete odeslat do dialogového okna. Dialogové okno vrátí identifikátor ovládacího prvku výchozího tlačítka, pokud má dialogové okno jeden; v opačném případě vrátí nulu.
DM_REPOSITION Tuto zprávu můžete odeslat do dialogového okna nejvyšší úrovně. Dialogové okno se přesune tak, aby se vešlo na plochu.
DM_SETDEFID Tuto zprávu můžete odeslat do dialogového okna. Dialogové okno nastaví výchozí tlačítko na ovládací prvek určený identifikátorem ovládacího prvku v parametru wParam.
WM_ACTIVATE Obnoví vstupní fokus na ovládací prvek identifikovaný dříve uloženým popisovačem, pokud je dialogové okno aktivováno. V opačném případě procedura uloží popisovač na ovládací prvek, který má vstupní fokus.
WM_CHARTOITEM Vrátí nulu.
WM_CLOSE Publikuje do dialogového okna zprávu BN_CLICKED oznámení a jako identifikátor ovládacího prvku zadá IDCANCEL. Pokud má dialogové okno identifikátor ovládacího prvku IDCANCEL a ovládací prvek je nyní zakázán, procedura zní upozornění a nezobrazní zprávu.
WM_COMPAREITEM Vrátí nulu.
WM_ERASEBKGND Vyplní klientskou oblast dialogového okna buď štětcem vráceným z zprávy WM_CTLCOLORDLG, nebo výchozí barvou okna.
WM_GETFONT Vrátí popisovač písma dialogového okna definovaného aplikací.
WM_INITDIALOG Vrátí nulu.
WM_LBUTTONDOWN Odešle CB_SHOWDROPDOWN zprávu do kombinovaného pole s vstupním fokusem, a nasměruje ovládací prvek, aby skryl jeho rozevírací seznam. Procedura volá DefWindowProc k dokončení výchozí akce.
WM_NCDESTROY Uvolní globální paměť přidělenou pro ovládací prvky pro úpravy v dialogovém okně (platí pro dialogová okna, která určují styl DS_LOCALEDIT) a uvolní libovolné písmo definované aplikací (platí pro dialogová okna, která určují DS_SETFONT nebo DS_SHELLFONT styl). Procedura volá funkci DefWindowProc k dokončení výchozí akce.
WM_NCLBUTTONDOWN Odešle zprávu CB_SHOWDROPDOWN ovládacímu prvku pole se seznamem, které má vstupní fokus, a instruuje jej, aby skryl svůj rozevírací seznam. Procedura volá DefWindowProc, aby dokončila výchozí akci.
WM_NEXTDLGCTL Nastaví vstupní fokus na další nebo předchozí ovládací prvek v dialogovém okně, na ovládací prvek identifikovaný uchopením v parametru wParam nebo na první ovládací prvek v dialogovém okně, který je viditelný, není deaktivovaný a má WS_TABSTOP styl. Procedura tuto zprávu ignoruje, pokud aktuální okno se vstupním fokusem není ovládací prvek.
WM_SETFOCUS Nastaví vstupní fokus na ovládací prvek identifikovaný dříve uloženým úchytem ovládacího okna. Pokud takový popisovač neexistuje, nastaví procedura vstupní fokus na první ovládací prvek v šabloně dialogového okna, který je viditelný, není zakázaný a má styl WS_TABSTOP. Pokud takový ovládací prvek neexistuje, nastaví procedura vstupní fokus na první ovládací prvek v šabloně.
WM_SHOWWINDOW Uloží popisovač ovládacího prvku, který má fokus vstupu, pokud je dialogové okno skryté, a potom zavolá DefWindowProc dokončit výchozí akci.
WM_SYSCOMMAND Uloží popisovač ovládacího prvku, který má fokus vstupu, pokud je dialogové okno minimalizováno, a poté zavolá DefWindowProc, aby dokončila výchozí akci.
WM_VKEYTOITEM Vrátí nulu.

Předdefinovaná procedura okna předá všechny ostatní zprávy DefWindowProc pro výchozí zpracování.

Rozhraní klávesnice dialogového okna

Systém poskytuje speciální rozhraní klávesnice pro dialogová okna, která provádí speciální zpracování pro několik kláves. Rozhraní generuje zprávy, které odpovídají určitým tlačítkům v dialogovém okně nebo změní vstupní fokus z jednoho ovládacího prvku na jiný. Následují klíče použité v tomto rozhraní a jejich příslušné akce.

Klíč Akce
Alt+mnemonický Přesune vstupní fokus na první ovládací prvek (který má styl WS_TABSTOP) za statickým ovládacím prvkem obsahujícím zadanou mnemoniku.
DOLŮ Přesune fokus vstupu na další ovládací prvek ve skupině.
VSTOUPIT Odešle WM_COMMAND zprávu proceduře dialogového okna. Parametr wParam je nastaven na hodnotu IDOK nebo na identifikátor ovládacího prvku výchozího tlačítka.
ESC Odešle zprávu WM_COMMAND do procedury dialogového okna. Parametr wParam je nastavený na IDCANCEL.
VLEVO Přesune vstupní fokus na předchozí ovládací prvek ve skupině.
mnemonický Přesune vstupní fokus na první ovládací prvek (který má styl WS_TABSTOP) po statickém ovládacím prvku obsahujícím zadaný mnemonik.
VPRAVO Přesune fokus vstupu na další ovládací prvek ve skupině.
SHIFT+TAB Přesune vstupní fokus na předchozí ovládací prvek, který má styl WS_TABSTOP.
TABULÁTOR Přesune fokus vstupu na další ovládací prvek, který má styl WS_TABSTOP.
NAHORU Přesune vstupní fokus na předchozí ovládací prvek ve skupině.

Systém automaticky poskytuje rozhraní klávesnice pro všechna modální dialogová okna. Neposkytuje rozhraní pro bezmodální dialogová okna, pokud aplikace nevolá funkci IsDialogMessage k filtrování zpráv v hlavní smyčce zpráv. To znamená, že aplikace musí předat zprávu IsDialogMessage ihned po načtení zprávy z fronty zpráv. Funkce zpracuje zprávy, pokud se jedná o dialogové okno, a vrátí nenulovou hodnotu, která indikuje, že zpráva byla zpracována a nesmí být předána TranslateMessage nebo DispatchMessage funkce.

Vzhledem k tomu, že klávesnicové rozhraní dialogového okna používá směrové klávesy k pohybu mezi ovládacími prvky, aplikace tyto klávesy nemůže použít k posouvání obsahu žádného modálního dialogového okna ani žádného bezmodálního dialogového okna, pro které je volána IsDialogMessage. Pokud má dialogové okno posuvníky, musí aplikace poskytnout alternativní rozhraní klávesnice pro posuvníky. Všimněte si, že rozhraní myši pro posouvání je k dispozici, když systém obsahuje myš.

Styl WS_TABSTOP

Styl WS_TABSTOP určuje ovládací prvky, ke kterým se uživatel může pohybovat stisknutím klávesy TAB nebo SHIFT+TAB.

Když uživatel stiskne klávesu TAB nebo SHIFT+TAB, systém nejprve určí, jestli jsou tyto klávesy zpracovány ovládacím prvku, který má aktuálně fokus vstupu. Ovládacímu prvku odešle zprávu WM_GETDLGCODE, a pokud ovládací prvek vrátí DLGC_WANTTAB, systém předá ovládacímu prvku klíče. Jinak systém používá funkci GetNextDlgTabItem k vyhledání dalšího ovládacího prvku, který je viditelný, není zakázaný a který má styl WS_TABSTOP. Hledání začíná ovládacím prvku, který má aktuálně fokus vstupu, a pokračuje v pořadí, v jakém byly ovládací prvky vytvořeny – to znamená pořadí, ve kterém jsou definovány v šabloně dialogového okna. Když systém vyhledá ovládací prvek s požadovanými vlastnostmi, systém přesune vstupní fokus na něj.

Pokud hledání dalšího ovládacího prvku se stylem WS_TABSTOP narazí na okno se stylem WS_EX_CONTROLPARENT, systém rekurzivně prohledá podřízené položky okna.

Aplikace může také použít GetNextDlgTabItem k vyhledání ovládacích prvků, které mají WS_TABSTOP styl. Funkce načte úchyt okna dalšího nebo předchozího ovládacího prvku, který má styl WS_TABSTOP bez přesunutí vstupního fokusu.

Styl WS_GROUP

Ve výchozím nastavení systém přesune vstupní fokus na další nebo předchozí ovládací prvek pokaždé, když uživatel stiskne směrovou klávesu. Pokud aktuální ovládací prvek se vstupním fokusem nezpracuje tyto klávesy a další nebo předchozí ovládací prvek není statický ovládací prvek, systém bude nadále přesouvat vstupní fokus mezi všemi ovládacími prvky v dialogovém okně, protože uživatel nadále stiskne směrové klávesy.

K úpravě tohoto výchozího chování může aplikace použít styl WS_GROUP. Styl označuje začátek skupiny ovládacích prvků. Pokud má ovládací prvek ve skupině vstupní fokus, když uživatel začne stisknout směrové klávesy, fokus zůstane ve skupině. Obecně platí, že první ovládací prvek ve skupině musí mít styl WS_GROUP a všechny ostatní ovládací prvky ve skupině nesmí mít tento styl. Všechny ovládací prvky ve skupině musí být sousedící – to znamená, že musely být vytvořeny po sobě bez jakýchkoliv intervenujících ovládacích prvků.

Když uživatel stiskne směrovou klávesu, systém nejprve určí, jestli aktuální ovládací prvek, který má vstupní fokus, zpracovává směrové klávesy. Systém odešle ovládacímu prvku WM_GETDLGCODE zprávu a pokud ovládací prvek vrátí hodnotu DLGC_WANTARROWS, předá klíč ovládacímu prvku. V opačném případě systém použije funkci GetNextDlgGroupItem k určení dalšího ovládacího prvku ve skupině.

GetNextDlgGroupItem hledá ovládací prvky v pořadí (nebo v obráceném pořadí), které byly vytvořeny. Pokud uživatel stiskne klávesu RIGHT nebo DOWN, GetNextDlgGroupItem vrátí další ovládací prvek, pokud tento ovládací prvek nemá styl WS_GROUP. V opačném případě funkce obrátí pořadí hledání a vrátí první ovládací prvek, který má styl WS_GROUP. Pokud uživatel stiskne klávesu LEFT nebo UP, vrátí funkce předchozí ovládací prvek, pokud aktuální ovládací prvek již nemá WS_GROUP styl. Pokud má aktuální ovládací prvek tento styl, funkce obrátí pořadí hledání, vyhledá první ovládací prvek, který má WS_GROUP styl, a vrátí ovládací prvek, který bezprostředně předchází umístěnému ovládacímu prvku.

Pokud hledání dalšího ovládacího prvku ve skupině narazí na okno se stylem WS_EX_CONTROLPARENT, systém rekurzivně prohledá potomky okna.

Jakmile má systém další nebo předchozí ovládací prvek, odešle do ovládacího prvku zprávu WM_GETDLGCODE, aby určil typ ovládacího prvku. Systém pak přesune vstupní fokus na ovládací prvek, pokud není statickým ovládacím prvkem. Pokud je ovládací prvek automatický přepínač, systém do něj odešle BM_CLICK zprávu. Aplikace může také použít GetNextDlgGroupItem k vyhledání ovládacích prvků ve skupině.

Obecně platí, že první ovládací prvek ve skupině kombinuje styly WS_GROUP a WS_TABSTOP, aby se uživatel mohl přesunout ze skupiny do skupiny pomocí klávesy TAB. Pokud skupina obsahuje přepínače, měla by aplikace použít styl WS_TABSTOP pouze na první ovládací prvek ve skupině. Systém automaticky přesune styl, když se uživatel přesune mezi ovládacími prvky ve skupině. Tím zajistíte, že fokus vstupu bude vždy na naposledy vybraném ovládacím prvku, když se uživatel přesune do skupiny pomocí klávesy TAB.

Mnemotechnika

Mnemotechnická pomůcka je vybrané písmeno nebo číslice v popisku tlačítka nebo v textu statického ovládacího prvku. Systém přesune vstupní fokus na ovládací prvek přidružený k mnemonic pokaždé, když uživatel stiskne klávesu, která odpovídá mnemonic, nebo stiskne tuto klávesu a klávesu ALT v kombinaci. Nástroj Mnemonics poskytuje uživateli rychlý způsob přechodu na zadaný ovládací prvek pomocí klávesnice.

Aplikace vytvoří mnemonic pro ovládací prvek vložením ampersandu (&) bezprostředně před vybrané písmeno nebo číslici v popisku nebo textu ovládacího prvku. Ve většině případů obsahuje řetězec ukončený hodnotou null, který je součástí ovládacího prvku v šabloně dialogového okna, ampersand. Aplikace však může kdykoli vytvořit mnemonic tím, že nahradí existující popisek nebo text ovládacího prvku pomocí funkce SetDlgItemText. Pro každý ovládací prvek lze zadat pouze jednu mnemoniku. I když se doporučuje, není nutné, aby mnemoniky v dialogovém okně byly jedinečné.

Když uživatel stiskne písmeno nebo číslici, systém nejprve určí, jestli aktuální ovládací prvek, který má vstupní fokus, zpracuje klíč. Systém odešle ovládacímu prvku zprávu WM_GETDLGCODE a pokud ovládací prvek vrátí DLGC_WANTALLKEYS nebo DLG_WANTMESSAGE hodnotu, systém předá klíč ovládacímu prvku. V opačném případě vyhledá ovládací prvek, jehož mnemonic odpovídá zadanému písmenu nebo číslici. Pokračuje v hledání, dokud nenajde ovládací prvek nebo prověří všechny ovládací prvky. Během hledání přeskočí všechny statické ovládací prvky, které mají styl SS_NOPREFIX.

Pokud hledání ovládacího prvku s odpovídající mnemotechnickou pomůckou narazí na okno se stylem WS_EX_CONTROLPARENT, systém rekurzivně vyhledá podřízené prvky okna.

Pokud systém vyhledá statický ovládací prvek a ovládací prvek není zakázaný, systém přesune vstupní fokus na první ovládací prvek za statickým ovládacím prvku, který je viditelný, není zakázaný a má styl WS_TABSTOP. Pokud systém najde jiný ovládací prvek, který má odpovídající mnemoniku, přesune zaměřený vstup na ovládací prvek. Pokud je ovládací prvek výchozím tlačítkem, systém odešle BN_CLICKED oznámení do procedury dialogového okna. Pokud je ovládací prvek jiným stylem tlačítka a v dialogovém okně není žádný jiný ovládací prvek se stejným mnemonicem, systém odešle BM_CLICK zprávu do ovládacího prvku.

Nastavení dialogového okna

Nastavení dialogového okna jsou aktuální výběry a hodnoty ovládacích prvků v dialogovém okně. Procedura dialogového okna je zodpovědná za inicializaci ovládacích prvků do těchto nastavení při vytváření dialogového okna. Před zničením dialogového okna také zodpovídá za načtení aktuálního nastavení z ovládacích prvků. Metody použité k inicializaci a načtení nastavení závisí na typu ovládacího prvku.

Další informace najdete v následujících tématech:

Přepínače a zaškrtávací políčka

Dialogová okna používají přepínače a zaškrtávací políčka, aby si uživatel vybral ze seznamu možností. Přepínače umožňují uživateli vybírat ze vzájemně se vylučujíných možností; zaškrtávací políčka umožňují uživateli vybrat kombinaci možností.

Procedura dialogového okna může nastavit počáteční stav zaškrtávacího políčka pomocí funkce CheckDlgButton, která toto políčko nastaví nebo zruší. U přepínačů ve skupině vzájemně se vylučujících přepínačů může procedura dialogového okna použít funkci CheckRadioButton nastavit příslušné přepínač a automaticky vymazat jakýkoli jiný přepínač.

Před ukončením dialogového okna může procedura dialogového okna zkontrolovat stav každého přepínače a zaškrtávacího políčka pomocí funkce IsDlgButtonChecked, která vrací aktuální stav tlačítka. Dialogové okno obvykle ukládá tyto informace k inicializaci tlačítek při příštím vytvoření dialogového okna.

Dialogové okno Upravit ovládací prvky

Mnoho dialogových oken obsahuje ovládací prvky pro úpravy, které uživateli umožňují zadat text jako vstup. Většina procedur dialogového okna inicializuje ovládací prvek pro úpravy při prvním spuštění dialogového okna. Například procedura dialogového okna může umístit navržený název souboru do ovládacího prvku, který uživatel může vybrat, upravit nebo nahradit. Procedura dialogového okna může nastavit text v ovládacím prvku pro úpravy pomocí funkce SetDlgItemText, která kopíruje text ze zadané vyrovnávací paměti do ovládacího prvku pro úpravy. Když ovládací prvek pro úpravy obdrží vstupní fokus, automaticky vybere celý text pro úpravy.

Vzhledem k tomu, že ovládací prvky pro úpravy automaticky nevracejí text do dialogového okna, musí procedura dialogového okna načíst text před ukončením. Text může načíst pomocí funkce GetDlgItemText, která zkopíruje text ovládacího prvku pro úpravy do vyrovnávací paměti. Procedura dialogového okna obvykle uloží tento text pro pozdější inicializaci ovládacího prvku pro úpravy nebo ho předá rodičovskému oknu ke zpracování.

Některá dialogová okna používají ovládací prvky pro úpravy, které uživateli umožňují zadat čísla. Procedura dialogového okna může načíst číslo z ovládacího prvku pro úpravy pomocí funkce GetDlgItemInt, která načte text z ovládacího prvku pro úpravy a převede text na desetinnou hodnotu. Uživatel zadá číslo v desítkových číslicích. Může být podepsaný nebo nepodepsaný. Procedura dialogového okna může zobrazit celé číslo pomocí funkce SetDlgItemInt. SetDlgItemInt převede celé číslo se znaménkem nebo bez znaménka na řetězec desítkových číslic.

Seznamová pole, kombinovaná pole a seznamy adresářů

Některá dialogová okna zobrazují seznamy jmen, ze kterých může uživatel vybrat jedno nebo více jmen. Chcete-li zobrazit seznam názvů souborů, například dialogové okno obvykle používá seznam a DlgDirList a DlgDirSelectEx funkce. Funkce DlgDirList automaticky vyplní seznam názvy souborů v aktuálním adresáři. Funkce DlgDirSelect načte vybraný název souboru ze seznamu. Tyto dvě funkce společně poskytují pohodlný způsob zobrazení seznamu adresářů, aby uživatel mohl vybrat soubor, aniž by musel zadávat jeho název a umístění.

Dialogové okno může také použít pole se seznamem k zobrazení seznamu názvů souborů. Funkce DlgDirListComboBox automaticky vyplní část seznamového pole kombo boxu názvy souborů v aktuálním adresáři. Funkce DlgDirSelectComboBoxEx načte vybraný název souboru z části seznamu.

Ovládací zprávy dialogového okna

Mnoho ovládacích prvků rozpozná předdefinované zprávy, které při přijetí ovládacími prvky způsobí, že provádějí nějakou akci. Zpráva BM_SETCHECK například nastaví zaškrtávací políčko a EM_GETSEL zpráva získá část textu ovládacího prvku, který je aktuálně vybraný. Řídicí zprávy poskytují dialogový postup větší a flexibilnější přístup k ovládacím prvkům než standardní funkce, takže se často používají, když dialogové okno vyžaduje složité interakce s uživatelem.

Procedura dialogového okna může odeslat zprávu ovládacímu prvku zadáním identifikátoru ovládacího prvku a pomocí funkce SendDlgItemMessage, která je identická s funkcí SendMessage s tím rozdílem, že používá identifikátor ovládacího prvku místo popisovače okna k identifikaci ovládacího prvku, který má zprávu přijmout. Zadaná zpráva může vyžadovat, aby procedura dialogového okna odeslala parametry se zprávou a zpráva může mít odpovídající návratové hodnoty. Operace a požadavky jednotlivých řídicích zpráv závisí na účelu zprávy a ovládacím prvku, který ji zpracovává.

Další informace o ovládacích zprávách naleznete v tématu Ovládací prvky systému Windows.

Vlastní dialogová okna

Aplikace může vytvořit vlastní dialogová okna pomocí třídy okna definované aplikací pro dialogová okna namísto použití předdefinované třídy dialogového okna. Aplikace obvykle používají tuto metodu, když je dialogové okno hlavním oknem, ale je také užitečné pro vytváření modálních a bezmodálních dialogových oken pro aplikace, které mají standardní překrývající se okna.

Třída okna definovaná aplikací umožňuje aplikaci definovat proceduru okna pro dialogové okno a zpracovat zprávy před jejich odesláním do procedury dialogového okna. Umožňuje také aplikaci definovat ikonu třídy, štětec na pozadí třídy a nabídku třídy pro dialogové okno. Aplikace musí před pokusem o vytvoření dialogového okna zaregistrovat třídu okna a musí poskytnout šablonu dialogového okna s hodnotou atomu nebo názvem třídy okna.

Mnoho aplikací vytvoří novou třídu dialogového okna tak, že nejprve načítá informace třídy pro předdefinovanou třídu dialogového okna a předá ji funkci GetClassInfo, která vyplní WNDCLASS strukturu s informacemi. Aplikace upraví jednotlivé členy struktury, například název třídy, štětec a ikonu, a pak zaregistruje novou třídu pomocí funkce RegisterClass. Pokud aplikace vyplní WNDCLASS strukturu samostatně, musí nastavit cbWndExtra člen na DLGWINDOWEXTRA, což je počet nadbytečných bajtů, které systém vyžaduje pro každé dialogové okno. Pokud aplikace pro každé dialogové okno také používá nadbytečné bajty, musí být nad rámec dodatečných bajtů vyžadovaných systémem.

Procedura okna vlastního dialogového okna má stejné parametry a požadavky jako všechny ostatní procedury okna. Na rozdíl od jiných procedur okna by však procedura okna pro toto dialogové okno měla volat funkci DefDlgProc místo funkce DefWindowProc pro všechny zprávy, které nezpracová. DefDlgProc provádí stejné výchozí zpracování zpráv jako procedura okna pro předdefinované dialogové okno, které zahrnuje volání procedury dialogového okna.

Aplikace může také vytvořit vlastní dialogová okna podtřídou proceduru okna předdefinovaného dialogového okna. Funkce SetWindowLong umožňuje aplikaci zadat proceduru okna pro zadané okno. Aplikace se také může pokusit o podtřídu pomocí funkce SetClassLong, ale to ovlivní všechna dialogová okna v systému, nejen ta, která patří k aplikaci.

Aplikace, které vytvářejí vlastní dialogová okna, někdy poskytují alternativní rozhraní klávesnice pro dialogová okna. U dialogových oken bez režimu to může znamenat, že aplikace nevolá funkci IsDialogMessage a místo toho zpracovává veškerý vstup z klávesnice ve vlastní proceduře okna. V takových případech může aplikace pomocí WM_NEXTDLGCTL zprávy minimalizovat kód potřebný k přesunutí vstupního fokusu z jednoho ovládacího prvku do druhého. Tato zpráva, při předání DefDlgProc, přesune zaměření na zadaný ovládací prvek a aktualizuje vzhled ovládacích prvků, například přesunutím výchozího ohraničení tlačítka nebo nastavením automatického přepínače.