Windows API - Bileşik Giriş Kutusu Kontrolünün Oluşturulması ve Kullanımı - 1
Jul 26,2007 00:00 by canawar

Bu yazımızda, ’Combo Box’ adıyla bilinen bileşik giriş kutusu kontrolünü inceleyeceğiz. Bileşik giriş kutusu kontrolü, listeleme kutusu kontrolü ve yazı kutusu kontrolünün çeşitli işlevselliklerini birleştiren kullanışlı bir kontroldür. Kullanıcının daha önceden belirlenmiş birtakım seçenekler arasından birisini seçmesi amacıyla kullanılır. Örnek olarak, kişisel bilgileri tutmak amacıyla oluşturulmuş bir formda, kişinin doğum yerini seçebilmesi amacıyla tüm şehir isimlerini içeren bir bileşik giriş kutusu kontrolü forma yerleştirilebilir.

Win32 sistemlerinde üç tür bileşik giriş kutusu kontrolü bulunmaktadır :
    1. Basit bileşik giriş kutuları (simple combo boxes, CBS_SIMPLE)
    2. Aşağıya açılabilen bileşik giriş kutuları (drop-down combo boxes, CBS_DROPDOWN)
    3. Aşağıya açılabilen listeleme kutuları (drop-down list boxes, CBS_DROPDOWNLIST)

Bileşik giriş kutusu, bir listeden ve bir seçim alanından oluşur. Listede, kullanıcının seçmesi için bir araya getirilmiş seçenekler bulunur, seçim alanı ise o an seçili olarak bulunan seçeneği belirtir. Aşağıya açılabilen listeleme kutusu haricindeki diğer bileşik giriş kutularında, seçim alanı aslında, kulanıcının yazı girebilmesine izin veren bir yazı kutusudur. Kontrolümüzün ekranda nasıl göründüğüne bakalım :

   

Bileşik giriş kutuları, aşağıya açılır bir liste görünümünde mi olduklarına ve seçim alanının bir yazı kutusu kontrolü mü olduklarına göre birkaç türde olabilirler. Aşağıya açılan liste görünümündeki bileşik giriş kutuları, sadece kullanıcı kontrolü seçtiği zaman seçenekleri görüntüler, bu nedenle de form üzerinde listeleme kutularına nazaran daha az yer kaplarlar. Seçim alanı yazı kutusu kontrolü olduğunda, kullanıcı kendi seçimini yazı bilgisi olarak kontrole girebilirken, seçim alanı yazı kutusu kontrolü olmadığında sadece listede sunulan seçeneklerden birisini seçebilir. Bu üç bileşik giriş kutusu kontrolü türünün özelliklerini kabaca ele alırsak, basit bileşik giriş kutularının listesi yoktur, seçim alanları yazı kutusu kontrolüdür. Aşağıya açılır bileşik giriş kutularının listesi vardır ve seçim alanları bir yazı kutusu kontrolüdür. Aşağıya açılır listeleme kutularının da listesi vardır, ancak seçim alanları yazı kutusu kontrolü değildir. Uygulama içerisinde ihtiyacımızı tam olarak belirleyerek, ihtiyacımızı karşılayan uygun kontrol türünü seçmeliyiz. Aşağıdaki şekilde, bileşik giriş kutularının bileşenleri gösterilmiştir.

Bileşik giriş kutusu kontrolü için sunulmuş pencere biçimlerinden bazıları, sadece belli türdeki bileşik giriş kutularına uygulanabilirken, bazı pencere biçimleri de gerek tek başlarına gerek diğer pencere biçimleri ile bir arada kullanılarak bileşik giriş kutularına uygulanabilir. Şimdi bu biçimleri sırasıyla ele alalım :

Bileşik Giriş Kutusu Kontrolüne İlişkin Pencere Biçimleri

BİLEŞİK GİRİŞ KUTUSU KONTROLÜ PENCERE BİÇİMİ SEMBOLİK SABİT İSMİ
ANLAMI
CBS_AUTOHSCROLLKullanıcının yazı kutusu kontrolüne girdiği karakter katarı uzunluğu, kontrolün genişliğini aştığı zaman, kontroldeki yazıyı sağa kaydırır. Kontrole bu pencere biçimi atanmadığı zaman, kullanıcının girdiği yazının sadece kontrole sığan kısmı gösterilir.
CBS_DISABLENOSCROLLListeleme kutusundaki elemanlar kutunun toplam yükseliğine sığdığı zaman, listeleme kutusunda pasif bir dikey kaydırma çubuğu görüntülenmesini sağlar. Kontrole bu pencere biçimi atanmadığı zaman, listeleme kutusundaki dikey kaydırma çubuğu gizlenir.
CBS_DROPDOWNAşağıya açılan bileşik giriş kutusunu ifade eder.
CBS_DROPDOWNLISTAşağıya açılan listeleme kutusunu ifade eder.
CBS_HASSTRINGSKulanıcı-tanımlı bir bileşik giriş kutusu kontrolünün, karakter katarı elemanlarından oluşup oluşmayacağını belirler. Bileşik giriş kutusu kontrolü, karakter katarı elemanlarından oluştuğunda, bellekte elemanlar için tahsis edilmiş alanları muhafaza eder. Böylece kontrole, belli bir elemanın yazısını almak için gönderilen CB_GETLBTEXT mesajı gönderildiğinde bilgi başarıyla alınabilir.
CBS_LOWERCASEListeleme kutusundaki ve seçim alanındaki yazıların harflerinin hepsini küçük harfe çevirir.
CBS_NOINTEGRALHEIGHTKontrolün boyutlarının, uygulama kontrolü oluşturduğunda kontrole uygulama tarafından verilen boyutta olmasını sağlar.
CBS_OEMCONVERTKontrole girilen karakterleri, Windows karakter setinden OEM karakter setine dönüştürür, ardından tekrar Windows karakter setine dönüştürür. Böylece uygulamada ConvertToOem fonksiyonu çağrıldığında karakter dönüşümünün düzgün bir şekilde yapılması sağlanır. Özellikle elemanları dosya isimleri olan bileşik giriş kutularına atanan bu özellik, CBS_SIMPLE ve CBS_DROPDOWN biçimleriyle birlikte kullanılır.
CBS_OWNERDRAWFIXEDKontrolün liste bileşeninin, kontrolün ana penceresi tarafından çizileceğini ve liste bileşenindeki tüm elemanların aynı yükseklikte olacağını belirtir. Kontrol oluşturulduğunda ana penceresine WM_MEASUREITEM mesajı iletilir, kontrolün yeniden çizilmesi gerektiğinde ise WM_DRAWITEM mesajı iletilir.
CBS_OWNERDRAWVARIABLEKontrolün liste bileşeninin, kontrolün ana penceresi tarafından çizileceğini ve liste bileşenindeki elemanların yüksekliklerinin farklı olabileceğini belirtir. Kontrol oluşturulduğunda ana penceresine WM_MEASUREITEM mesajı iletilir, kontrolün yeniden çizilmesi gerektiğinde ise WM_DRAWITEM mesajı iletilir.
CBS_SIMPLEBasit bileşik giriş kutusu kontrolünü ifade eder.
CBS_SORTListeye eklenen elemanların otomatik olarak sıralanmasını sağlar.
CBS_UPPERCASEKontroldeki tüm karakterlerin büyük harfe dönüştürür.

Kontrolün Liste Bileşeni :

Liste bileşeni, bileşik giriş kutusu kontrolünün kullanıcının seçebileceği elemanları bir liste halinde gösteren bileşenidir. Genellikle uygulamada bir bileşik giriş kutusu kontrolü oluşturulduğunda, bu listenin elemanları da belirlenir. Ya da kontrol oluşturulduktan sonra listeye eleman eklenebilir, listeden herhangi bir eleman silinebilir ya da liste sıfırlanarak yeniden oluşturulabilir. Kullanıcı tarafından o anda seçilen eleman, geçerli seçimi (current selection) belirtir. Basit bileşik giriş kutuları ve aşağıya açılabilen bileşik giriş kutularında, kullanıcı listeden bir eleman seçebilmesinin yanı sıra seçim alanına karakterler girerek de seçimini belirtebilir. Bu durumda geçerli seçim ifadesi kullanılmaz.

Kontrole eleman eklemek için, CB_ADDSTRING mesajı gönderilir. Bu mesajla birlikte gönderilen yeni eleman listenin sonuna eklenir. Sıralı bir listede ise uygun sırada eklenir. Sıralı olmayan bir listenin belli bir sıra numarasına eleman eklemek için kontrole CB_INSERTSTRING mesajı gönderilir. Bir elemanın sıra numarasını öğrenmek için ise kontrole CB_FINDSTRING veya CB_FINDSTRINGEXACT mesajı gönderilir. CB_FINDSTRING mesajı adı (elemanın başlık bilgisi olarak görünen karakte katarı), parametre olarak gönderilen karakter katarı ile başlayan elemanı döndürür, CB_FINDSTRINGEXACT mesajı ise tam uyum arar. Bu mesajların büyük küçük harf duyarlılığı yoktur.

Listeden bir eleman silmek için, kontrole CB_DELETESTRING mesajı gönderilir. Kontrolün listesi yeniden oluşturulacaksa, öncelikle liste sıfırlanmalıdır. Listeyi sıfırlamak için de kontrole CB_RESETCONTENT mesajı gönderilir. Listenin belli bir elemanının başlık bilgisini öğrenmek için ise kontrole CB_GETLBTEXT mesajı gönderilir. Bu mesajdan geri döndürülen değer, uygulamada belirlenen bir tampon bölgeye kopyalanır. Bu tampon bölgenin yeterli miktarda olduğundan emin olmamız gerekliyse öncelikle kontrole CB_GETLBTEXTLEN mesajı gönderip başlık bilgisinin uzunluğunu öğrenebiliriz. Kontrolün liste bileşenindeki eleman sayısını öğrenmek için kontrole CB_GETCOUNT mesajı gönderilir.

Geçerli Seçim İfadesi :

Geçerli seçim ifadesi, kullanıcının listeden seçmiş olduğu bir elemanı ifade eder. Seçilen elemanın adı, kontrolün seçim alanında gösterilir. Geçerli seçim, listeden seçilen elemanın sıfır tabanlı sıra numarasıdır. Uygulamanın çalışma zamanında, geçerli seçim ifadesi öğrenilebilir veya değiştirilebilir. Seçili elemanı değiştirmek için kontrole CB_SETCURSEL mesajı, seçili elemanı öğrenmek için ise kontrole CB_GETCURSEL mesajı gönderilir. Eğer kontrolün hiçbir elemanı seçili değilse, CB_GETCURSEL mesajından CB_ERR değeri döndürülür. Kullanıcı kontrolün seçili elemanını değiştirdiğinde, kontrolün ana penceresine bilgi mesajı iletilir, ancak geçerli seçim uygulama tarafından değiştirilirse ana pencereye bilgi mesajı iletilmez. Kontrol ilk oluşturulduğunda henüz bir geçerli seçim elemanı yoktur, geçerli seçimi belirlemek için, oluşturduktan sonra CB_SETCURSEL mesajı göndermemiz gerekir.

Kullanıcı, bileşik giriş kutusunun geçerli seçim elemanını değiştirdiği zaman, ana pencereye wParam parametresi CBN_SELCHANGE bilgi mesajını içeren bir WM_COMMAND mesajı gönderilir. Böylece uygulamanın çalışma zamanında, kullanıcının her eleman seçiminde belli bir işlemin yapılması sağlanabilir. Geçerli seçim kontrole CB_SETCURSEL mesajı gönderilerek değiştirildiğinde bu mesaj gönderilmez.

Aşağıya açılabilen bileşik giriş kutuları ve aşağıya açılabilen listeleme kutularında, geçerli seçim ifadesi değiştirilmeden önce, kontrole ait liste kutusunun kapatılması beklenir. Böylece seçim değişikliklerinde yapılması gereken işlemlerin, CBN_SELCHANGE mesajında değil, CBN_CLOSEUP mesajında yapılması sağlanabilir.

Kullanıcı listeden bir eleman seçtiğinde, ardından listeyi kapattığında, sistem tarafından CBN_SELENDOK mesajı gönderilir. Bu mesajın gönderilmesi, seçimin yapıldığını, tamamlandığını ve yeni seçili eleman üzerinde işlem yapılabileceğini belirtir. Kullanıcı listeden bir eleman seçtiğinde, ancak bu seçimin ardından listeyi kapamadan klavyeden ESC tuşuna basarak başka bir kontrole odaklandığında, sistem tarafından CBN_SELENDCANCEL mesajı gönderilir. Bu mesajın gönderilmesi, kullanıcının son yaptığı seçimin geçersiz olduğunu belirtir. Basit bileşik giriş kutularında, CBN_SELENDOK mesajı her CBN_SELCHANGE mesajından önce gönderilir. Kontrole pencere biçimi olarak WS_EX_NOPARENTNOTIFY biçimi atanmışsa, sistem tarafından CBN_SELENDOK ve CBN_SELENDCANCEL mesajları gönderilmez.

Basit bileşik giriş kutularında, kullanıcı listeden herhangi bir elemana çift tıkladığı zaman, sistem tarafından CBN_DBLCLK mesajı gönderilir. Ancak diğer iki tür için, listeleme kutusu eleman seçiminden sonra kapatıldığı için bu mesajın gönderilmesi mümkün değildir. Çünkü listedeki herhangi bir eleman üzerine çift tıklamak mümkün değildir.

Aşağıya Açılabilen Listeleme Kutuları :

Bazı bilgi mesajlar ve pencere mesajları, sadece aşağıya açılabilen listeleme kutularına sahip bileşik kutularına uygulanabilir. Bir bileşik giriş kutusu kontrolünün listeleme kutusu, açıldığında veya kapatıldığında kontrolün ana penceresine WM_COMMAND mesajı içerisinde bu bilgi gönderilir. WM_COMMAND mesajının wParam parametresinin yüksek anlamlı WORD değeri, listeleme kutusunun açıldığı veya kapatıldığı bilgisini içerir. wParam parametresinin yüksek anlamlı WORD değeri, eğer listeleme kutusu açılmışsa CBN_DROPDOWN değerine, kapatılmışsa CBN_CLOSEUP değerine sahip olur. Eğer uygulamanın çalışma zamanında listeleme kutusunu kodlama yoluyla açmak istiyorsak, kontrole CB_SHOWDROPDOWN mesajı göndermemiz gerekir. CB_GETDROPPEDSTATE mesajı ile listeleme kutusunun açılıp açılmadığı öğrenilebilir. CB_GETDROPPEDCONTROLRECT mesajı ile kontrolün ekran koordinatları öğrenilebilir. Listeleme kutusunun genişliğini ayarlamak için ise kontrole CB_SETDROPPEDWIDTH mesajı gönderilir.

Seçim Alanları :

Seçim alanı, bileşik giriş kutusunun seçili olan elemanını göstermek için kullanılan bölümüdür. Basit bileşik giriş kutularında ve aşağıya açılabilen bileşik giriş kutularında seçim alanı bir yazı kutusu kontrolüdür ve metin girmek için kullanılabilen bir alandır. Uygulama içerisinde seçim alanındaki bilgi öğrenilebilir veya değiştirilebilir. Ayrıca bu seçim alanına kullanıcı tarafından girilecek metin için karakter sayısı limiti konulabilir. Seçim alanındaki bilgi değiştiğinde, kontrolün ana penceresine Windows tarafından bilgi mesajı iletilir.

Seçim alanındaki bilginin alınması için kontrole WM_GETTEXT mesajı, bu alandaki bilginin değiştirilmesi için ise kontrole WM_SETTEXT mesajı gönderilir. Basit bileşik giriş kutularında veya aşağıya açılabilen bileşik giriş kutularında seçim alanındaki metin üzerinde belli karakterlerin seçilmesi gibi işlemler yapılabilir. Uygulamada, seçim alanındaki seçili metin bilgisininin başlangıç ve bitiş konumunu öğrenmek için kontrole CB_GETEDITSEL mesajı gönderilir. Bu kısımda metnin belli bir bölümünü seçmek için ise kontrole CB_SETEDITSEL mesajı gönderilir.

Kullanıcının seçim alanına girebileceği en fazla karakter sayısı, seçim alanının genişliği ile sınırlıdır. Ancak kontrol CBS_AUTOHSCROLL pencere biçimine sahip ise, girilecek karakter sayısı genişlik değerini aşsa bile, kaydırma yapılması nedeniyle daha fazla karakter girilmesine izin verilir. Kontrolün bu pencere biçimine sahip olup olmadığına bakılmaksızın, girilecek karakter sayısını sınırlamak istiyorsak, kontrole CB_LIMITTEXT mesajı göndermeliyiz.

Seçim alanındaki metin kullanıcı tarafından değiştirildiğinde, kontrolün ana penceresine bilgi mesajı iletilir. Bu durumda, öncelikle alandaki metnin değiştiğini ifade eden CBN_EDITUPDATE mesajı iletilir. Bu mesaj alındığındaalandaki metin değiştirilmiş, ancak henüz kontrolde görünen değer güncellenmemiştir. Değişiklik görünüme yansıtıldığında ana pencereye CBN_EDITCHANGE mesajı iletilir. Seçim alanındaki metnin değiştirilmesi, listeleme kutusundan başka bir elemanın seçilmesi sebebiyle gerçekleşmişse bu mesajlar iletilmez.

Liteleme Kutusu Elemanlarına Ait Veriler :

Bileşik giriş kutularının listelerindeki elemanlara, o elemanlanla ilgili özel veriler atamak mümkündür. Örneğin şehir isimlerini listelediğimiz bir bileşik giriş kutusunun her elemanına o şehre ait trafik numarası bilgisini atayabiliriz. Bu bilgi kullanıcıya gösterilmez, uygulama içerisinde kodlama yoluyla atanabilir veya öğrenilebilir. Kullanıcı listeden bir eleman seçtiğinde, kodlama yolu ile bu elemana ilişkin vierye ulaşabiliriz.

Bir liste elemanına DWORD türündeki veriyi atamak için CB_SETITEMDATA mesajı, bir liste elemanına ilişkin DWORD türündeki veriye erişmek için ise CB_GETITEMDATA mesajı gönderilir. Listeden bir eleman silindiğinde, o elemana ilişkin verinin de silinmesi için WM_DELETEITEM mesajı gönderilir.

Bileşik Giriş Kutusunun Gönderdiği Bilgi Mesajları :

Bileşik giriş kutuları, bilgi mesajlarını WM_COMMAND mesajı yolu ile gönderirler. Mesajın gönderilme sebebi, başka bir deyişle gerçekleşen olay wParam parametresinin yüksek anlamlı WORD değerinde saklanır. Bileşik giriş kutularının gönderdiği mesajlar şunlardır :

BİLEŞİK GİRİŞ KUTUSU KONTROLÜNÜN GÖNDERDİĞİ BİLGİ MESAJI
MESAJIN ANLAMI
CBN_CLOSEUPAşağıya açılabilen bileşik giriş kutuları veya aşağıya açılabilen listeleme kutularına ait listeleme kutusu kapatılacağı zaman gönderilir. wParam parametresinin düşük anlamlı WORD değeri bileşik giriş kutusunun tanımlayıcı değerini belirtir, lParam parametresi ise bileşik giriş kutusunun tutamaç değerini belirtir.
CBN_DBLCLKBasit bileşik giriş kutusunun bir elemanına fare ile çift tıklandığı zaman gönderilir.
CBN_DROPDOWNAşağıya açılabilen bileşik giriş kutuları veya aşağıya açılabilen listeleme kutularına ait listeleme kutusu açılacağı zaman gönderilir.
CBN_EDITCHANGEAşağıya açılabilen bileşik giriş kutuları veya basit bileşik giriş kutularına ait yazı kutusularındaki ifade değiştirildiği zaman gönderilir. Mesaj gönderildiğinde, yazı kutusundaki ifade değiştirilmiş olarak görünür.
CBN_EDITUPDATEAşağıya açılabilen bileşik giriş kutuları veya basit bileşik giriş kutularına ait yazı kutusularındaki ifade değiştirildiği zaman gönderilir. Mesaj gönderildiğinde, yazı kutusundaki ifade henüz değiştirilmemiştir; kullanıcı henüz eski ifadeyi görmektedir.
CBN_ERRSPACEBileşik giriş kutusu, herhangi bir işlem için yeterli belleği tahsis edemediği zaman gönderilir.
CBN_KILLFOCUSFare odağı bileşik giriş kutusu kontrolünden ayrılacağı zaman gönderilir.
CBN_SELCHANGEGeçerli seçim değiştirildiği zaman gönderilir.
CBN_SELENDCANCELAşağıya açılabilen listeleme kutusunda, listenin açılması sırasında yapılan seçim değişikliğinin yok sayılması istendiğinde gönderilir.
CBN_SELENDOKAşağıya açılabilen listeleme kutusunda, listenin açılması sırasında yapılan seçim değişikliğinin geçerli sayılması istendiğinde gönderilir.
CBN_SETFOCUSBileşik giriş kutusuna odaklanıldığı zaman gönderilir.

Bileşik Giriş Kutusuna Gönderilen Mesajlar :

Bileşik giriş kutusu kontrolüne gönderilen önemli mesajları bir tabloda özetleyelim :

BİLEŞİK GİRİŞ KUTUSUNA GÖNDERİLEN MESAJ
MESAJIN ANLAMI
CB_ADDSTRINGKontrolün liste kutusuna LB_ADDSTRING mesajı göndererek listeye yeni bir eleman eklenmesini sağlar. wParam parametresi sıfır geçilmelidir. lParam parametresi eklenecek elemanın başlık yazısının adresidir.
CB_DELETESTRINGKontrolün liste kutusuna LB_DELETESTRING mesajı göndererek listeden bir elemanın silinmesini sağlar. wParam parametresi silinecek elemanı belirtir. lParam parametresi sıfır geçilmelidir.
CB_DIRListeleme kutusuna, bellirli bir dizinde bulunan belirli özelliklere sahip olan dosya isimlerinin eklenmesini sağlar. wParam parametresi eklenecek olan dosyaların özelliklerini belirtir. lParam parametresi dosya adının adresidir.
CB_FINDSTRINGKontrolün liste kutusuna LB_FINDSTRING mesajı göndererek, adı parametre olarak geçilen yazı ile başlayan ilk liste elemanının sıra numarasını döndürür. wParam parametresi aramanın başlatılacağı elemandan bir önceki elemanı belirtir. lParam parametresi aranacak ismin içermesi gereken karakter katarını belirtir.
CB_FINDSTRINGEXACTKontrolün liste kutusuna LB_FINDSTRING mesajı göndererek, adı parametre olarak geçilen yazı ile tamamen eşleşen ilk liste elemanının sıra numarasını döndürür. wParam parametresi aramanın başlatılacağı elemandan bir önceki elemanı belirtir. lParam parametresi aranacak karakter katarını belirtir.
CB_GETCOUNTKontrolün liste kutusuna LB_GETCOUNT mesajı göndererek, listedeki toplam eleman sayısını döndürür. wParam ve lParam parametreleri sıfır geçilmelidir.
CB_GETCURSELKontrolün liste kutusuna LB_GETCURSEL mesajı göndererek, listedeki seçili olan elemanın sıra numarasını döndürür. wParam ve lParam parametreleri sıfır geçilmelidir.
CB_GETDROPPEDSTATEListe açık ise TRUE değerini, değilse FALSE değerini döndürür. wParam ve lParam parametreleri sıfır geçilmelidir.
CB_GETDROPPEDWIDTHListenin en küçük açılma genişliğini (piksel bazında) döndürür. wParam ve lParam parametreleri sıfır geçilmelidir.
CB_GETEDITSELListenin yazı kutusuna EM_GETSEL mesajı göndererek geçerli seçimin başlangıç ve bitiş konumunu döndürür. wParam parametresi başlangıç konumunu, lParam parametresi bitiş konumunu belirtir.
CB_GETITEMDATAKontrolün liste kutusuna LB_GETITEMDATA mesajı göndererek, listenin belirtilen elemanına atanmış veriyi döndürür. wParam parametresi verisi alınacak elemanın sıra numarasını belirtir. lParam parametresi sıfır geçilmelidir.
CB_GETLBTEXTKontrolün liste kutusuna LB_GETTEXT mesajı göndererek, listedenin belirtilen elemanına ilişkin başlık yazısını belirtilen tampon bölgeye kopyalar. wParam parametresi başlık yazısı alınacak elemanın sıra numarasını, lParam parametresi ise yazının kopyalanacağı tampon bölgeyi belirtir.
CB_GETLBTEXTLENKontrolün liste kutusuna LB_GETTEXT mesajı göndererek, listedenin belirtilen elemanına ilişkin başlık yazısının uzunluğunu döndürür. wParam parametresi başlık yazısı uzunluğu alınacak elemanın sıra numarasını belirtir. lParam parametresi sıfır geçilmelidir.
CB_GETTOPINDEXKontrolün liste kutusuna LB_GETTOPINDEX mesajı göndererek, listedeki görünür ilk elemanın sıra numarasını döndürür. wParam ve lParam parametreleri sıfır geçilmelidir.
CB_INSERTSTRINGKontrolün liste kutusuna LB_INSERTSTRING mesajı göndererek, listenin belli bir sıra numarasına eleman ekler. wParam parametresi elemanın ekleneceği sıra numarasını, lParam parametresi ise eklenen elemanın başlık yazısını belirtir.
CB_LIMITTEXTKontrolün yazı kutusuna EM_LIMITTEXT mesajı göndererek, kullanıcının gireceği karakter katarının uzunluğunu belli bir değerle sınırlar. wParam parametresi girilecek en fazla karakter sayısını belirtir. lParam parametresi sıfır geçilmelidir.
CB_RESETCONTENTKontrolün liste kutusuna LB_RESETCONTENT mesajı göndererek, listenin tüm elemanlarının silinmesini, baka bir deyişle listenin sıfırlanmasını sağlar. wParam ve lParam parametreleri sıfır geçilmelidir.
CB_SELECTSTRINGKontrolün liste kutusuna LB_SELECTSTRING mesajı göndererek, başlığı parametre olarak gönderilen karakter katarındaki karakterle başlayan bir elemanın arayıp, bulduğu ilk elemanın seçilmesini sağlar. wParam parametresi aramanın başlatılacağı elemandan bir önceki elemanı belirtir. lParam parametresi ise aranan karakter katarını belirtir.
CB_SETCURSELKontrolün liste kutusuna LB_SETCURSEL mesajı göndererek, belirli bir elemanın seçilmesini sağlar. wParam parametresi seçilecek elemanın sıra numarasını belirtir. lParam parametresi sıfır geçilmelidir.
CB_SETDROPPEDWIDTHListenin en küçük açılma genişliğini (piksel bazında) ayarlar. wParam parametresi en küçük açılma genişliğini belirtir. .lParam parametresi sıfır geçilmelidir.
CB_SETEDITSELKontrolün yazı kutusuna EM_SETSEL mesajı göndererek, kontroldeki yazının belirtilen kısmının seçilmesini sağlar.
CB_SETITEMDATAKontrolün liste kutusuna LB_SETITEMDATA mesajı göndererek, parametre olarak verilen verinin sıra numarası verilen liste elemanı ile eşleştirilmesini sağlar. wParam parametresi elemanın sıra numarasını, lParam parametresi ise ilgili elemana atanacak veriyi belirtir.
CB_SETTOPINDEXKontrolün liste kutusuna LB_SETTOPINDEX mesajı göndererek, listenin aşağıya açılır kısmının en üstünde sıra numarası parametre olarak geçilen liste elemanının görünmesini sağlar. wParam parametresi gösterilecek elemanın sıra numarasını belirtir. lParam parametresi sıfır geçilmelidir.
CB_SHOWDROPDOWNAşağıya açılır liste kutusunun görünüp görünmeyeceğini belirler. wParam parametresi görünüp görünmeme durumunu durumunu belirtir. lParam parametresi kullanılmaz sıfır geçilmelidir.
WM_CHARKarakter girişini denetler. Aşağıya açılabilen listeleme kutularında, bu mesaj liste kutusuna iletilir ve adı belirtilen karakter ile başlayan ilk liste elemanının seçilmesi sağlanır. Basit bileşik giriş kutularında ise mesaj kontrolün yazı kutusuna iletilir.
WM_CLEARBasit bileşik giriş kutularında ve aşağıya açılabilen bileşik giriş kutularında yazı kutusunun içeriğinin temizlenmesini sağlar.
WM_COPYBasit bileşik giriş kutularında ve aşağıya açılabilen bileşik giriş kutularında yazı kutusunun içeriğinin panoya kopyalanmasını sağlar.
WM_CUTBasit bileşik giriş kutularında ve aşağıya açılabilen bileşik giriş kutularında yazı kutusunun içeriğinin panoya kopyalanarak silinmesini sağlar.
WM_DELETEITEMBu mesaj kontrolün ana penceresine iletilerek uygulamayı, listeden bir elemanın silindiğine dair bilgilendirir.
WM_PASTEBasit bileşik giriş kutularında ve aşağıya açılabilen bileşik giriş kutularında, pano içeriğinin yazı kutusuna kopyalanmasını sağlar.

Uygulama :

Şimdi bileşik giriş kutusu kontrolüne ilişkin bir uygulama yapalım. Uygulamada, basit bir telefon defteri oluşturalım. Kişilere ilişkin isim, soyisim, şehir ve numara bilgilerini alarak bir dosyaya kaydedelim ve aynı zamanda kayıtları bir bileşik giriş kutusu kontrolünde saklayalım. Telefon numaralarını saklarken, şehre ilişkin alan kodu numarasını, kullanıcının bileşik giriş kutusu kontrolünde listelenen şehirlerden yaptığı seçime göre otomatik olarak atayalım. Şimdi adım adım uygulamamızı inceleyerek durumu daha iyi kavramaya çalışalım.

Uygulamamızın başlık dosyasında, global olarak tanımladığımız bazı fonksiyonlara ilişkin prototip bildirimleri ve kişi bilgilerini tutmak / almak için kullanacağımız PersonPhone isimli bir yapı bildirimleri yer almaktadır :

#ifndef _CAPI10_H_
#define _CAPI10_H_

typedef struct _personPhone {
    char name[40];
    char number[11];
}PersonPhone;

PersonPhone *CreatePersonPhone(char *name,char *number);
BOOL WritePersonPhone(const char *fileName,const PersonPhone *person);

#endif

Kaynak kod dosyamızın global alanında, standart kontrolleri oluştururken CreateWindow fonksiyonuna dokuzuncu parametre olarak geçilen kontrol tanımlayıcı değerlerine ilişkin sembolik sabitlerimizi, standart kontrollere ait kontrol tutamaç değerlerini tutacak HWND türünden nesne bildirimlerimizi ve global nesne bildirimlerimizi yazalım :

#define ID_LABEL_1 101
#define ID_LABEL_2 102
#define ID_LABEL_3 103
#define ID_LABEL_4 104
#define ID_LABEL_5 105
#define ID_NAME_LABEL 106
#define ID_NUMBER_LABEL 107
#define ID_EDIT_BOX_1 108
#define ID_EDIT_BOX_2 109
#define ID_EDIT_BOX_3 110
#define ID_COMBO_1 111
#define ID_COMBO_2 112
#define ID_PSH_BTN_1 113

static HWND hStatic;
static HWND hNameLabel, hNumberLabel;
static HWND hCombo1, hCombo2;
static HWND hEdit1, hEdit2, hEdit3;
static HWND hPushButton;

BOOL ComboBox1SelectionControl = TRUE;
BOOL ComboBox2SelectionControl = TRUE;

int i = 0;
int tmpRegionNumber = 0;
char *tmpRegions[50];

ComboBox1SelectionControl ve ComboBox1SelectionControl değişkenlerini, bileşik giriş kutularının CBN_SELCHANGE isimli olaylarını kontrol etmek amacıyla kullanacağız. tmpRegionNumber, tmpRegions ve i değişkenlerini programın çalışması sırasında dinamik olarak tahsis ettiğimiz bazı alanları daha sonradan serbest bırakmak için saklamak amacıyla kullanacağız. Kaynak kod dosyamızın global alanında belirttiğimiz fonksiyon prototip bildirimleri ise şunlardır :

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);

void ClearForm();
void FillComboBox1Elements();
void FillComboBox2Elements();
void OnPshButtonClick();
void OnComboBox1SelChange();
void OnComboBox2SelChange();

WndProc isimli fonskiyon, pencere fonksiyonumuzdur. Diğer fonskiyonlara kısaca bakacak olursak; ClearForm fonksiyonu formu temizlemek amacıyla kullanılacaktır. FillComboBox1Elements ve FillComboBox2Elements fonskiyonları sırasıyla birinci ve ikinci bileşik giriş kutularına eleman ekleyecek olan fonksiyonlardır. OnPshButtonClick fonksiyonu, form üzerinde yer alan standart düğme kontrolüne basıldığı zaman çağrılacak olan fonksiyondur. OnComboBox1SelChange ve OnComboBox2SelChange fonksiyonları sırasıyla birinci ve ikinci bileşik giriş kutusu kontrollerinde yapılacak seçimler sırasında çağrılacak olan fonksiyonlardır.

Şimdi pencere fonksiyonumuzun WM_COMMAND ve WM_CREATE mesajlarını alması durumunda yapılan işlemlere göz atalım :

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    switch(message) {
       case WM_COMMAND :
          if (LOWORD(wParam) == ID_PSH_BTN_1 && HIWORD(wParam) == BN_CLICKED)
    OnPshButtonClick();

           if (LOWORD(wParam) == ID_COMBO_1 && HIWORD(wParam) == CBN_SELCHANGE)
          OnComboBox1SelChange();

           if (LOWORD(wParam) == ID_COMBO_2 && HIWORD(wParam) == CBN_SELCHANGE)
             OnComboBox2SelChange();

        break;

        case WM_CREATE :
          hStatic = CreateWindow("static","Ad - Soyad :",
                                    WS_CHILD | WS_VISIBLE | SS_RIGHT,
                                    10,50,100,20,hWnd,(HMENU)ID_LABEL_1,
                                    ((LPCREATESTRUCT)lParam)->hInstance,NULL);

           hEdit1 = CreateWindow("edit","",
                                    WS_CHILD | WS_VISIBLE | ES_LEFT,
                                    120,50,200,20,hWnd,(HMENU)ID_EDIT_BOX_1,
                                    ((LPCREATESTRUCT)lParam)->hInstance,NULL);

           hStatic = CreateWindow("static","Şehir :",
                                       WS_CHILD | WS_VISIBLE | SS_RIGHT,
                                       10,100,100,20,hWnd,(HMENU)ID_LABEL_2,
                                       ((LPCREATESTRUCT)lParam)->hInstance,NULL);

           hCombo1 = CreateWindow("combobox","",
                                       WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WM_NOTIFY | CBS_DISABLENOSCROLL,
                                       120,100,200,100,hWnd,(HMENU)ID_COMBO_1,
                                       ((LPCREATESTRUCT)lParam)->hInstance,NULL);

           hEdit3 = CreateWindow("edit","",
                                    WS_CHILD | WS_VISIBLE | ES_CENTER,
                                    330,100,40,20,hWnd,(HMENU)ID_EDIT_BOX_3,
                                    ((LPCREATESTRUCT)lParam)->hInstance,NULL);

           FillComboBox1Elements();

           hStatic = CreateWindow("static","Numara :",
                                    WS_CHILD | WS_VISIBLE | SS_RIGHT,
                                    10,150,100,20,hWnd,(HMENU)ID_LABEL_3,
                                    ((LPCREATESTRUCT)lParam)->hInstance,NULL);

           hEdit2 = CreateWindow("edit","",
                                    WS_CHILD | WS_VISIBLE | ES_LEFT,
                                    120,150,200,20,hWnd,(HMENU)ID_EDIT_BOX_2,
                                    ((LPCREATESTRUCT)lParam)->hInstance,NULL);

           hPushButton = CreateWindow("button","Kaydet",
                                          WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
                                          150,270,100,20,hWnd,(HMENU)ID_PSH_BTN_1,
                                          ((LPCREATESTRUCT)lParam)->hInstance,NULL);

        ///*******************KAYIT GÖSTER***************************///

           hCombo2 = CreateWindow("combobox","",
                                       WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WM_NOTIFY | CBS_DISABLENOSCROLL,
                                       500,50,300,100,hWnd,(HMENU)ID_COMBO_2,
                                       ((LPCREATESTRUCT)lParam)->hInstance,NULL);

           FillComboBox2Elements();

              hStatic = CreateWindow("static","Ad - Soyad :",
                    WS_CHILD | WS_VISIBLE | SS_RIGHT,
                    500,90,80,20,hWnd,(HMENU)ID_LABEL_4,
                    ((LPCREATESTRUCT)lParam)->hInstance,NULL);

           hNameLabel = CreateWindow("static","-",
                             WS_CHILD | WS_VISIBLE | SS_CENTER,
                             600,90,200,20,hWnd,(HMENU)ID_NAME_LABEL,
                             ((LPCREATESTRUCT)lParam)->hInstance,NULL);

           hStatic = CreateWindow("static","Numara :",
                                       WS_CHILD | WS_VISIBLE | SS_RIGHT,
                                       500,130,80,20,hWnd,(HMENU)ID_LABEL_5,
                                       ((LPCREATESTRUCT)lParam)->hInstance,NULL);

           hNumberLabel = CreateWindow("static","-",
                                WS_CHILD | WS_VISIBLE | SS_CENTER,
                             600,130,200,20,hWnd,(HMENU)ID_NUMBER_LABEL,
                             ((LPCREATESTRUCT)lParam)->hInstance,NULL);

           ///***********************************************************///

       break;
       //...
    }
}

Pencere fonksiyonunda WM_CREATE mesajının alınması durumunda, uygulamaya ilişkin ana ekranda göstereceğimiz standart kontrolleri oluşturduk. WM_COMMAND mesajının alınması durumunda ise standart kontrollere ilişkin bilgi mesajlarının işlenmesi için çağrılmasını istediğimiz fonksiyonları belirttik. Devamı bi sonraki makalede..