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
- Liste Kutusu Türleri ve Stilleri
- Liste Kutusu İşlevleri
- Liste Kutularından Bildirim İletilerini
- Mesajlar Liste Kutularına
- Varsayılan Pencere Mesaj İşleme
- Owner-Drawn liste kutuları
- Sürüklenebilir Liste Kutuları
- Sürüklenebilir Liste Kutusu Oluşturma
- Liste Kutusu İletilerini Sürükleme
- Liste Kutusu Bildirim Kodlarını Sürükleyin
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