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_AUTOHSCROLL |
Kullanı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_DISABLENOSCROLL |
Listeleme
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_DROPDOWN |
Aşağıya
açılan bileşik giriş kutusunu ifade eder. |
CBS_DROPDOWNLIST |
Aşağıya
açılan listeleme kutusunu ifade eder. |
CBS_HASSTRINGS |
Kulanı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_LOWERCASE |
Listeleme
kutusundaki ve seçim alanındaki yazıların harflerinin hepsini küçük harfe
çevirir. |
CBS_NOINTEGRALHEIGHT |
Kontrolün
boyutlarının, uygulama kontrolü oluşturduğunda kontrole uygulama tarafından
verilen boyutta olmasını sağlar. |
CBS_OEMCONVERT |
Kontrole
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_OWNERDRAWFIXED |
Kontrolü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_OWNERDRAWVARIABLE |
Kontrolü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_SIMPLE |
Basit
bileşik giriş kutusu kontrolünü ifade eder. |
CBS_SORT |
Listeye
eklenen elemanların otomatik olarak sıralanmasını sağlar. |
CBS_UPPERCASE |
Kontroldeki
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_CLOSEUP |
Aş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_DBLCLK |
Basit
bileşik giriş kutusunun bir elemanına fare ile çift tıklandığı zaman gönderilir.
|
CBN_DROPDOWN |
Aş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_EDITCHANGE |
Aş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_EDITUPDATE |
Aş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_ERRSPACE |
Bileşik
giriş kutusu, herhangi bir işlem için yeterli belleği tahsis edemediği zaman
gönderilir. |
CBN_KILLFOCUS |
Fare
odağı bileşik giriş kutusu kontrolünden ayrılacağı zaman gönderilir. |
CBN_SELCHANGE |
Geçerli
seçim değiştirildiği zaman gönderilir. |
CBN_SELENDCANCEL |
Aş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_SELENDOK |
Aş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_SETFOCUS |
Bileş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_ADDSTRING |
Kontrolü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_DELETESTRING |
Kontrolü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_DIR |
Listeleme
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_FINDSTRING |
Kontrolü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_FINDSTRINGEXACT |
Kontrolü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_GETCOUNT |
Kontrolü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_GETCURSEL |
Kontrolü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_GETDROPPEDSTATE |
Liste
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_GETDROPPEDWIDTH |
Listenin
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_GETEDITSEL |
Listenin
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_GETITEMDATA |
Kontrolü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_GETLBTEXT |
Kontrolü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_GETLBTEXTLEN |
Kontrolü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_GETTOPINDEX |
Kontrolü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_INSERTSTRING |
Kontrolü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_LIMITTEXT |
Kontrolü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_RESETCONTENT |
Kontrolü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_SELECTSTRING |
Kontrolü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_SETCURSEL |
Kontrolü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_SETDROPPEDWIDTH |
Listenin
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_SETEDITSEL |
Kontrolün
yazı kutusuna EM_SETSEL mesajı göndererek, kontroldeki yazının belirtilen
kısmının seçilmesini sağlar. |
CB_SETITEMDATA |
Kontrolü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_SETTOPINDEX |
Kontrolü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_SHOWDROPDOWN |
Aş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_CHAR |
Karakter
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_CLEAR |
Basit
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_COPY |
Basit
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_CUT |
Basit
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_DELETEITEM |
Bu
mesaj kontrolün ana penceresine iletilerek uygulamayı, listeden bir elemanın
silindiğine dair bilgilendirir. |
WM_PASTE |
Basit
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. Uygulamada iki tane aşağıya açılabilir
listeleme kutusu oluşturduk. Bu bileşik giriş kutularından ilkini kullanıcıya
şehir seçeneklerini sunmak için kullanacağız. Diğerini ise kullanıcının kaydettiği
kişi bilgilerini listelemek amacıyla kullanacağız. Standart kontrollerin oluşturulmasından
sonra FillComboBox1Elements ve FillComboBox2Elements isimli fonksiyonları çağırarak
bileşik giriş kutularımıza bazı elemanlar ekliyoruz. Şimdi bu fonksiyonların
tanımlamalarına bakarak nasıl bir işlem yapıldığını kavramaya çalışalım :
void FillComboBox1Elements()
{
ComboBox1SelectionControl = FALSE;
SendMessage(hCombo1,CB_ADDSTRING,0,"Istanbul
- Avrupa");
SendMessage(hCombo1,CB_ADDSTRING,0,"Istanbul
- Anadolu");
SendMessage(hCombo1,CB_ADDSTRING,0,"Izmir");
SendMessage(hCombo1,CB_ADDSTRING,0,"Ankara");
SendMessage(hCombo1,CB_ADDSTRING,0,"Denizli");
SendMessage(hCombo1,CB_ADDSTRING,0,"Bartin");
SendMessage(hCombo1,CB_SETITEMDATA,0,212);
SendMessage(hCombo1,CB_SETITEMDATA,1,216);
SendMessage(hCombo1,CB_SETITEMDATA,2,232);
SendMessage(hCombo1,CB_SETITEMDATA,3,312);
SendMessage(hCombo1,CB_SETITEMDATA,4,258);
SendMessage(hCombo1,CB_SETITEMDATA,5,378);
ComboBox1SelectionControl = TRUE;
}
void FillComboBox2Elements()
{
FILE *file = fopen("Numaralar.txt","r");
char name[30], number[14], *tmpRegion;
int selectedIndex = -1;
if (file == NULL)
return;
ComboBox2SelectionControl = FALSE;
while (fscanf(file,"%s %s",name,number)
!= EOF) {
tmpRegions[tmpRegionNumber++]
= (char *)malloc(10);
if (tmpRegions[tmpRegionNumber - 1] ==
NULL)
break;
strcpy(tmpRegions[tmpRegionNumber - 1],number);
selectedIndex
= SendMessage(hCombo2,CB_ADDSTRING,0,name);
SendMessage(hCombo2,CB_SETITEMDATA,selectedIndex,tmpRegions[tmpRegionNumber
- 1]);
}
tmpRegionNumber--;
ComboBox2SelectionControl = TRUE;
fclose(file);
}
|
FillComboBox1Elements
isimli fonksiyonda,
ilk bileşik giriş kutusu kontrolüne öncelikle kendi belirlediğimiz elemanları
ekledik. Ardından bu elemanlara ilişkin alan kodu bilgilerini atadık. Bileşik
giriş kutusu kontrolüne eleman eklemek için kontrole CB_ADDSTRING mesajını gönderdik.
Bu mesajı gönderirken wParam parametresine sıfır, lParam parametresine ise kontrole
eklenecek elemanın karakter katarı ifadesini geçtik. Bileşik giriş kutusu kontrolünün
elemanlarına veri atamak amacıyla, kontrole CB_SETITEMDATA mesajını gönderdik.
Bu mesajı gönderirken wParam parametresine verinin ilişkilendirileceği elemanın
sıra numarasını, lParam parametresine ise elemanla ilişkilendirilecek veriyi
geçtik. Kullanıcı kontrolden herhangi bir elemanı seçtiğinde, o elemana ilişkin
alan kodu bilgisini elemanın verisine erişmek suretiyle öğrenebileceğiz.
FillComboBox2Elements
isimli fonksiyonda
ise daha önceden kullanıcı tarafından girilmiş kayıtlarınv saklanacağı Numaralar.txt
isimli dosyayı açarak, bu dosyada yer alan elemanları sırasıyla kontrole ekledik.
Program ilk defa çalıştırıldığında böyle bir dosya olmayacağı için, başlangıçta
bileşik giriş kutusu kontrolümüzün hiç elemanı olmayacaktır. Ancak daha önce
uygulama çalıştırılmış ve kayıt girilmişse, bu kayıtları dosyadan okuyarak kontrolüme
ekledik. İkinci bileşik giriş kutusu kontrolümüze, daha önce oluşturulmuş olan
kayıtlara ilişkin kişi adı bilgilerini eleman olarak ekledik. Bunu niçin kontrole
CB_ADDSTRING mesajını gönderdik. Ardından, eklenen elemanlarla, kişiye ait telefon
numarası bilgisini eşleştirdik. Kontrolün elemanlarının numara bilgisiyle eşleştirilmesi
sırasında dinamik bellek tahsisatı yaptık. Uygulama sonlanırken ayırdığımız
bu alanları serbest bırakmak için, tahsis ettiğimiz adresleri global bir dizide
sakladık. Kontrole eleman eklenmeden önce ComboBox2SelectionControl değişkenine
FALSE değerini, eleman ekleme işleminin ardından ise TRUE değerini ekledik.
Bu işlemi yapmamızın amacı, uygulama ilk çalıştırıldığında kontrole eleman eklenmesi
sırasında, kontrolün SelChange olayının çalışmasına engel olmaktır. Kontrolün
SelChange isimli olayı gerçekleştiğinde çağırdığımız fonksiyonda, bu değişkenin
değerini kontrol edeceğiz.
void ClearForm()
{
SetWindowText(hEdit1,"");
SendMessage(hCombo1,CB_SETCURSEL,-1,0);
SetWindowText(hEdit2,"");
} |
ClearForm isimli
fonksiyonda, formumuz üzerinde kullanıcının bilgi girmesi amacıyla oluşturduğumuz
kontrollerin içeriklerini temizleyerek ekranı yeni bir kayda hazır hale getiriyoruz.
Bu amalçla veri girişi amacıyla kullanılacak kişi adı ve telefon numarası kontrollerinin
içeriğine, SetWindowText API fonksiyonu ile boş bir karakter katarı ifadesi
atadık. Şehir seçimi amacıyla oluşturulmuş bileşik giriş kutusu kontrolünde
hiçbir elemanın seçili olmamasını sağlayabilmek için, kontrole CB_SETCURSEL
mesajını -1 wParam parametresi değeri ile yolladık. Bu fonksiyonu çağrılmasının
ardından formumuz yeni bir kayda hazır hale gelmiştir.
Kulanıcı ilk bileşik giriş kutusu kotnrolünde listelenen elemanlardan birisini seçtiğinde (kontrolün seçim değişimi olayında) çalışmasını istediğimiz fonksiyonu, pencere fonksiyonunun WM_COMMAND mesajını işlediği durumda çağırmıştık. Bu fonksiyonda, seçilen şehre ilişkin alan kodu numarasını, kontrolün hemen yanında bulunan yazı kutusu kontrolünde göstereceğiz. Alan kodu bilgisini, kontrolün elemanları ile eşleştirmiştik. Şimdi bu fonksiyonu inceleyelim :
void OnComboBox1SelChange()
{
char areaCodeStr[5];
int selectedIndex = -1;
int areaCode = -1;
if (!ComboBox1SelectionControl)
return;
selectedIndex = SendMessage(hCombo1,CB_GETCURSEL,0,0); //Seçili şehrin indeksi
if (selectedIndex < 0)
return;
areaCode = SendMessage(hCombo1,CB_GETITEMDATA,selectedIndex,0); //Seçili şehrin datasına atanmış alan kodu bilgisi integer
itoa(areaCode,areaCodeStr,10);
SetWindowText(hEdit3,areaCodeStr);
}
|
Fonksiyonun hemen başında ComboBox1SelectionControl değişkeninin değerini kontrol ederek, değişkenin FALSE değerine sahip olması durumunda fonksiyondan çıkılmasını sağladık. Bu şekilde, fonksiyonun bazı durumlarda çalışmasını bazı durumlarda çalışmamasını sağladık. Örneğin kontrol ilk oluşturulduğunda ve kodlama yolu ile kontrole eleman eklendiğinde, bu fonksiyonun çalışmaması gereklidir. Fonksiyon sadece kullanıcı seçili olan elemanı değiştirdiğinde veya bir eleman seçimi yaptığında çalışmalıdır. Bu amaçla kontrole eleman eklenmesi sırasında ComboBox1SelectionControl deişkenine FALSE değerini ve eleman ekleme işleminin bitmesinin ardından değişkene TRUE değerini atamıştık. Bu şekilde fonksiyonun çalışmasını kontrol etmiş olduk. Diğer adımlarda yapılan işlemlere bakacak olursak, öncelikle kontrolün seçili olan elemanının sıra numarasını öğrenmek amacıyla kontrole CB_GETCURSEL mesajını gönderdik. Eğer geri dönen değer sıfırdan küçük bir değer ise, herhangi bir eleman seçilmemiştir, bu durumda fonksiyonu sonlandırdık. Eğer kontrolün bir elemanı seçilmiş durumda ise, bu defa kontrole CB_GETITEMDATA mesajını, seçili olan elemanın sıra numarası değerini wParam parametresi olarak vererek gönderdik. Bu mesaj bize, seçili olan eleman ile ilişkilendirilmiş veriyi döndürecektir. Bu değer de, kullanıcının seçmiş olduğu şehre ilişkin alan kodu bilgisidir. Bu bilgiyi areaCode isimli integer türünden değişkende sakladık. Daha sonra bu bilgiyi yazı kutusu kontrolünde gösterebilmek amacıyla itoa fonksiyonu ile karakter katarına dönüştürdük. Ardından SetWindowText API fonksiyonu ile yazı kutusu kontrolünde bu karakter katarının görüntülenmesini sağladık. Artık kullanıcı kontrolde listelenen elemanlardan herhangi birisini seçtiği zaman, bu elemana ilişkin veri yazı kutusu kontrolünde gösterilecektir. Aşağıdaki şekilde bu durum gösterilmiştir :
Kullanıcı gerekli bilgileri girdikten sonra Kaydet düğmesine bastığında, girilen bilgileri hem bir dosyaya kaydedeceğiz, hem de ikinci bileşik griş kutusu kontrolüne ekleyeceğiz. Kullanıcı düğme kontrolüne bastığında OnPshButtonClick fonksiyonunun çalışmasını istediğimizi, pencere fonksiyonunun WM_COMMAND mesajını işlediği durumda bildirmiştik. Bu fonksiyonu incelemeden önce, fonksiyondan çağırdığımız CreatePersonPhone ve WritePersonPhone fonskiyonlarına bakalım :
PersonPhone *CreatePersonPhone(char *name,char *number)
{
PersonPhone *person = (PersonPhone *)malloc(sizeof(PersonPhone) * 1);
strcpy(person->name,name);
strcpy(person->number,number);
return person;
}
BOOL WritePersonPhone(const char *fileName,const PersonPhone *person)
{
FILE *file = fopen(fileName,"a+");
if (file == NULL)
return FALSE;
fputc(\n,file);
fprintf(file,"%s %s",person->name,person->number);
fclose(file);
return TRUE;
}
|
CreatePersonPhone fonksiyonu, PersonPhone türünden dinamik bir nesne oluşturarak parametre olarak geçilen isim ve numara bilgilerini, bu nesnenin veri elemanlarına atamaktadır. WritePersonRecord fonksiyonu, parametre olarak geçilen person adresindeki kişi bilgilerini, name parametresiyle bir dosya açarak o dosyaya yazmaktadır. Şimdi kayıt işleminin nasıl yapıldığını inceleyelim :
void OnPshButtonClick()
{
PersonPhone *person;
int areaCode = 0, selectedIndex = -1;
char _number[8], number[12];
const char *seperator = "-";
const char fName[] = "Numaralar.txt";
char name[40];
selectedIndex = SendMessage(hCombo1,CB_GETCURSEL,0,0); //Seçili elemanın sıra numarası
areaCode = SendMessage(hCombo1,CB_GETITEMDATA,selectedIndex,0); //Seçili elemanla ilişkilendirilmiş veri
GetWindowText(hEdit2,_number,8); //Girilen telefon numarası Karakter katarı ---------------- _number = 2222222*
itoa(areaCode,number,10); //Seçili elemanla ilişkilendirilmiş veri karakter katarı -- number = 212*
strcat(number,seperator); //Karakter katarları birbirine ekleniyor ------------------ number = 212-*
strcat(number,_number); //Kişiye ilişkin numaranın saklanacak hali ---------------- number = 212-2222222*
//Bilgileri dosyaya yaz
GetWindowText(hEdit1,name,40);
person = CreatePersonPhone(name,number);
WritePersonPhone(fName,person);
//İkinci bileşik giriş kutusu kontrolüne yeni kaydı ve bilgisini ekle
ComboBox2SelectionControl = FALSE;
selectedIndex = SendMessage(hCombo2,CB_ADDSTRING,0,person->name);
SendMessage(hCombo2,CB_SETITEMDATA,selectedIndex,person->number);
ClearForm();
ComboBox2SelectionControl = TRUE;
}
|
Kayıt işleminin ilk adımında, kişiye ilişkin isim ve numara bilgilerini form üzerindeki alanlardan alarak bir yapı nesnesinde saklamak istiyoruz. Numarayı, kullanıcının gireceği yedi haneli numara bilgisinin başına, yine kullanıcı tarafından seçilecek şehre ilişkin alan kodu bilgisini ekleyerek oluşturacağız. Bu amaçla öncelikle şehirleri listeleyen bileşik giriş kutusu kontrolünde seçili olan elemanın sıra numarasını, kontrole CB_GETCURSEL mesajını göndererek öğrendik. Daha sonra bu sıra numarasında yer alan eleman ile eşleştirilmiş veriyi öğrenebilmek amacıyla kontrole CB_GETITEMDATA mesajını gönderdik. Kullanıcının yazı kutusu kontrolüne girmiş olduğu numara bilgisinin başına, alan kodu bilgisini strcat fonksiyonu ile ekledik. Şimdi elimizde 11 haneli telefon numarası bilgisi bulunmaktadır. CreatePersonPhone fonksiyonunu, isim ve numara değerlerini parametre değişkeni olarak geçerek çağırdık ve bir Person Phone göstericisi elde ettik. WritePersonPhone isimli fonksiyona bu göstericiyi ve kullanmak istediğimiz dosyanın adını parametre olarak geçerek kayıt işlemini gerçekleştirmiş olduk. Kayıt işleminin ardından ikinci bileşik giriş kutusu kontrolüne CB_ADDSTRING mesajı göndererek, yeni yapılmş kayıt bilgisini ekledik ve CB_SETITEMDATA mesajı göndererek bu kayda ilişkin numara bilgisini eşleştirdik. Bu işlemlerin ardından ClearForm fonksiyonunu çağırarak formdaki alanları temizledik ve formu yeni bir kayda hazır hale getirdik. Burada ComboBox2SelectionControl değişkenine sırasıyla FALSE ve TRUE değerlerini atayarak, kontrolün SelChange olayını kontrol ettiğimize dikkat edelim.
Son adım olarak, ikinci bileşik giriş kutusu kontrolünde yapılacak seçim işlemine göre kullancıya kaydı gösterme işlemini gerçekleştireceğiz. Bu işlem, OnComboBox2SelChange fonksiyonunda yapılmaktadır. Şimdi bu fonksiyonu inceleyelim :
void OnComboBox2SelChange()
{
int selectedIndex = -1;
char name[30], number[11];
if (!ComboBox2SelectionControl)
return;
selectedIndex = SendMessage(hCombo2,CB_GETCURSEL,0,0);
if (selectedIndex < 0)
return;
SendMessage(hCombo2,CB_GETLBTEXT,selectedIndex,name);
SetWindowText(hNameLabel,name);
strcpy(number,SendMessage(hCombo2,CB_GETITEMDATA,selectedIndex,0));
SetWindowText(hNumberLabel,number);
}
|
Bu fonksiyon ikinci bileşik giriş kutusu kontrolünde yapılan seçime göre, kayıt bilgilerini kullanıcıya göstermektedir. (Ayrıca uygulamanın yüklenmesi sırasında daha önce oluşturulmuş kayıtlar da bu kontrol de listelenmektedir.) Bu amaçla öncelikle kontrolde seçili olan elemanın sıra numarasını öğrendik, ardından bu elemanla ilişkilendirilmiş veriyi alarak kontrolün altında yer alan statik kontrollere bu bilgileri atadık. Artık bileşik giriş kutusu kontrolünde eleman seçimi işlemi yapıldıkça ilgili bilgiler, statik kontrollerde listelenmektedir.
Uygulamanın çalışır hali aşağıda görülmektedir :
Uygulamayı buradan indirebilirsiniz. Bileşik giriş kutusu kontrolü yazımızın da sonuna geldik. Yeni yazımızda görüşmek üzere tüm okuyucularıma iyi günler dilerim.
Makale:
Windows API - Bileşik Giriş Kutusu Kontrolünün Oluşturulması ve Kullanımı C ve Sistem Programlama Çiğdem Çavdaroğlu
|