Aracılığıyla paylaş


Liste Kutuları Hakkında

Liste kutusu denetimi, kullanıcının genel olarak bir veya daha fazla öğe seçebileceği basit bir liste içerir. Liste kutuları, Liste Görünümü denetimleriyle karşılaştırıldığında sınırlı esneklik sağlar.

Liste kutusu öğeleri metin dizeleri, bit eşlemler veya her ikisiyle de temsil edilebilir. Liste kutusu, tüm liste kutusu öğelerini aynı anda görüntüleyecek kadar büyük değilse, liste kutusu bir kaydırma çubuğu sağlar. Kullanıcı liste kutusu öğelerini kaydırarak seçim durumunu gerektiği gibi uygular veya kaldırır. Liste kutusu öğesinin seçilmesi, genellikle metin ve arka plan renklerini ilgili işletim sistemi ölçümleri tarafından belirtilenlerle değiştirerek görsel görünümünü değiştirir. Kullanıcı bir öğeyi seçtiğinde veya seçimini kaldırdığında, sistem liste kutusunun üst penceresine bir bildirim iletisi gönderir.

Bir ANSI uygulaması için sistem, CP_ACP kod sayfasını kullanarak liste kutusundaki metni Unicode'a dönüştürür. Bu sorunlara neden olabilir. Windows’un Japonca sürümünde, Unicode olmayan bir liste kutusunda üzerinde aksan bulunan Romen harfleri bozuk çıkacaktır. Bunu düzeltmek için uygulamayı Unicode olarak derleyin veya sahip tarafından çizilmiş bir liste kutusu kullanın.

Bu bölümde aşağıdaki konular ele alınmaktadır:

Liste Kutusu Oluşturma

İletişim kutusunda liste kutusu oluşturmanın en kolay yolu, bunu Microsoft Visual Studio'daki Araç Kutusu'ndan iletişim kutusu kaynağınıza sürüklemektir. Liste kutusunu dinamik olarak oluşturmak veya iletişim kutusu dışında bir pencerede liste kutusu oluşturmak için createWindowExişlevinikullanın; WC_LISTBOX pencere sınıfını ve uygun liste kutusu stillerinibelirtin.

Liste Kutusu Türleri ve Stilleri

İki tür liste kutusu vardır: tek seçim (varsayılan) ve çoklu seçim. Tek seçimli liste kutusunda, kullanıcı aynı anda yalnızca bir öğe seçebilir. Birden çok seçimli liste kutusunda, kullanıcı aynı anda birden fazla öğe seçebilir. Birden çok seçimli liste kutusu oluşturmak için LBS_MULTIPLESEL veya LBS_EXTENDEDSEL stilini belirtin.

Liste kutusunun görünümü ve çalışması, liste kutusu stilleri ve pencere stilleri tarafından kontrol edilmektedir. Bu stiller, listenin sıralanıp sıralanmadığını, birden çok sütun halinde düzenlendiğini, uygulama tarafından çizilip çizılmadığını vb. gösterir. Liste kutusunun boyutları ve stilleri genellikle bir uygulamanın kaynaklarına dahil edilen iletişim kutusu şablonunda tanımlanır.

Not

Bu denetimlerle görsel stilleri kullanmak için uygulamanın bir bildirim içermesi ve programın başında initCommonControlsçağırması gerekir. Görsel stilleri hakkında bilgi için bkz. Görsel Stilleri. Bildirimler hakkında bilgi için bkz. Görsel Stilleri Etkinleştirme.

Liste Kutusu İşlevleri

DlgDirList işlevi, liste kutusunun içeriğini belirtilen ölçüt kümesiyle eşleşen sürücülerin, dizinlerin ve dosyaların adlarıyla değiştirir. DlgDirSelectEx işlevi, DlgDirListtarafından başlatılan liste kutusunda geçerli seçimi alır. Bu işlevler, kullanıcının dosyanın konumunu ve adını yazmadan liste kutusundan bir sürücü, dizin veya dosya seçmesini mümkün hale getirir.

Ayrıca, GetListBoxInfoişlevi, belirtilen liste kutusundaki sütun başına öğe sayısını döndürür.

Liste Kutularından Bildirim İletileri

Liste kutusunda bir olay oluştuğunda, liste kutusu sahip penceresinin iletişim kutusu yordamına WM_COMMAND iletisi biçiminde bir bildirim kodu gönderir. Liste kutusu bildirim kodları, kullanıcı bir liste kutusu öğesini seçtiğinde, çift tıkladığında veya iptal ettiğinde gönderilir; liste kutusu klavye odağını aldığında veya kaybettiğinde; ve sistem bir liste kutusu isteği için yeterli bellek ayıramadığında. WM_COMMAND iletisi, wParam parametresinin düşük sıralı sözcüğünde liste kutusu tanımlayıcısını ve yüksek sıralı sözcükteki bildirim kodunu içerir. lParam parametresi denetim penceresi tutamacını içerir.

Bu iletileri işlemek için bir iletişim kutusu yordamı gerekmez; varsayılan pencere yordamı bunları işler.

Bir uygulamanın aşağıdaki liste kutusu bildirim kodlarını izlemesi ve işlemesi gerekir.

Bildirim kodu Açıklama
LBN_DBLCLK Kullanıcı, liste kutusundaki bir öğeye çift tıklar.
LBN_ERRSPACE Liste kutusu bir isteği yerine getirmek için yeterli bellek ayıramıyor.
LBN_KILLFOCUS Liste kutusu klavye odağını kaybeder.
LBN_SELCANCEL Kullanıcı, liste kutusundaki bir öğenin seçimini iptal eder.
LBN_SELCHANGE Liste kutusundaki seçim değişmek üzere.
LBN_SETFOCUS Liste kutusu klavye odağını alır.

Liste Kutularına İletiler

İletişim kutusu yordamı liste kutusu öğeleri eklemek, silmek, gözden geçirmek ve değiştirmek için bir liste kutusuna ileti gönderebilir. Örneğin, bir iletişim kutusu yordamı öğe eklemek için liste kutusuna bir LB_ADDSTRING iletisi ve öğenin seçili olup olmadığını belirlemek için bir LB_GETSEL iletisi gönderebilir. Diğer iletiler, liste kutusunun boyutu, görünümü ve davranışıyla ilgili bilgileri ayarlar ve alır. Örneğin, LB_SETHORIZONTALEXTENT iletisi liste kutusunun kaydırılabilir genişliğini ayarlar. İletişim kutusu yordamı, SendMessage veya SendDlgItemMessageişlevinikullanarak herhangi bir iletiyi liste kutusuna gönderebilir.

Liste kutusu öğesine genellikle dizini, öğenin liste kutusundaki konumunu temsil eden bir tamsayı tarafından başvurulur. Liste kutusundaki ilk öğenin dizini 0, ikinci öğenin dizini 1 vb. olur.

Aşağıdaki tabloda, önceden tanımlanmış liste kutusu yordamının liste kutusu iletilerine nasıl yanıt verdiği açıklanmaktadır.

İleti Yanıt
LB_ADDFILE DlgDirList işlevi tarafından doldurulan bir dizin liste kutusuna dosya ekler ve eklenen öğenin liste kutusu dizinini alır.
LB_ADDSTRING Liste kutusuna bir dize ekler ve dizinini döndürür.
LB_DELETESTRING Liste kutusundan bir dize kaldırır ve listede kalan dizelerin sayısını döndürür.
LB_DIR Liste kutusuna dosya adlarının listesini ekler ve eklenen son dosya adının dizinini döndürür.
LB_FINDSTRING Belirtilen bir dizeyle başlayan liste kutusundaki ilk dizenin dizinini döndürür.
LB_FINDSTRINGEXACT Belirtilen dizeye eşit olan liste kutusundaki dizenin dizinini döndürür.
LB_GETANCHORINDEX Farenin en son seçtiği öğenin dizinini döndürür.
LB_GETCARETINDEX Odak dikdörtgeni olan öğenin dizinini döndürür.
LB_GETCOUNT Liste kutusundaki öğe sayısını döndürür.
LB_GETCURSEL Seçili durumdaki öğenin dizinini döndürür.
LB_GETHORIZONTALEXTENT Liste kutusunun piksel cinsinden kaydırılabilir genişliğini döndürür.
LB_GETITEMDATA Belirtilen öğeyle ilişkili değeri döndürür.
LB_GETITEMHEIGHT Liste kutusundaki bir öğenin yüksekliğini piksel cinsinden döndürür.
LB_GETITEMRECT Belirtilen liste kutusu öğesinin istemci koordinatlarını alır.
LB_GETLOCALE Liste kutusunun yerel ayarını alır. Yüksek sıralı sözcük ülke/bölge kodunu, düşük sıralı sözcük ise dil tanımlayıcısını içerir.
LB_GETSEL Liste kutusu öğesinin seçim durumunu döndürür.
LB_GETSELCOUNT Birden çok seçimli liste kutusundaki seçili öğelerin sayısını döndürür.
LB_GETSELITEMS Birden çok seçimli liste kutusunda tüm seçili öğelerin dizinlerinden oluşan bir dizi oluşturur ve seçili öğelerin toplam sayısını döndürür.
LB_GETTEXT Belirtilen bir öğeyle ilişkili dizeyi ve dizenin uzunluğunu alır.
LB_GETTEXTLEN Belirtilen bir öğeyle ilişkilendirilmiş dizenin uzunluğunu karakter cinsinden döndürür.
LB_GETTOPINDEX Liste kutusundaki ilk görünür öğenin dizinini döndürür.
LB_INITSTORAGE Belirtilen öğe sayısı ve ilişkili dizeleri için bellek ayırır.
LB_INSERTSTRING Liste kutusundaki belirtilen dizine bir dize ekler.
LB_ITEMFROMPOINT Liste kutusunda belirtilen noktaya en yakın öğenin sıfır tabanlı dizinini alır.
LB_RESETCONTENT Liste kutusundan tüm öğeleri kaldırır.
LB_SELECTSTRING Belirtilen ön ekle eşleşen bulduğu ilk dizeyi seçer.
LB_SELITEMRANGE Liste kutusunda belirtilen öğe aralığını seçer.
LB_SELITEMRANGEEX Aralıktaki ilk öğenin dizini aralıktaki son öğenin dizininden küçükse, belirtilen öğe aralığını seçer. İlk öğenin dizini son öğeden büyükse aralıktaki seçimi iptal eder.
LB_SETANCHORINDEX Farenin en son seçtiği öğeyi belirtilen bir öğeye ayarlar.
LB_SETCARETINDEX Odak dikdörtgenini belirtilen liste kutusu öğesine ayarlar.
LB_SETCOLUMNWIDTH Liste kutusundaki tüm sütunların genişliğini piksel cinsinden ayarlar.
LB_SETCOUNT Liste kutusundaki öğe sayısını ayarlar.
LB_SETCURSEL Belirtilen liste kutusu öğesini seçer.
LB_SETHORIZONTALEXTENT Liste kutusunun kaydırılabilir genişliğini piksel olarak ayarlar.
LB_SETITEMDATA Bir değeri liste kutusu öğesiyle ilişkilendirir.
LB_SETITEMHEIGHT Liste kutusundaki bir öğenin veya öğelerin yüksekliğini piksel cinsinden ayarlar.
LB_SETLOCALE Liste kutusunun yerel ayarını ayarlar ve önceki yerel ayar tanımlayıcısını döndürür.
LB_SETSEL Birden çok seçimli liste kutusunda bir öğeyi seçer.
LB_SETTABSTOPS Sekme duraklarını belirtilen dizide belirtilenlere ayarlar.
LB_SETTOPINDEX Belirtilen öğe görünür aralığın en üstünde olacak şekilde liste kutusunu kaydırıyor.

Varsayılan Pencere Mesajı İşlemesi

Önceden tanımlanmış liste kutusu pencere sınıfı için pencere yordamı, liste kutusunun işlemediği tüm iletiler için varsayılan işlemeyi yürütür. Liste kutusu yordamı bir ileti için FALSE döndürdüğünde, önceden tanımlanmış pencere yordamı iletiyi denetler ve aşağıdaki tabloda gösterildiği gibi varsayılan eylemleri gerçekleştirir.

İleti Varsayılan eylem
WM_CHAR Seçimi, kullanıcının yazdığı karakterle başlayan ilk öğeye taşır. Liste kutusunda LBS_OWNERDRAW stili varsa hiçbir eylem gerçekleşmez. Kısa bir aralık içinde yazılan birden çok karakter grup olarak değerlendirilir ve bu karakter serisiyle başlayan ilk öğe seçilir.
WM_CREATE Boş bir liste kutusu oluşturur.
WM_DESTROY Liste kutusunu yok eder ve kullandığı tüm kaynakları serbest bırakır.
İletiyi iletişim kutusu yordamına veya üst pencere işlemine geçirir.
WM_ENABLE Denetim görünür durumdaysa, dizelerin griye boyanabilmesi için dikdörtgen geçersiz kılınır.
WM_ERASEBKGND Liste kutusunun arka planını siler. Liste kutusunda LBS_OWNERDRAW stili varsa arka plan silinmez.
WM_GETDLGCODE DLGC_WANTARROWS döndürür | DLGC_WANTCHARS, varsayılan liste kutusu yordamının ok tuşlarını ve WM_CHAR iletilerini işlediğini gösterir.
WM_GETFONT Liste kutusu için geçerli olan yazı tipinin tanıtıcısını döndürür.
WM_HSCROLL Liste kutusunu yatay olarak kaydırıyor.
WM_KEYDOWN Kaydırma için sanal anahtarları işler. Sanal anahtar, imlecin taşınacağı öğenin dizinidir. Seçim değiştirilmez.
WM_KILLFOCUS İmleci kapatır ve kaldırır. Liste kutusunun sahibine bir LBN_KILLFOCUS bildirim kodu gönderir.
WM_LBUTTONDBLCLK Liste kutusu istemci alanındaki fareyi izler. Bu, fare düğmesi liste kutusu istemci alanının dışında bırakıldığında kullanıcının seçimi iptal etmesine olanak tanır.
WM_LBUTTONDOWN Liste kutusu istemci alanındaki fareyi izler. Bu, fare düğmesi liste kutusu istemci alanının dışında bırakıldığında kullanıcının seçimi iptal etmesine olanak tanır.
WM_LBUTTONUP Liste kutusu istemci alanında fareyi izler. Bu, fare düğmesi liste kutusu istemci alanının dışında bırakıldığında kullanıcının seçimi iptal etmesine olanak tanır.
WM_MOUSEMOVE Liste kutusu istemci alanındaki fareyi izler. Bu, fare düğmesi liste kutusu istemci alanının dışında bırakıldığında kullanıcının seçimi iptal etmesine olanak tanır.
WM_PAINT Cihaz bağlamı (DC) için liste kutusu tutamacını kullanarak alt sınıflanmış bir boya işlemi gerçekleştirir.
WM_SETFOCUS İmleci açar ve liste kutusunun sahibine bir LBN_SETFOCUS bildirim kodu gönderir.
WM_SETFONT Liste kutusu için yeni bir yazı tipi ayarlar.
WM_SETREDRAW wParamdeğerine bağlı olarak yeniden çizim bayrağını ayarlar veya sıfırlar.
WM_SIZE Liste kutusunu, öğelerin tam sayıda sığabileceği şekilde yeniden boyutlandırır.
WM_VSCROLL Liste kutusunu dikey olarak kaydırıyor.

Önceden tanımlanmış liste kutusu yordamı, diğer tüm iletileri varsayılan işleme için DefWindowProcgeçirir.

Owner-Drawn Liste Kutuları

Uygulama, liste öğelerini boyama sorumluluğunu üstlenmek için bir sahip çizimli liste kutusu oluşturabilir. Kendi çizimi yapılan liste kutusunun (sahibi) üst penceresi veya iletişim kutusu, liste kutusunun bir bölümünün boyanması gerektiğinde WM_DRAWITEM mesajlarını alır. Sahip tarafından çizilmiş bir liste kutusu, metin dizeleri dışındaki veya buna ek olarak bilgileri listeleyebilir.

Sahip tarafından çizilmiş liste kutusunun sahibi, WM_DRAWITEM iletisini işlemelidir. Bu ileti, liste kutusunun bir bölümünün yeniden çizilmesi gerektiğinde gönderilir. Sahibin, liste kutusu için belirtilen stillere bağlı olarak diğer iletileri işlemesi gerekebilir.

Uygulama, LBS_OWNERDRAWFIXED veya LBS_OWNERDRAWVARIABLE stilini belirterek sahip tarafından çizilmiş bir liste kutusu oluşturabilir. Liste kutusundaki tüm liste öğeleri dizeler veya simgeler gibi aynı yükseklikteyse, bir uygulama LBS_OWNERDRAWFIXED stilini kullanabilir. Liste öğeleri farklı yükseklikteyse (örneğin, farklı boyutta bit eşlemler), bir uygulama LBS_OWNERDRAWVARIABLE stilini kullanabilir.

Sahip tarafından çizilmiş liste kutusunun sahibi, liste öğelerinin boyutlarını belirtmek için WM_MEASUREITEM iletisini işleyebilir. Uygulama LBS_OWNERDRAWFIXED stilini kullanarak liste kutusunu oluşturursa, sistem WM_MEASUREITEM iletisini yalnızca bir kez gönderir. Sahip tarafından belirtilen boyutlar tüm liste öğeleri için kullanılır. LBS_OWNERDRAWVARIABLE stili kullanılırsa, sistem liste kutusuna eklenen her liste öğesi için bir WM_MEASUREITEM iletisi gönderir. Sahip, sırasıyla LB_GETITEMHEIGHT ve LB_SETITEMHEIGHT iletilerini kullanarak istediğiniz zaman liste öğesinin yüksekliğini belirleyebilir veya ayarlayabilir.

Sahip tarafından çizilen liste kutusunda görüntülenen bilgiler metin içeriyorsa, uygulama LBS_HASSTRINGS stilini belirterek her liste öğesi için metni izleyebilir. LBS_SORT stiline sahip liste kutuları bu metne göre sıralanır. Liste kutusu sıralanmışsa ancak LBS_HASSTRINGS stilinde değilse, sahibin WM_COMPAREITEM iletisini işlemesi gerekir.

Sahip tarafından çizilmiş bir liste kutusunda, sahibin metin dışında veya metinlere ek olarak bilgi içeren liste öğelerini izlemesi gerekir. Bunu yapmak için kullanışlı yollardan biri, LB_SETITEMDATA iletisini kullanarak tanıtıcıyı bilgi verisi olarak kaydetmektir. Liste kutusundaki öğelerle ilişkilendirilmiş veri nesnelerini boşaltmak için, sahip WM_DELETEITEM iletisini işleyebilir.

Sahip tarafından çizilmiş liste kutusu örneği için bkz. Owner-Drawn Liste Kutusu Oluşturma .

Liste Kutularını Sürükle

Sürükle liste kutusu, kullanıcının öğeleri bir konumdan diğerine sürüklemesini sağlayan özel bir liste kutusu türüdür. Bir uygulama, dizeleri belirli bir sırada görüntülemek ve öğeleri konuma sürükleyerek kullanıcının diziyi değiştirmesini sağlamak için sürükleme liste kutusunu kullanabilir.

Sürüklenebilir Liste Kutuları Oluşturma

"Sürükle listesi kutuları, aynı pencere stillerine sahiptir ve standart liste kutularıyla aynı iletileri işler." Sürükleme listesi kutusu oluşturmak için önce standart bir liste kutusu oluşturun ve ardından MakeDragListişleviniçağırın. İletişim kutusundaki liste kutusunu sürükleme listesi kutusuna dönüştürmek için, WM_INITDIALOG iletisi işlenirken MakeDragList çağırabilirsiniz.

Liste Kutusu İletilerini Sürükle

Sürükle liste kutusu, sürükleme olaylarını üst pencereye sürükleme listesi iletisi göndererek bildirir. Üst pencere, sürükleme listesi iletisini işlemelidir.

MakeDragList işlevi çağrıldığında sürükleme listesi kutusu bu iletiyi kaydeder. Sürükleme listesi iletisinin ileti tanımlayıcısını (sayısal değer) almak için, registerWindowMessageişleviniçağırın ve DRAGLISTMSGSTRING değerini belirtin.

Sürükleme listesi iletisinin wParam parametresi, sürükleme listesi kutusunun denetim tanımlayıcısıdır. lParam parametresi, sürükle olayının ve diğer bilgilerin bildirim kodunu içeren DRAGLISTINFO yapısının adresidir. Mesajın dönüş değeri bildirime bağlıdır.

Liste Kutusu Bildirim Kodlarını Sürükle

Sürükleme listesi iletisine dahil edilen DRAGLISTINFO yapısının uNotification üyesi tarafından tanımlanan sürükleme listesi bildirim kodu DL_BEGINDRAG, DL_DRAGGING, DL_CANCELDRAGveya DL_DROPPEDolabilir.

DL_BEGINDRAG bildirim kodu, imleç bir liste öğesinde olduğunda ve kullanıcı sol fare düğmesine tıkladığında gönderilir. Üst pencere, sürükleme işlemini başlatmak için TRUE veya sürüklemeye izin vermemek için FALSE döndürebilir. Bu şekilde, ana pencere bazı liste öğeleri için sürüklemeyi etkinleştirebilir ve diğerleri için devre dışı bırakabilir. LBItemFromPt işlevini kullanarak belirtilen konumda hangi liste öğesinin olduğunu belirleyebilirsiniz.

Sürükleme etkinse, fare hareket ettirildiğinde veya hareket ettirilmiyorsa düzenli aralıklarla DL_DRAGGING bildirim kodu gönderilir. Üst pencere önce LBItemFromPt kullanarak imlecin altındaki liste öğesini belirlemeli ve ardından DrawInsert işlevini kullanarak ekleme simgesini çizmelidir. LBItemFromPtfonksiyonunun bAutoScroll parametresi için "TRUE" olarak belirttiğinizde, imleç istemci alanının üstünde veya altındaysa liste kutusunun bir satır kaydırılmasını sağlayabilirsiniz. Bu bildirim için döndürdüğünüz değer, sürükleme listesi kutusunun ayarlanacağı fare imlecinin türünü belirtir.

Kullanıcı farenin sağ düğmesine tıklayarak veya ESC tuşuna basarak bir sürükleme işlemini iptal ederse DL_CANCELDRAG bildirim kodu gönderilir. DL_DROPPED bildirim kodu, imleç bir liste öğesinin üzerinde olmasa bile, kullanıcı sol fare düğmesini serbest bırakarak bir sürükleme işlemini tamamlarsa gönderilir. Sürükle liste kutusu, herhangi bir bildirim göndermeden önce fare yakalamayı serbest bırakır. Bu iki bildirimin dönüş değeri yoksayılır. Listeyi Sürükle