Megosztás a következőn keresztül:


Tudnivalók a kombinált listákról

A kombinált lista egy szerkesztőmezőt vagy statikus szöveget és egy listát kombinál.

Ez a témakör a következő szakaszokat tartalmazza.

Kombinált lista típusok és stílusok

A kombinált mező egy listából és egy választási mezőből áll. A lista megjeleníti azokat a beállításokat, amelyeket a felhasználó kiválaszthat, és a kijelölési mező megjeleníti az aktuális kijelölést. Ha a kijelölési mező szerkesztési vezérlő, a felhasználó megadhat olyan adatokat, amely nem érhető el a listában; ellenkező esetben a felhasználó csak a listában szereplő elemeket választhatja ki.

A közös vezérlőtár a kombinált lista három fő stílusát tartalmazza, ahogyan az az alábbi táblázatban is látható.

Kombinált lista típusa Stílusállandó Leírás
Egyszerű CBS_SIMPLE Mindig megjeleníti a listát, és megjeleníti a kijelölt elemet egy szerkesztési vezérlőben.
Legördülő lista CBS_DROPDOWN Megjeleníti a listát, amikor az ikonra kattint, és megjeleníti a kijelölt elemet egy szerkesztési vezérlőben.
Legördülő lista (legördülő lista) CBS_DROPDOWNLIST Megjeleníti a listát, amikor az ikonra kattint, és megjeleníti a kijelölt elemet egy statikus vezérlőben.

 

Az alábbi képernyőképek mindegyike a háromféle kombinált listát jeleníti meg, ahogyan azok megjelenhetnek a Windows Vista rendszerben. Az első képernyőképen a felhasználó kiválasztott egy elemet az egyszerű kombinált listában. A felhasználó új értéket is beírhat a vezérlő szerkesztési mezőjébe. A lista a Microsoft Visual Studio erőforrás-szerkesztőjében lett méretezve, és csak elég nagy ahhoz, hogy két elemet befogadjon.

képernyőfelvétel egy egyszerű kombinált listában kiválasztott elemet mutat

A második képernyőképen a felhasználó új szöveget írt be a legördülő lista szerkesztési vezérlőjében. A felhasználó egy meglévő elemet is kijelölhetett volna. A listamező úgy bővül ki, hogy a lehető legtöbb elemet elférjen.

képernyőfelvételen egy legördülő listába beírt szöveg látható,

A harmadik képernyőképen a felhasználó megnyitotta a legördülő kombinált mezőt. A listamező úgy bővül ki, hogy a lehető legtöbb elemet elférjen. A felhasználó nem tud új szöveget megadni.

képernyőkép, amelyen egy kombinált listában kijelölt elem látható,

Számos kombinált listastílus is létezik, amelyek meghatározott tulajdonságokat határoznak meg. A kombinált listastílusok a kombinált lista adott tulajdonságait határozzák meg. Stílusokat egyesíthet; egyes stílusok azonban csak bizonyos kombinált listatípusokra vonatkoznak. A kombinált listastílusokat tartalmazó táblázatot Kombinált listastílusokcímű témakörben talál.

Jegyzet

Ha kombinált listákkal szeretne vizuális stílusokat használni, az alkalmazásnak tartalmaznia kell egy jegyzékfájlt, és meg kell hívnia InitCommonControls a program elején. A vizuális stílusokról további információt Vizuális stílusokcímű témakörben talál. A jegyzékadatokkal kapcsolatban további információkat a Vizuális stílusok engedélyezésecímű témakörben talál.

 

Kombinált lista

A lista a kombinált lista azon része, amely megjeleníti a felhasználó által kijelölhető elemeket. Az alkalmazás általában inicializálja a lista tartalmát, amikor létrehoz egy kombinált listát. A felhasználó által kijelölt listaelem az aktuális kijelölési. Több elem nem jelölhető ki. Az egyszerű és legördülő kombinált listákban a felhasználó a listaelem kijelölése helyett beírhatja a kijelölési mezőt. Ezekben az esetekben nincs aktuális kijelölés, és az alkalmazás feladata, hogy hozzáadja az elemet a listához, és az aktuális kijelöléssé tegye, ha szükséges.

Ez a szakasz a következő témaköröket ismerteti:

Aktuális kijelölés

Az aktuális kijelölés egy listaelem, amelyet a felhasználó kijelölt; a kijelölt szöveg megjelenik a kombinált lista kijelölési mezőjében. Egy egyszerű kombinált lista vagy legördülő lista esetében azonban az aktuális kijelölés csak egy lehetséges felhasználói beviteli forma a kombinált listában. A felhasználó szöveget is beírhat a kijelölési mezőbe.

Az aktuális kijelölést a kijelölt listaelem nullaalapú indexe azonosítja. Egy alkalmazás bármikor beállíthatja és lekérheti. A szülőablak vagy párbeszédpanel eljárása értesítést kap, ha a felhasználó módosítja a kombinált lista aktuális kijelölését. A szülőablak vagy párbeszédpanel nem értesítést kap, ha az alkalmazás módosítja a kijelölést.

Kombinált lista létrehozásakor nincs aktuális kijelölés. Ez egy egyszerű vagy legördülő kombinált lista esetében is igaz, ha a felhasználó szerkesztette a kijelölési mező tartalmát. Az aktuális kijelölés beállításához egy alkalmazás elküldi a CB_SETCURSEL üzenetet a kombinált listába. Az alkalmazás a CB_SELECTSTRING üzenettel is beállíthatja az aktuális kijelölést egy olyan listaelemre, amelynek sztringje egy megadott sztringgel kezdődik. Az aktuális kijelölés meghatározásához egy alkalmazás elküldi a CB_GETCURSEL üzenetet a kombinált mezőre. Ha nincs aktuális kijelölés, ez az üzenet CB_ERR ad vissza.

Amikor a felhasználó módosítja az aktuális kijelölést egy kombinált listában, a szülőablak vagy a párbeszédpanel eljárása egy WM_COMMAND üzenetet kap a CBN_SELCHANGE értesítési kóddal a wParam paraméter magasrendű szójában. Ez az értesítési kód nem lesz elküldve, ha az aktuális kijelölés az CB_SETCURSEL üzenettel van beállítva.

A legördülő kombinált mező vagy legördülő lista a legördülő lista bezárásakor elküldi a CBN_CLOSEUP értesítési kódot a szülőablaknak vagy a párbeszédpanel eljárásának. Ha a felhasználó módosította az aktuális kijelölést, a kombinált lista a legördülő lista bezárásakor is elküldi a CBN_SELCHANGE értesítési kódot. Ha egy adott folyamatot szeretne végrehajtani minden alkalommal, amikor a felhasználó kiválaszt egy listaelemet, kezelheti a CBN_SELCHANGE vagy CBN_CLOSEUP értesítési kódot. Általában várnia kell a CBN_CLOSEUP értesítési kódra, mielőtt feldolgozná az aktuális kijelölés módosítását. Ez különösen akkor lehet fontos, ha jelentős mennyiségű feldolgozásra van szükség.

Az alkalmazások az CBN_SELENDOK és CBN_SELENDCANCEL értesítési kódokat is feldolgozhatják. A rendszer CBN_SELENDOK küld, amikor a felhasználó kiválaszt egy listaelemet, vagy kijelöl egy elemet, majd bezárja a listát. Ez azt jelzi, hogy a felhasználó befejezte a műveletet, és a kijelölést fel kell dolgozni. CBN_SELENDCANCEL akkor küldi el a rendszer, ha a felhasználó kijelöl egy elemet, de egy másik vezérlőt jelöl ki, lenyomja az ESC billentyűt, amíg a legördülő lista meg van nyitva, vagy bezárja a párbeszédpanelt. Ez azt jelzi, hogy a felhasználó kijelölését figyelmen kívül kell hagyni. CBN_SELENDOK minden CBN_SELCHANGE üzenet előtt el lesz küldve.

Egy egyszerű kombinált listában a rendszer elküldi a CBN_DBLCLK értesítési kódot, amikor a felhasználó duplán kattint egy listaelemre. Egy legördülő listában vagy kombinált listában egyetlen kattintással elrejthető a lista, így nem lehet duplán kattintani egy elemre.

Bizonyos értesítések és üzenetek csak a legördülő listákat tartalmazó kombinált listákra vonatkoznak. Ha egy legördülő lista meg van nyitva vagy bezárva, a kombinált lista szülőablaka értesítést kap WM_COMMAND üzenet formájában. Ha a lista meg van nyitva, a wParam magasrendű szava CBN_DROPDOWN. Ha a lista lezárás alatt van, az CBN_CLOSEUP.

Az alkalmazás megnyithatja egy legördülő kombinált lista vagy legördülő lista elemeit a CB_SHOWDROPDOWN üzenet használatával. Meg tudja állapítani, hogy a lista meg van-e nyitva a CB_GETDROPPEDSTATE üzenet használatával, és a CB_GETDROPPEDCONTROLRECT üzenet használatával meghatározhatja a legördülő lista koordinátáit. Az alkalmazás a CB_SETDROPPEDWIDTH üzenet használatával is növelheti a legördülő lista szélességét.

Lista tartalma

Amikor egy alkalmazás létrehoz egy kombinált listát, általában inicializálja a kombinált listát úgy, hogy hozzáad egy vagy több elemet a listához. Később egy alkalmazás hozzáadhat vagy törölhet listaelemeket, újraincializálhatja a listát, vagy lekérheti belőle az elemadatokat.

Egy alkalmazás listaelemeket ad hozzá egy kombinált mezőhöz a CB_ADDSTRING üzenet elküldésével. A megadott elem hozzá lesz adva a lista végéhez, vagy egy rendezett kombinált listában az elem sztringje alapján a megfelelő rendezési helyre. Egy rendezetlen kombinált listában az alkalmazás a CB_INSERTSTRING üzenettel szúrhat be egy elemet egy adott pozícióba. A hozzáadás után a listaelem a pozíciója alapján lesz azonosítva.

A CB_FINDSTRING vagy CB_FINDSTRINGEXACT üzenet használatával az alkalmazás meghatározhatja egy listaelem pozícióját. CB_FINDSTRING megkeres egy elemet, amelynek sztringje a megadott sztringgel kezdődik. CB_FINDSTRINGEXACT megkeres egy elemet, amelynek sztringje pontosan megegyezik a keresett sztringgel. Egyik üzenet sem érzékeny a kis- és nagybetűkre.

Az alkalmazások a CB_DELETESTRING üzenet használatával eltávolíthatnak egy listaelemet. Ha egy alkalmazásnak újra kell létrehoznia a kombinált listalistát, először törölheti a teljes tartalmát a CB_RESETCONTENT üzenet használatával. Ha több elemet ad hozzá a listához, miután már megjelenik egy kombinált lista, az alkalmazás törölheti az újrafelfedés jelzőt, hogy megakadályozza a kombinált lista újrafestését az egyes elemek hozzáadása után. Az újraírással kapcsolatos további információkért tekintse meg a WM_SETREDRAW üzenet leírását.

A listaelemhez társított sztring lekéréséhez az alkalmazás használhatja a CB_GETLBTEXT üzenetet. Az elem sztringje az alkalmazás által megadott pufferbe lesz másolva. Annak érdekében, hogy a puffer elég nagy legyen a sztring fogadásához, az alkalmazás először használhatja a CB_GETLBTEXTLEN üzenetet a sztring hosszának meghatározásához. A listaelemek számának a kombinált listában való lekéréséhez az alkalmazás használhatja a CB_GETCOUNT üzenetet.

Vezérlőkijelölési mezők szerkesztése

Egy alkalmazás lekérheti vagy beállíthatja a kijelölési mező tartalmát, és meghatározhatja vagy beállíthatja a szerkesztési kijelölést. Az alkalmazás korlátozhatja a felhasználó által beírható szöveg mennyiségét is a kijelölési mezőben. Amikor a kijelölési mező tartalma megváltozik, a rendszer értesítési üzeneteket küld a szülőablakba vagy párbeszédpanel-eljárásba.

A kijelölési mező tartalmának lekéréséhez az alkalmazás elküldheti a WM_GETTEXT üzenetet a kombinált listába. Egy egyszerű vagy legördülő lista kijelölési mezőjének tartalmának beállításához az alkalmazás elküldheti a WM_SETTEXT üzenetet a kombinált listába.

A kijelölt szerkesztési tartomány az a szövegrész, amely, ha van ilyen, az egyszerű vagy legördülő kombinált lista kiválasztási mezőjében található. Az alkalmazás a CB_GETEDITSEL üzenet használatával meghatározhatja az aktuális kijelölés kezdő és befejező karakterpozícióit. A szerkesztési kijelölésben szereplő karaktereket a CB_SETEDITSEL üzenet használatával is kijelölheti.

Kezdetben a felhasználó által a kijelölési mezőbe beírható szöveg mennyiségét a kijelölési mező mérete korlátozza. Ha azonban a kombinált lista CBS_AUTOHSCROLL stílussal rendelkezik, a szöveg a kijelölési mező méretén túl is folytatódhat. Az alkalmazások a CB_LIMITTEXT üzenet használatával korlátozhatják a felhasználó által beírható szöveg mennyiségét a kijelölési mezőbe, függetlenül attól, hogy a vezérlő CBS_AUTOHSCROLL stílussal rendelkezik-e.

Amikor a felhasználó szerkessze a kijelölési mező tartalmát, a szülőablak vagy párbeszédpanel eljárása értesítési üzeneteket kap. Először a CBN_EDITUPDATE értesítési kódot küldi el, amely azt jelzi, hogy a kijelölési mező szövegét szerkesztették. A módosított szöveg megjelenítése után a rendszer CBN_EDITCHANGEküld. Ha a kijelölési mező tartalma egy kijelölt listaelem eredményeként megváltozik, a rendszer nem küldi el ezeket az üzeneteket.

Owner-Drawn kombinált lista

Az alkalmazás létrehozhat egy felhasználó által rajzolt kombinációs dobozt a listaelemek festéséért való felelősség átvállalására. A tulajdonos által rajzolt kombinált lista szülőablaka (tulajdonosa) WM_DRAWITEM üzeneteket kap, amikor a kombinált lista egy részét meg kell festeni. A tulajdonos által rajzolt kombinált lista a szöveges sztringeken kívül más adatokat is felsorolhat. A tulajdonos által rajzolt kombinált listák bármilyen típusúak lehetnek. Az egyszerű vagy legördülő kombinált mező szerkesztő területe azonban csak szöveget tud megjeleníteni, míg a tulajdonos rajzolja meg a kijelölési területet a legördülő listában.

A tulajdonos által rajzolt kombinált lista tulajdonosának feldolgoznia kell a WM_DRAWITEM üzenetet. Ezt az üzenetet akkor küldi el a rendszer, ha a kombinált doboz egy részét újra kell rajzolni. Előfordulhat, hogy a tulajdonosnak más üzeneteket kell feldolgoznia a kombinált lista stílusától függően.

Az alkalmazások a CBS_OWNERDRAWFIXED vagy CBS_OWNERDRAWVARIABLE stílus megadásával hozhatnak létre tulajdonos által rajzolt kombinált listát. Ha a kombinált lista összes listaeleme azonos magasságú, például sztringek vagy ikonok, az alkalmazás használhatja a CBS_OWNERDRAWFIXED stílust. Ha a listaelemek különböző magasságúak, például különböző méretű bitképek, az alkalmazások használhatják a CBS_OWNERDRAWVARIABLE stílust.

A tulajdonos által rajzolt kombinált lista tulajdonosa feldolgozhat egy WM_MEASUREITEM üzenetet a listaelemek dimenzióinak megadásához a kombinált listában. Ha az alkalmazás a CBS_OWNERDRAWFIXED stílussal hozza létre a kombinált listát, a rendszer csak egyszer küldi el a WM_MEASUREITEM üzenetet. A tulajdonos által megadott dimenziók az összes listaelemhez használhatók. Ha a CBS_OWNERDRAWVARIABLE stílust használja, a rendszer minden, a kombinált dobozhoz hozzáadott listaelemhez küld egy WM_MEASUREITEM üzenetet. A tulajdonos bármikor meghatározhatja vagy beállíthatja egy listaelem magasságát a CB_GETITEMHEIGHT és CB_SETITEMHEIGHT üzenetek használatával.

Ha a tulajdonos által rajzolt kombinált lista adatai szöveget tartalmaznak, az alkalmazások a CBS_HASSTRINGS stílus megadásával nyomon követhetik az egyes listaelemek szövegét. A CBS_SORT stílusú kombinált listák a szöveg alapján vannak rendezve. Ha a kombinált lista rendezett, és nem a CBS_HASSTRINGS stílusú, a tulajdonosnak fel kell dolgoznia a WM_COMPAREITEM üzenetet.

A tulajdonos által rajzolt kombinált listákban a tulajdonosnak nyomon kell követnie a szövegen kívüli vagy azon kívüli információkat tartalmazó listaelemeket. Ennek egyik kényelmes módja, ha az azonosítót elem adataként menti. A kombinált lista elemeihez társított adatobjektumok felszabadításához a tulajdonos feldolgozhatja a WM_DELETEITEM üzenetet.

Alosztályozott kombinált listák

Az alosztályozás olyan eljárás, amellyel az alkalmazás elfoghatja és feldolgozhatja az ablakba küldött vagy közzétett üzeneteket. Az alosztályozással az alkalmazás helyettesítheti a saját feldolgozását bizonyos üzenetekre, miközben a legtöbb üzenetfeldolgozást az osztály által meghatározott ablakos eljárásra hagyja.

Amikor az operációs rendszer létrehoz egy ablakot, az adatokat egy belső adatstruktúrába menti, amely az ablak eljárására mutató mutatót tartalmaz. Egy ablak alosztályához az alkalmazás meghívja a SetClassLong függvényt, hogy az adott eljárásra mutató mutatót egy alkalmazás által meghatározott alosztály-eljárásra cserélje. Ezután a rendszer az ablakba érkező összes üzenetet elküldi az alosztály-eljárásnak. Ez az eljárás ezután a CallWindowProc függvénnyel továbbítja a feldolgozatlan üzeneteket az eredeti ablak eljárásának. A COMBOBOX osztályablak eljárása által végrehajtott üzenetfeldolgozás leírását Alapértelmezett kombinált lista viselkedésecímű témakörben talál.

Ha a kombinált lista egy párbeszédpanelen kívül esik, az alkalmazás nem tudja feldolgozni a TAB, az ENTER és az ESC kulcsokat, kivéve, ha alosztály-eljárást használ. Amikor egy egyszerű vagy legördülő lista megkapja a bemeneti fókuszt, azonnal beállítja a fókuszt a gyermek szerkesztési vezérlőre. Ezért az alkalmazásnak le kell származtatnia a szerkesztési vezérlőt, hogy interceptálja a billentyűzet bemenetét egy egyszerű vagy legördülő kombinált lista esetében. Erre példa: Alosztályozása egy kombinált listának.

Ha egy alosztály-eljárás feldolgozza a WM_PAINT üzenetet, a BeginPaint függvénnyel kell felkészülnie a festésre. A EndPaint függvény meghívása előtt az eszközkörnyezet (DC) fogantyúját adja át az ablakeljárás wParam paramétereként. Ha EndPaint van elsőként meghívva, az osztályablak eljárása nem végez festést, mert EndPaint ellenőrzi a teljes ablakot.

Az alosztályozáshoz kapcsolódó technika a szuperosztályozás. A szuperosztály minden más osztályhoz hasonló, azzal a kivétellel, hogy az ablakművelete nem hívja meg DefWindowProc a feldolgozatlan üzenetek kezelésére. Ehelyett feldolgozatlan üzeneteket ad át a szülőablakosztály ablakeljárásának. Kövesse az Ablakeljárások irányelveit, hogy elkerülje az alosztályozással és a szuperosztályozással kapcsolatos problémákat.