Sdílet prostřednictvím


O kombinovaných polích

Kombinované pole kombinuje textové pole nebo statický text a seznam.

Toto téma obsahuje následující části.

Typy a styly kombinovaného pole

Kombinované pole se skládá ze seznamu a pole pro výběr. Seznam obsahuje možnosti, které může uživatel vybrat, a pole výběru zobrazí aktuální výběr. Pokud je pole výběru ovládacím prvek pro úpravy, uživatel může zadat informace, které nejsou v seznamu k dispozici; v opačném případě může uživatel vybrat pouze položky v seznamu.

Knihovna společných ovládacích prvků obsahuje tři hlavní styly kombinovaného pole, jak je znázorněno v následující tabulce.

Typ kombinovaného pole Stylová konstanta Popis
Jednoduchý CBS_SIMPLE Zobrazí seznam vždy a zobrazí vybranou položku v ovládacím prvku pro úpravy.
Rozevírací seznam CBS_DROPDOWN Zobrazí seznam po kliknutí na ikonu a zobrazí vybranou položku v ovládacím prvku pro úpravy.
Rozevírací seznam (rozbalovací seznam) CBS_DROPDOWNLIST Zobrazí seznam po kliknutí na ikonu a zobrazí vybranou položku ve statickém ovládacím prvku.

 

Následující snímky obrazovky zobrazují všechny tři druhy pole se seznamem, protože se mohou objevit v systému Windows Vista. Na prvním snímku obrazovky uživatel vybral položku v jednoduchém poli se seznamem. Uživatel může také zadat novou hodnotu do textového pole tohoto ovládacího prvku. Seznam byl nastaven na velikost v editoru prostředků sady Microsoft Visual Studio a je dostatečně velký, aby pojal dvě položky.

snímek obrazovky znázorňující položku vybranou v jednoduchém kombinovaném poli

Na druhém snímku obrazovky uživatel zadal do pole pro úpravy v rozbalovacím kombinovaném poli nový text. Uživatel mohl také vybrat existující položku. Seznam se rozbalí tak, aby se do něj vešlo co nejvíce položek.

snímek obrazovky s textem napsaným do kombinovaného rozevíracího pole

Na třetím snímku obrazovky uživatel otevřel rozevírací seznam se seznamem. Seznamové pole se rozbalí, aby pojmulo co nejvíce položek. Uživatel nemůže zadat nový text.

snímek obrazovky znázorňující položku vybranou v kombinovaném rámečku rozevíracího seznamu

Existuje také řada stylů pole se seznamem, které definují konkrétní vlastnosti. Styly kombinovaného pole definují konkrétní vlastnosti kombinovaného pole. Můžete kombinovat styly, avšak některé styly se vztahují pouze na určité typy kombinovaných polí. Tabulku stylů kombinovaných polí najdete v tématu Styly kombinovaných polí.

Poznámka

Chcete-li používat vizuální styly s kombinovanými seznamy, musí aplikace obsahovat manifest a musí volat InitCommonControls na počátku programu. Informace o vizuálních stylech najdete v tématu vizuální styly. Informace o manifestech naleznete v části Povolení vizuálních stylů.

 

Seznam kombinovaných polí

Seznam je část rozbalovacího seznamu, ve které se zobrazují položky, které uživatel může vybrat. Aplikace obvykle inicializuje obsah seznamu při vytváření rozbalovacího seznamu. Jakákoli položka seznamu vybraná uživatelem je aktuální výběr. Nelze vybrat více položek. V jednoduchých a rozevíracích kombinovaných polích může uživatel do pole výběru psát místo výběru položky ze seznamu. V těchto případech neexistuje žádný aktuální výběr a je zodpovědností aplikace přidat položku do seznamu a nastavit ji jako aktuální, pokud je to vhodné.

Tato část popisuje následující témata:

Aktuální výběr

Aktuální výběr je položka seznamu, kterou uživatel vybral; vybraný text se zobrazí v poli výběru kombinovaného pole. Nicméně v případě jednoduchého kombinovaného pole nebo rozevíracího kombinovaného pole je aktuální výběr pouze jednou z možných forem uživatelského vstupu. Uživatel může také zadat text do pole výběru.

Aktuální výběr je identifikován indexem založeným na nule vybrané položky seznamu. Aplikace ji může kdykoli nastavit a načíst. Nadřazené okno nebo procedura zpracování dialogového okna obdrží oznámení, když uživatel změní aktuální výběr kombinovaného pole. Nadřazené okno nebo dialogové okno není upozorněno, když aplikace změní výběr.

Při vytvoření kombinovaného pole není vybrána žádná hodnota. To platí i pro jednoduché pole se seznamem nebo rozevírací seznam, pokud uživatel upravil obsah pole výběru. Pokud chcete nastavit aktuální výběr, aplikace odešle zprávu CB_SETCURSEL do kombinovaného políčka. Aplikace může také použít CB_SELECTSTRING zprávu k nastavení aktuálního výběru na položku seznamu, jejíž řetězec začíná zadaným řetězcem. Pro určení aktuálního výběru aplikace odešle zprávu CB_GETCURSEL do kombinovaného pole. Pokud neexistuje žádný aktuální výběr, vrátí tato zpráva CB_ERR.

Když uživatel změní aktuální výběr v kombinovaném poli, nadřazené okno nebo procedura dialogového okna obdrží zprávu WM_COMMAND s kódem oznámení CBN_SELCHANGE v nejvyšším řádu parametru wParam. Tento kód oznámení se neodesílá, pokud je aktuální výběr nastaven pomocí zprávy CB_SETCURSEL.

Rozevírací kombo box nebo rozevírací seznam odešle kód oznámení CBN_CLOSEUP do nadřazeného okna nebo dialogového okna, když se rozevírací seznam zavře. Pokud uživatel změnil aktuální výběr, kombinované pole také odešle oznamovací kód CBN_SELCHANGE při zavření rozevíracího seznamu. Pokud chcete provést konkrétní proces pokaždé, když uživatel vybere položku seznamu, můžete zpracovat událost CBN_SELCHANGE nebo CBN_CLOSEUP. Obvykle byste před zpracováním změny v aktuálním výběru čekali na kód oznámení CBN_CLOSEUP. To může být zvlášť důležité, pokud je vyžadováno značné množství zpracování.

Aplikace může také zpracovávat kódy oznámení CBN_SELENDOK a CBN_SELENDCANCEL. Systém odešle CBN_SELENDOK, když uživatel vybere položku seznamu nebo vybere položku a pak seznam zavře. To znamená, že uživatel dokončil a že má být výběr zpracován. CBN_SELENDCANCEL se odešle, když uživatel vybere položku, ale pak vybere jiný ovládací prvek, stiskne klávesu ESC, zatímco je otevřený rozevírací seznam, nebo zavře dialogové okno. To znamená, že výběr uživatele by se měl ignorovat. CBN_SELENDOK je odeslána před každou zprávou CBN_SELCHANGE.

V jednoduchém kombinačním poli systém odešle CBN_DBLCLK kód oznámení, když uživatel poklikne na položku seznamu. V rozevíracím poli nebo seznamu se jedním kliknutím skryje seznam, takže není možné provést dvojklik na položku.

Určitá oznámení a zprávy platí jenom pro kombinované pole s rozevíracími seznamy. Když je rozevírací seznam otevřený nebo uzavřený, nadřazené okno kombinovaného pole obdrží oznámení ve formě zprávy WM_COMMAND. Pokud se seznam otevírá, nejvyšší pořadí slov wParam je CBN_DROPDOWN. Pokud je seznam zavřený, je CBN_CLOSEUP.

Aplikace může otevřít seznam rozevíracího kombinovaného pole nebo rozbalovacího seznamového pole pomocí zprávy CB_SHOWDROPDOWN. Pomocí zprávy CB_GETDROPPEDSTATE může určit, jestli je seznam otevřený, a pomocí CB_GETDROPPEDCONTROLRECT zprávy může určit souřadnice rozevíracího seznamu. Aplikace může také zvětšit šířku rozevíracího seznamu pomocí zprávy CB_SETDROPPEDWIDTH.

Obsah seznamu

Když aplikace vytvoří kombinované pole, obvykle ho inicializuje přidáním jedné nebo více položek. Později může aplikace přidat nebo odstranit položky seznamu, znovu inicializovat seznam nebo z ní načíst informace o položce.

Aplikace přidává položky seznamu do pole se seznamem odesláním zprávy CB_ADDSTRING. Zadaná položka se přidá na konec seznamu nebo do seřazeného rozbalovacího seznamu ve správné seřazené pozici na základě textu položky. V neseřazeném kombinovaném poli může aplikace pomocí CB_INSERTSTRING zprávu vložit položku na konkrétní pozici. Po přidání se položka seznamu identifikuje podle jeho pozice.

Pomocí CB_FINDSTRING nebo CB_FINDSTRINGEXACT zprávy může aplikace určit pozici položky seznamu. CB_FINDSTRING najde položku, jejíž řetězec začíná zadaným řetězcem. CB_FINDSTRINGEXACT najde položku, jejíž řetězec přesně odpovídá řetězci. U žádné zprávy se nerozlišují malá a velká písmena.

Aplikace může položku seznamu odebrat pomocí zprávy CB_DELETESTRING. Pokud aplikace potřebuje znovu inicializovat seznam v rozbalovacím seznamu, může nejprve vymazat celý jeho obsah pomocí příkazu CB_RESETCONTENT. Při přidávání více položek do seznamu poté, co bylo již zobrazeno pole se seznamem, může aplikace zrušit příznak překreslení, aby se zabránilo opětovnému vykreslování pole se seznamem po přidání každé položky. Další informace o překreslení naleznete v popisu WM_SETREDRAW zprávy.

K načtení řetězce přidruženého k položce seznamu může aplikace použít zprávu CB_GETLBTEXT. Řetězec položky se zkopíruje do vyrovnávací paměti určené aplikací. Aby se zajistilo, že je vyrovnávací paměť dostatečně velká, aby přijala řetězec, může aplikace nejprve použít zprávu CB_GETLBTEXTLEN k určení délky řetězce. Pokud chcete získat počet položek seznamu v rozbalovacím poli, může aplikace použít zprávu CB_GETCOUNT.

Upravit pole výběru ovládacího prvku

Aplikace může načíst nebo nastavit obsah pole výběru a může určit nebo nastavit výběr úprav. Aplikace může také omezit množství textu, které uživatel může zadat do pole výběru. Když se obsah pole výběru změní, systém odešle zprávy s oznámením do nadřazeného okna nebo procedury dialogového okna.

Pokud chce aplikace načíst obsah pole výběru, může odeslat zprávu WM_GETTEXT do kombinačního pole. Pokud chcete nastavit obsah pole výběru jednoduchého nebo rozevíracího kombinovaného pole, může aplikace odeslat zprávu WM_SETTEXT do kombinovaného pole.

Úprava výběru je rozsah vybraného textu, pokud existuje, v poli výběru jednoduchého nebo rozevíracího kombinovaného seznamu. Aplikace může určit počáteční a koncovou pozici znaku aktuálního výběru pomocí zprávy CB_GETEDITSEL. Můžete také vybrat znaky v editačním výběru pomocí příkazu CB_SETEDITSEL.

Na začátku je velikost textu, který uživatel může zadat do pole výběru, omezena velikostí pole výběru. Pokud má pole se seznamem styl CBS_AUTOHSCROLL, může text pokračovat nad velikostí pole výběru. Aplikace může pomocí CB_LIMITTEXT zprávy omezit množství textu, které uživatel může zadat do pole výběru bez ohledu na to, jestli má ovládací prvek CBS_AUTOHSCROLL styl.

Když uživatel upraví obsah pole výběru, obdrží procedura nadřazeného okna nebo dialogového okna zprávy s oznámením. Nejprve se odešle kód oznámení CBN_EDITUPDATE označující, že text v poli výběru byl upraven. Po zobrazení upraveného textu systém odešle CBN_EDITCHANGE. Když se obsah pole výběru změní v důsledku vybrané položky seznamu, tyto zprávy se neodesílají.

Owner-Drawn kombinované pole

Aplikace může vytvořit vlastní kreslené rozbalovací pole, které převezme odpovědnost za vykreslení položek seznamu. Nadřazené okno kombinovaného pole vykreslovaného vlastníkem obdrží WM_DRAWITEM zprávy, když je potřeba nakreslit část kombinovaného pole. Kombinovaný box kreslený vlastníkem může obsahovat informace jiné než textové řetězce nebo kromě textových řetězců. Kombinované pole vykreslené vlastníkem mohou být libovolného typu. Ovládací prvek pro úpravy v jednoduchém nebo rozevíracím kombinačním rámečku může zobrazovat jenom text, zatímco vlastník vykresluje pole výběru v rozevíracím seznamovém rámečku.

Vlastník pole se seznamem nakreslený vlastníkem musí zpracovat zprávu WM_DRAWITEM. Tato zpráva se odešle vždy, když se musí překreslit část pole se seznamem. Vlastník může potřebovat zpracovat další zprávy v závislosti na stylech zadaných pro kombinované pole.

Aplikace může vytvořit kombinované pole s vlastním kreslením zadáním stylu CBS_OWNERDRAWFIXED nebo CBS_OWNERDRAWVARIABLE. Pokud mají všechny položky v kombinovaném poli stejnou výšku, jako jsou řetězce nebo ikony, může aplikace použít styl CBS_OWNERDRAWFIXED. Pokud mají položky seznamu různou výšku, například rastrové obrázky různých velikostí, může aplikace použít styl CBS_OWNERDRAWVARIABLE.

Vlastník vlastníkem kresleného rozevíracího seznamu může zpracovat zprávu WM_MEASUREITEM a určit rozměry položek v rozevíracím seznamu. Pokud aplikace vytvoří pole se seznamem pomocí stylu CBS_OWNERDRAWFIXED, systém odešle zprávu WM_MEASUREITEM pouze jednou. Dimenze určené vlastníkem se používají pro všechny položky seznamu. Pokud se použije styl CBS_OWNERDRAWVARIABLE, systém odešle zprávu WM_MEASUREITEM pro každou položku seznamu přidanou do kombinovaného pole. Vlastník může kdykoli určit nebo nastavit výšku položky seznamu pomocí CB_GETITEMHEIGHT a CB_SETITEMHEIGHT zpráv.

Aplikace může uchovávat text pro každou položku v uživatelsky definovaném rozevíracím seznamu tím, že specifikuje styl CBS_HASSTRINGS. Kombinované boxy se stylem CBS_SORT jsou řazeny na základě tohoto textu. Pokud je kombobox seřazený a nikoli ve stylu CBS_HASSTRINGS, musí vlastník zpracovat zprávu WM_COMPAREITEM.

V rozevíracím poli vykresleném vlastníkem musí vlastník mít přehled o položkách seznamu, které obsahují informace jiné než text nebo kromě textu. Jedním z pohodlných způsobů, jak to udělat, je uložit popisovač informací jako data položky. Pokud chce vlastník uvolnit datové objekty přidružené k položkám v kombinovaném poli, může zpracovat zprávu WM_DELETEITEM.

Speciální comboboxy

Podtřídění je procedura, která umožňuje aplikaci zachytit a zpracovat zprávy odeslané nebo poslané do okna. Pomocí podtřídy může aplikace nahradit určité zprávy vlastním zpracováním, zatímco většinu zpracování zpráv nechá na proceduře definované třídou v okně.

Když operační systém vytvoří okno, uloží informace o něm do interní datové struktury, která obsahuje ukazatel na proceduru okna. Chcete-li podtřídy okna, aplikace volá funkci SetClassLong, aby nahradila ukazatel na tuto proceduru ukazatelem na proceduru definovanou aplikací. Potom se všechny zprávy do okna odešlou do procedury subklasy. Tento postup pak použije funkci CallWindowProc k předání nezpracovaných zpráv do původní procedury okna. Popis zpracování zpráv prováděného okenní procedurou třídy COMBOBOX naleznete v tématu Výchozí chování pole se seznamem.

Pokud je rozbalovací seznam mimo dialogové okno, aplikace nemůže zpracovávat klávesy TAB, ENTER a ESC, pokud nepoužívá proceduru podtřídění. Když jednoduché pole se seznamem nebo rozevírací seznam obdrží vstupní fokus, okamžitě nastaví fokus na podřízený ovládací prvek pro úpravy. Aplikace proto musí odvozenou třídu ovládacího prvku pro úpravy použít k zachycení vstupu klávesnice pro jednoduché nebo rozevírací pole s kombinací. Příklad najdete v tématu Zapouzdření kombinovaného seznamu.

Pokud procedura podtřídy zpracuje zprávu WM_PAINT, musí pro přípravu malování použít funkci BeginPaint. Před voláním funkce EndPaint předává popisovač kontextu zařízení (DC) jako parametr wParam pro proceduru okna. Pokud se EndPaint nazývá jako první, procedura okna třídy nebude malovat, protože EndPaint ověří celé okno.

Technika související s podtříděním je nadtřídění. Supertřída se podobá jakékoli jiné třídě s tím rozdílem, že její procedura okna nevolá DefWindowProc pro zpracování nezpracovaných zpráv. Místo toho předává nezpracované zprávy do procedury okna nadřazené třídy okna. Postupujte podle pokynů v Okenních procedurách, abyste se vyhnuli problémům, které mohou nastat při subclassingu a superclassingu.