C#nedir?com
 
YAZAR HAKKINDA
Çiğdem Çavdaroğlu
Çiğdem Çavdaroğlu
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
28 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: asagiya belirtir. bilesik eleman elemanin iliskin karakter kontrole kutusu kutusuna listeleme lparam mesaji parametresi wparam C / Sys Prog. Çiğdem Çavdaroğlu
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : İleri
Kategori : C / Sys Prog.
Yayınlanma Tarihi : 12.10.2006
Okunma Sayısı : 21043
Yorum Sayısı : 1     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
XML - Deniz Kılınç
emre TAŞ
yazının devamı >
emre TAŞ
Decompiling and Reverse Engineering .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Masaüstü mü ? İnternet Mi? .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
.Net Kavramları - .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Yeni Başlayanlar için - .Net Radyo
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Burak Selim Şenyurt
.NET Core 2.0 ile Basit Bir Web API Geliştirmek 18.10.2017
Burak Selim Şenyurt
Python - Flask ile Basit Bir Web Uygulaması Geliştirmek 18.10.2017
Turhal Temizer 'in Blogu
ChatBot UI Sample 18.10.2017
Turhal Temizer 'in Blogu
C# – IRR Function 18.10.2017
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Windows API - Bileşik Giriş Kutusu Kontrolünün Oluşturulması ve Kullanımı
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
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
  • Yazılan Yorumlar
  • Yorum Yaz
ARA
3
2006
çok güzel yazılar yazıyorsunuz.Önemli bir eksiği kapatıyorsunuz.Dört gözle diğer yazılarınızı bekliyorum.Ayrıca Win32 ile ilgili internette daha fazla kaynak nerde bulabilirim acaba
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor