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.
Ovládací prvek seznam obsahuje jednoduchý seznam, ze kterého může uživatel obecně vybrat jednu nebo více položek. Seznamová pole poskytují omezenou flexibilitu v porovnání s ovládacími prvky Zobrazení seznamu.
Položky seznamu mohou být reprezentovány textovými řetězci, rastrovými obrázky nebo obojím. Pokud seznam není dostatečně velký, aby se zobrazily všechny položky seznamu najednou, seznam obsahuje posuvník. Uživatel prochází položky seznamu a podle potřeby použije nebo odebere stav výběru. Když vyberete položku seznamu, změní se její vzhled, obvykle změnou barvy textu a pozadí na ty, které jsou určené relevantními metrikami operačního systému. Když uživatel vybere nebo zruší výběr položky, systém odešle zprávu s oznámením do nadřazeného okna seznamu.
Pro aplikaci ANSI systém převede text v seznamovém poli na Unicode pomocí znakové stránky CP_ACP. To může způsobit problémy. Například zvýrazněné římské znaky v seznamu mimo Unicode v systému Windows, japonská verze bude zkomolená. Chcete-li tento problém vyřešit, zkompilujte aplikaci jako Unicode nebo použijte seznam nakreslený vlastníkem.
Tato část popisuje následující témata:
- Vytvoření seznamového pole
- Typy a styly seznamových polí
- funkce seznamového pole
- Oznámení ze seznamových boxů
- Zprávy do seznamových oken
- Výchozí zpracování zpráv oken
- Owner-Drawn Seznamové pole
- Seznamové boxy pro přetažení
Vytvoření seznamového pole
Nejjednodušší způsob, jak vytvořit seznam v dialogovém okně, je přetáhnout ho ze sady nástrojů v sadě Microsoft Visual Studio na prostředek dialogového okna. Chcete-li vytvořit seznam dynamicky nebo vytvořit seznam v jiném okně než dialogové okno, použijte funkci CreateWindowEx, zadejte třídu okna WC_LISTBOX a příslušné styly seznamu.
Typy a styly seznamového pole
Existují dva typy seznamů: jeden výběr (výchozí) a vícenásobný výběr. V seznamu s jedním výběrem může uživatel vybrat jenom jednu položku najednou. V seznamu s vícenásobným výběrem může uživatel vybrat více položek najednou. Chcete-li vytvořit seznam s vícenásobným výběrem, zadejte LBS_MULTIPLESEL nebo styl LBS_EXTENDEDSEL.
Vzhled a operace seznamu je řízena styly seznamu a styly oken. Tyto styly označují, jestli je seznam seřazený, uspořádaný do více sloupců, nakreslený aplikací atd. Dimenze a styly seznamu jsou obvykle definovány v šabloně dialogového okna, která je součástí prostředků aplikace.
Poznámka
Chcete-li použít vizuální styly s těmito ovládacími prvky, musí aplikace obsahovat manifest a musí volat InitCommonControls na začátku programu. Informace o vizuálních stylech najdete v tématu vizuální styly. Informace o manifestech najdete v tématu Povolení vizuálních stylů.
Funkce seznamového pole
Funkce DlgDirList nahradí obsah seznamu názvy jednotek, adresářů a souborů, které odpovídají zadané sadě kritérií. Funkce DlgDirSelectEx načte aktuální výběr v seznamovém poli, které je inicializováno funkcí DlgDirList. Tyto funkce umožňují uživateli vybrat jednotku, adresář nebo soubor ze seznamu bez zadání umístění a názvu souboru.
Funkce GetListBoxInfo vrátí počet položek na sloupec v zadaném seznamu.
Oznamovací zprávy ze seznamových oken
Když v seznamovém okně dojde k události, seznam odešle kód oznámení ve formě zprávy WM_COMMAND proceduře dialogového okna vlastnického okna. Kódy oznámení seznamu se posílají, když uživatel vybere, poklikne nebo zruší položku seznamu; když seznam přijme nebo ztratí fokus klávesnice; a pokud systém nemůže přidělit dostatek paměti pro požadavek seznamu. Zpráva WM_COMMAND obsahuje identifikátor seznamu ve slově s nízkým pořadím parametru wParam a kód oznámení ve slově s vysokým pořadím. Parametr lParam obsahuje popisovač ovládacího okna.
Procedura dialogového okna není nutná ke zpracování těchto zpráv; výchozí procedura okna je zpracuje.
Aplikace by měla monitorovat a zpracovávat následující kódy oznámení seznamového pole.
| Kód oznámení | Popis |
|---|---|
| LBN_DBLCLK | Uživatel pokliká na položku v seznamu. |
| LBN_ERRSPACE | Seznamové pole nemůže přidělit dostatek paměti pro splnění požadavku. |
| LBN_KILLFOCUS | Seznamová pole ztratí zaměření klávesnice. |
| LBN_SELCANCEL | Uživatel zruší výběr položky v seznamu. |
| LBN_SELCHANGE | Výběr v seznamu se má změnit. |
| LBN_SETFOCUS | Seznamové pole získá zaměření klávesnice. |
Zprávy do seznamů
Procedura dialogového okna může odesílat zprávy do seznamu a přidávat, odstraňovat, zkoumat a měnit položky seznamu. Například procedura dialogového okna může odeslat LB_ADDSTRING zprávu do seznamu pro přidání položky a LB_GETSEL zprávu k určení, zda je položka vybrána. Ostatní zprávy nastavují a načítají informace o velikosti, vzhledu a chování seznamového panelu. Například zpráva LB_SETHORIZONTALEXTENT nastaví posuvnou šířku seznamu. Procedura dialogového okna může odeslat libovolnou zprávu do seznamu pomocí funkce SendMessage nebo SendDlgItemMessage funkce.
Položka seznamu se často odkazuje na její index, celé číslo, které představuje pozici položky v seznamu. Index první položky v seznamu je 0, index druhé položky je 1 atd.
Následující tabulka popisuje, jak předdefinovaná procedura seznamu reaguje na zprávy seznamu.
| Zpráva | Odpověď |
|---|---|
| LB_ADDFILE | Vloží soubor do seznamu adresářů vyplněného funkcí DlgDirList a načte index seznamu vložené položky. |
| LB_ADDSTRING | Přidá řetězec do seznamového pole a vrátí jeho index. |
| LB_DELETESTRING | Odebere řetězec z seznamového pole a vrátí počet řetězců, které v něm zůstanou. |
| LB_DIR | Přidá seznam názvů souborů do seznamu a vrátí index posledního přidaného názvu souboru. |
| LB_FINDSTRING | Vrátí index prvního řetězce v seznamu, který začíná zadaným řetězcem. |
| LB_FINDSTRINGEXACT | Vrátí index řetězce v seznamu, který se rovná zadanému řetězci. |
| LB_GETANCHORINDEX | Vrátí index položky, kterou naposledy vybrala myš. |
| LB_GETCARETINDEX | Vrátí index položky, která má obdélník fokusu. |
| LB_GETCOUNT | Vrátí počet položek v seznamu. |
| LB_GETCURSEL | Vrátí index aktuálně vybrané položky. |
| LB_GETHORIZONTALEXTENT | Vrátí posuvnou šířku seznamu v pixelech. |
| LB_GETITEMDATA | Vrátí hodnotu přidruženou k zadané položce. |
| LB_GETITEMHEIGHT | Vrátí výšku položky v pixelech v seznamovém poli. |
| LB_GETITEMRECT | Načte klientské souřadnice zadané položky seznamu. |
| LB_GETLOCALE | Načte jazykové nastavení seznamového pole. Slovo s vysokým pořadím obsahuje kód země/oblasti a slovo s nízkým pořadím obsahuje identifikátor jazyka. |
| LB_GETSEL | Vrátí stav výběru položky seznamu. |
| LB_GETSELCOUNT | Vrátí počet vybraných položek v seznamu s vícenásobným výběrem. |
| LB_GETSELITEMS | Vytvoří pole indexů všech vybraných položek v seznamu s vícenásobným výběrem a vrátí celkový počet vybraných položek. |
| LB_GETTEXT | Načte řetězec přidružený k zadané položce a délku řetězce. |
| LB_GETTEXTLEN | Vrátí délku v počtu znaků řetězce přidruženého k zadané položce. |
| LB_GETTOPINDEX | Vrátí index první viditelné položky v seznamu. |
| LB_INITSTORAGE | Přidělí paměť pro zadaný počet položek a jejich přidružené řetězce. |
| LB_INSERTSTRING | Vloží řetězec na zadaný index v seznamu. |
| LB_ITEMFROMPOINT | Získá index začínající nulou pro položku, která je nejblíže zadanému bodu v seznamu. |
| LB_RESETCONTENT | Odebere všechny položky ze seznamu. |
| LB_SELECTSTRING | Vybere první nalezený řetězec, který odpovídá zadané předponě. |
| LB_SELITEMRANGE | Vybere zadanou oblast položek v seznamovém poli. |
| LB_SELITEMRANGEEX | Vybere zadanou oblast položek, pokud je index první položky v oblasti menší než index poslední položky v oblasti. Zruší výběr v oblasti, pokud je index první položky větší než poslední. |
| LB_SETANCHORINDEX | Nastaví položku, kterou naposledy vybrala myš na zadanou položku. |
| LB_SETCARETINDEX | Nastaví obdélník fokusu na zadanou položku seznamu. |
| LB_SETCOLUMNWIDTH | Nastaví šířku všech sloupců v seznamu v pixelech. |
| LB_SETCOUNT | Nastaví počet položek v seznamu. |
| LB_SETCURSEL | Vybere zadanou položku seznamu. |
| LB_SETHORIZONTALEXTENT | Nastaví posuvnou šířku seznamového okna v pixelech. |
| LB_SETITEMDATA | Přidruží hodnotu k položce seznamu. |
| LB_SETITEMHEIGHT | Nastaví výšku položky nebo položek v pixelech v seznamu. |
| LB_SETLOCALE | Nastaví národní prostředí seznamu a vrátí předchozí identifikátor národního prostředí. |
| LB_SETSEL | Vybere položku v seznamu s vícenásobným výběrem. |
| LB_SETTABSTOPS | Nastaví zarážky tabulátoru podle specifikovaného pole. |
| LB_SETTOPINDEX | Posune seznam tak, aby zadaná položka byla v horní části viditelné oblasti. |
Výchozí zpracování zpráv okna
Procedura okna pro předdefinovanou třídu okna seznamového pole provádí výchozí zpracování všech zpráv, které seznamové pole nezpracovává. Když procedura seznamu vrátí FALSE pro zprávu, předdefinovaná procedura okna zkontroluje zprávu a provede výchozí akce, jak je znázorněno v následující tabulce.
| Zpráva | Výchozí akce |
|---|---|
| WM_CHAR | Přesune výběr na první položku, která začíná znakem, který uživatel zadal. Pokud seznam obsahuje styl LBS_OWNERDRAW, nedojde k žádné akci. Několik znaků zadaných během krátkého intervalu se považuje za skupinu a první položka, která začíná řadou znaků, je vybrána. |
| WM_CREATE | Vytvoří prázdné seznamové pole. |
| WM_DESTROY | Zničí seznam a uvolní všechny prostředky, které používá. |
| Předá zprávu proceduře dialogového okna nebo procesu nadřazeného okna. | |
| WM_ENABLE | Pokud je ovládací prvek viditelný, zruší platnost obdélníku, aby mohly být řetězce malovány šedě. |
| WM_ERASEBKGND | Vymaže pozadí z pole se seznamem. Pokud má seznam styl LBS_OWNERDRAW, pozadí se nesmazáno. |
| WM_GETDLGCODE | Vrátí DLGC_WANTARROWS | DLGC_WANTCHARS, což označuje, že výchozí procedura seznamového pole zpracovává klávesy se šipkami a zprávy WM_CHAR. |
| WM_GETFONT | Vrátí popisovač aktuálního písma pro seznamové pole. |
| WM_HSCROLL | Posune seznam vodorovně. |
| WM_KEYDOWN | Zpracovává virtuální klíče pro posouvání. Virtuální klíč je index položky, na kterou chcete přesunout kurzor. Výběr se nezmění. |
| WM_KILLFOCUS | Vypne kurzor a zničí ho. Odešle kód oznámení LBN_KILLFOCUS vlastníkovi seznamu. |
| WM_LBUTTONDBLCLK | Sleduje myš v oblasti seznamového rámečku. To uživateli umožní zrušit výběr, pokud je tlačítko myši uvolněno mimo oblast klienta seznamu. |
| WM_LBUTTONDOWN | Sleduje myš v klientské oblasti seznamového pole. To uživateli umožní zrušit výběr, pokud je tlačítko myši uvolněno mimo oblast klienta seznamu. |
| WM_LBUTTONUP | Sleduje myš v klientské oblasti seznamu. To uživateli umožní zrušit výběr, pokud je tlačítko myši uvolněno mimo oblast klienta seznamu. |
| WM_MOUSEMOVE | Sleduje myš v oblasti klientského seznamového pole. To uživateli umožní zrušit výběr, pokud je tlačítko myši uvolněno mimo oblast klienta seznamu. |
| WM_PAINT | Provede operaci malování podtřídy pomocí popisovače seznamu kontextu zařízení (DC). |
| WM_SETFOCUS | Zapne kurzor a odešle kód oznámení LBN_SETFOCUS vlastníkovi seznamu. |
| WM_SETFONT | Nastaví nové písmo pro seznam. |
| WM_SETREDRAW | Nastaví nebo vymaže příznak překreslení na základě hodnoty wParam. |
| WM_SIZE | Změní velikost seznamu na celočíselný počet položek. |
| WM_VSCROLL | Posune seznam svisle. |
Předdefinovaná procedura seznamu předá všechny ostatní zprávy DefWindowProc pro výchozí zpracování.
Owner-Drawn pole seznamu
Aplikace může vytvořit seznamové pole vykreslované vlastníkem, aby převzala odpovědnost za vykreslování položek seznamu. Nadřazené okno nebo dialogové okno s vlastníkem vykresleným seznamem (jeho vlastníkem) obdrží WM_DRAWITEM zprávy, když je potřeba vykreslit část seznamu. Seznam vytvořený vlastníkem může zobrazovat nejen textové řetězce, ale i další informace.
Vlastník seznamového rámečku vykreslovaného vlastníkem musí zpracovat zprávu WM_DRAWITEM. Tato zpráva se odešle vždy, když je nutné překreslit část seznamu. Vlastník může potřebovat zpracovat další zprávy v závislosti na stylech zadaných pro seznam.
Aplikace může vytvořit vlastnoručně vykreslené seznamové pole zadáním stylu LBS_OWNERDRAWFIXED nebo LBS_OWNERDRAWVARIABLE. Pokud mají všechny položky seznamu v seznamu stejnou výšku, jako jsou řetězce nebo ikony, může aplikace použít styl LBS_OWNERDRAWFIXED. Pokud mají položky seznamu různou výšku (například rastrové obrázky jiné velikosti), může aplikace použít LBS_OWNERDRAWVARIABLE styl.
Vlastník vlastníkem vykresleného seznamu může zpracovat zprávu WM_MEASUREITEM ke stanovení rozměrů položek seznamu. Pokud aplikace vytvoří seznam pomocí stylu LBS_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 LBS_OWNERDRAWVARIABLE, systém odešle WM_MEASUREITEM zprávu pro každou položku, která je přidána do pole seznamu. Vlastník může kdykoli určit nebo nastavit výšku položky seznamu pomocí LB_GETITEMHEIGHT a LB_SETITEMHEIGHT zpráv.
Pokud informace zobrazené v seznamu s vlastní kresbou obsahují text, aplikace může sledovat text pro každou položku seznamu pomocí zadání stylu LBS_HASSTRINGS. Seznamová pole se stylem LBS_SORT se seřadí na základě tohoto textu. Pokud je seznamové pole seřazené, ale není ve stylu LBS_HASSTRINGS, musí vlastník zpracovat zprávu WM_COMPAREITEM.
V seznamu nakresleném vlastníkem musí vlastník sledovat položky seznamu, které obsahují jiné informace než nebo kromě textu. Jedním z pohodlných způsobů, jak to udělat, je uložit identifikátor k informaci jako data položky pomocí zprávy LB_SETITEMDATA. Pokud chcete uvolnit datové objekty přidružené k položkám v seznamu, může vlastník zpracovat WM_DELETEITEM zprávu.
Příklad seznamu nakresleného vlastníkem naleznete v tématu Jak vytvořit seznam Owner-Drawn.
Přetažení polí seznamu
Seznam s možností přetažení je speciální typ seznamu, který umožňuje uživateli přetahovat položky z jedné pozice na druhou. Aplikace může pomocí seznamu pro přetahování zobrazit řetězce v určité sekvenci a umožnit uživateli změnit sekvenci přetažením položek na požadovanou pozici.
Vytváření přetahovacích seznamových boxů
Seznamy s možností přetahování mají stejné styly oken a zpracovávají stejné zprávy jako standardní seznamy. Chcete-li vytvořit seznam pro tažení, nejprve vytvoříte standardní seznam a potom zavolejte funkci MakeDragList. Chcete-li převést seznamový rámeček v dialogovém okně na seznam s možností přetažení, můžete volat MakeDragList při zpracování zprávy WM_INITDIALOG.
Přetáhněte zprávy seznamu
Seznamový rámeček pro přetahování informuje nadřazené okno o událostech přetažení tím, že odesílá zprávu seznamu pro přetahování. Nadřazené okno musí zpracovat zprávu o přetažení seznamu.
Při volání funkce MakeDragList je tato zpráva zaregistrována v poli se seznamem pro přetahování. Pro načtení identifikátoru (číselné hodnoty) zprávy seznamu přetažení, zavolejte funkci RegisterWindowMessage a zadejte hodnotu DRAGLISTMSGSTRING.
Parametr wParam zprávy seznamu přetažení je identifikátor ovládacího prvku pro pole seznamu přetažení. Parametr lParam je adresa struktury DRAGLISTINFO, která obsahuje kód oznámení pro událost přetažení a další informace. Návratová hodnota zprávy závisí na oznámení.
Přetáhněte kódy oznámení seznamu
Kód oznámení seznamu přetažení je identifikován členem uNotification ve struktuře DRAGLISTINFO, která je dodávána spolu se zprávou seznamu přetažení. Tento kód může být DL_BEGINDRAG, DL_DRAGGING, DL_CANCELDRAGnebo DL_DROPPED.
Kód oznámení DL_BEGINDRAG se odešle, když je kurzor na položce seznamu a uživatel klikne na levé tlačítko myši. Nadřazené okno může vrátit TRUE pro zahájení operace přetahování nebo FALSE pro nepovolení přetahování. Nadřazené okno tak může povolit přetahování některých položek seznamu a zakázat ho pro jiné. Položku seznamu můžete určit v zadaném umístění pomocí funkce LBItemFromPt.
Pokud je přetažení aktivní, DL_DRAGGING kód oznámení se odešle pokaždé, kdy se pohne myší, nebo v pravidelných intervalech, když se myš nehýbe. Nadřazené okno by mělo nejprve určit položku seznamu pod kurzorem pomocí LBItemFromPt a pak nakreslit ikonu vložení pomocí funkce DrawInsert. Zadáním TRUE pro bAutoScroll parametr LBItemFromPtmůžete způsobit, že se seznamový box posune o jeden řádek, pokud je kurzor nad nebo pod jeho klientskou oblastí. Hodnota, kterou vrátíte pro toto oznámení, určuje typ kurzoru myši, který by měl být nastaven v přetahovacím seznamu.
Kód oznámení DL_CANCELDRAG se odešle, pokud uživatel zruší operaci přetažení kliknutím na pravé tlačítko myši nebo stisknutím klávesy ESC. Kód oznámení DL_DROPPED se odešle, pokud uživatel dokončí operaci přetažení uvolněním levého tlačítka myši, i když kurzor není nad položkou seznamu. Seznam přetažení uvolní zachytávání myši před odesláním jednoho ze dvou oznámení. Návratová hodnota těchto dvou oznámení se ignoruje. Přetažení seznamu