Bu yazımızda, List
Box adı ile bilinen listeleme kutusu standart kontrolünü, kontrolün API fonksiyonları
ile oluşturulmasını, kontrolden alınan mesajların işlenmesini ve kontrole nasıl
mesaj gönderileceğini inceleyeceğiz. Listeleme kutusu, kullanıcı tarafından
seçilebilen liste elemanlarını gösteren bir kontroldür. Liste elemanları kontrol
içerisinde, elemana ilişkin bir isim ve elemana ilişkin bir bitmap görüntüsü
ile gösterilir. Kontrolün görünümü şöyledir :
Liste elemanları,
kontrole sığmadığında kontrolün sağ tarafında bir kaydırma çubuğu görüntülenir.
(Liste elemanlarının kontrole sığıp sığmadığı programcı tarafından kontrol edilerek
kontrolün yüksekliği kodlama yoluyla da değiştirilebilir.) Kullanıcı listeden
bir eleman seçtiğinde, seçili olan elemanın görünümü değiştirilir. Yukarıdaki
şekilde solda yer alan listeleme kutusunda ilk liste elemanı, sağda yer alan
listeleme kutusunda dördüncü eleman kullanıcı tarafından seçilmiştir. Seçili
olan elemanların arka plan renkleri mavi yapılarak seçili oldukları belirtilmiştir.
Kullanıcı listeleme kutusunda bir liste elemanı seçtiğinde veya var olan bir
seçimi sonlandırdığında kontrolün ana penceresine sistem tarafından bir bilgi
mesajı iletilir.
Win32 sistemlerinde
iki çeşit listeleme kutusu kontrolü bulunmaktadır. İlki tek-seçimli listeleme
kutusu (single-selection list box) kontrolü, diğeri ise çoklu-seçimli listeleme
kutusu (multiple-selection list box) kontrolüdür. Tek-seçimli listeleme kutusunda
kullanıcı aynı anda sadece bir tane liste elemanını seçebilirken, çoklu-seçimli
listeleme kutusunda aynı anda birden fazla liste elemanını seçili konuma getirebilir.
Kontrolün hangi biçimde olacağı, kontrolün oluşturulması sırasında CreateWindow
fonksiyonunda pencere biçimi parametresinde özel sembolik sabitler kullanılarak
belirtilir. Ayrıca liste elemanlarının sıralanmasını, listeleme kutusunda birden
fazla sütun bulunmasını sağlayan özel sembolik sabitler de bulunmaktadır. Bu
sembolik sabitlerin hepsini bu yazıda ele alacağız ve yapacağımız uygulama içerisinde
kullanacağız.
Listeleme kutusu
yaratılırken CreateWindow ya da CreateWindowEx fonkiyonuna, pencere biçimi
parametresi olarak geçilen pencere sınıf ismi listbox dır. Bu kontrol yaratılırken,
fonksiyonun pencere başlığı parametresi kullanılmaz. Kontrole ilişkin özel pencere
biçimlerini inceleyelim :
Listeleme
Kutusu Kontrolüne İlişkin Pencere Biçimleri
LİSTELEME
KUTUSU KONTROLÜ PENCERE BİÇİMİ SEMBOLİK SABİT İSMİ
|
ANLAMI
|
LBS_DISABLENOSCROLL |
Bu pencere biçimi seçildiğinde, kontrolün liste elemanları, kontrole sığıyor
olsa bile, kontrolün sağ tarafında bir kaydırma çubuğu görüntülenir. Eğer
kontrol bu biçime sahip değilse, liste elemanları kontrole sığdığı takdirde
kaydırma çubuğu gösterilmez. |
LBS_EXTENDEDSEL |
Birden
fazla liste elemanının aynı anda seçilebilmesini sağlar. Eleman, SHIFT tuşu
basılı tutularak fare ile üzerine tıklanması yoluyla veya başka bir tuş
kombinasyonu ile seçilebilir. |
LBS_HASSTRINGS |
Liste
elemanlarının karakter katarı olduğunu belirtir. Bu durumda, kontrol tarafından
liste elemanları için otomatik olarak bellek bölgesi tahsis edilir. Kullanıcı-tanımlı
listeleme kutusu kontrolleri haricindeki tüm listeleme kutuları bu özelliğe
sahiptirler. |
LBS_MULTICOLUMN |
Kontrolün
birden fazla sayıda sütununun olmasını sağlar. Sütunların genişliği kontrolün
genişliğini aştığında, kontrolün alt kısmında yatay bir kaydırma çubuğu
görüntülenir. Sütun genişlikleri kontrole mesaj gönderilerek değiştirilebilir.
|
LBS_MULTIPLESEL |
Birden
fazla liste elemanının aynı anda seçilebilmesini sağlar. Elemanın seçilebilmesi
için sadece fare ile üzerine tıklanması yeterlidir. |
LBS_NOREDRAW |
Kontrolle
ilgili herhangi bir değişiklik yapıldığında, kontrolün çalışma anındaki
görüntüsünün değiştirilmemesini sağlar. |
LBS_NOSEL |
Liste
elemanlarının seçilememesini sağlar. |
LBS_NOTIFY |
Kullanıcı
liste elemanlarından birisine fare ile tıkladığında kontrolün ana penceresine
bilgi mesajı iletilmesini sağlar. |
LBS_OWNERDRAWFIXED |
Kontrolü
içeren pencerenin, kontrolün çiziminden sorumlu olduğunu ve kontrolün liste
elemanlarının yüksekliğinin birbirine eşit olduğunu belirtir. Kontrolü içeren
pencere, kontrol oluşturulduğunda WM_MEASUREITEM mesajını, kontrolün görsel
özellikleri değiştirildiğinde WM_DRAWITEM mesajını alır. |
LBS_OWNERDRAWVARIABLE |
Kontrolü
içeren pencerenin, kontrolün çiziminden sorumlu olduğunu ve kontrolün liste
elemanlarının yüksekliğinin birbirinden farklı olabileceğini belirtir. Kontrolü
içeren pencere, kontrol oluşturulduğunda her liste elemanı için bir WM_MEASUREITEM
mesajı, kontrolün görsel özellikleri değiştirildiğinde WM_DRAWITEM mesajını
alır. |
LBS_SORT |
Liste
elemanlarının isimlerine göre alfabetik sıraya dizilmesini sağlar. |
LBS_STANDARD |
Liste
elemanlarının isimlerine göre alfabetik sıraya dizilmesini sağlar. Kullanıcı
liste elemanlarının isimlerine fare ile tek veya çift tıkladığında, kontrolün
ana penceresine mesaj iletilir. Bu pencere biçimi ile yaratılan listeleme
kutusu bir çerçeveye sahip olarak görüntülenir. |
LBS_USETABSTOPS |
Listeleme
kutusunun, liste elemanlarına sekme işleminin uygulanmasını sağlar. |
LBS_WANTKEYBOARDINPUT |
Klavyeden
listeleme kutusuna odaklanıldığında ve kullanıcı bir tuşa bastığında, listeleme
kutusunu içeren pencereye WM_VKEYTOITEM mesajı iletilmesini sağlar. Böylece
klavyeden herhangi bir tuşa basıldığında, listeleme kutusu kontrolünde özel
bazı işlemlerin yapılması mümkün olur. |
Listeleme
Kutusu Kontrolüne İlişkin Özel Fonksiyonlar
Win32 sistemlerinde,
listeleme kutusu kontrolü için özel olarak oluşturulmuş iki API fonksiyonu bulunmaktadır.
Bu fonksiyonlar, DlgDirList ve DlgDirSelectEx fonksiyonlarıdır. DlgDirList
fonksiyonu, belirtilen adresteki dosya ve dizin isimlerinin liste elemanı olarak
kontrole doldurulmasını sağlar. DlgDirSelectEx fonksiyonu ise DlgDirList fonksiyonu
ile oluşturulmuş bir listeleme kutusunun o an seçili halde bulunan elemanının
alınmasını sağlar. Bu fonksiyonlar sayesinde, kullanıcı bir dosyanın dizin adresini
veya ismini yazmaksızın, dosyayı seçebilir.
Listeleme
Kutusu Kontrolünün Gönderdiği Bilgi Mesajları
Listeleme kutusu
belirli olaylar gerçekleştiğinde, kendisini içeren pencerenin pencere fonksiyonuna,
gerçekleşen olayı tanımlayan bazı bilgi mesajları iletmektedir. Bu bilgi mesajları,
kullanıcı liste elemanlarından birisini seçtiğinde, liste elemanlarından birisine
fare ile çift tıkladığında, bir liste elemanının seçili halini sonlandırdığında,
klavyeden kontrole odaklanıldığında veya klavye odağı kaybedildiğinde veya kontrol
ihtiyacı olan bellek bölgesini tahsis edemediğinde iletilir. Bilgi mesajları,
wParam parametresinin düşük anlamlı WORD değeri kontrolün tanımlayıcı değerini;
yüksek anlamlı WORD değeri bilgi mesajını belirten, lParam parametresi ise kontrolün
tutamaç değerini belirten WM_COMMAND mesajları olarak iletilir.
LİSTELEME
KUTUSU KONTROLÜNÜN GÖNDERDİĞİ MESAJ
|
ANLAMI
|
LBN_DBLCLK |
Kullanıcı
liste elemanlarından birisine fareile çift tıkladığı zaman gönderilir. |
LBN_ERRSPACE |
Kullanıcı
yeterli bellek bölgesini tahsis edemediği zaman gönderilir. |
LBN_KILLFOCUS |
Klavye
odağı kaybedildiğinde gönderilir. |
LBN_SELCANCEL |
Kullanıcı
seçili olan bir liste elemanının seçili halini sonlandırdığında gönderilir.
|
LBN_SELCHANGE |
Kontroldeki
seçili olan liste elemanı değiştirileceği zaman gönderilir. |
LBN_SETFOCUS |
Klavye
odağı kontrole yönlendirildiğinde gönderilir. |
Listeleme
Kutusu Kontrolüne Gönderilen Mesajlar
Listeleme kutusuna
yeni liste elemanları eklemek, var olan bir liste elemanını silmek veya değiştirmek,
liste elemanlarını sorgulamak için ana pencereden mesajlar iletilir. Örnek olarak,
listeleme kutusuna yeni bir liste elemanı eklemek için kontrole LB_ADDSTRING
mesajı, bir liste elemanının seçili olup olmadığını sorgulamak için LB_GETSEL
mesajı iletilir. Listeleme kutusu kontrolüne gönderilen diğer mesajlar, kontrolün
boyutlarını, görünümünü ve davranışını değiştirir. Örnek olarak, kontrole yatay
bir kaydırma çubuğu eklemek için, LB_SETHORIZONTALEXTENT mesajı iletilir. Listeleme
kutusu kontrolüne mesaj iletmek için SendMessage veya SendDlgItemMessage
fonksiyonları kullanılır. Listeleme kutusu kontrolünün liste elemanları birer
sıra numarasına sahiptirler. Bu sıra numaraları sıfırdan başlar.
LİSTELEME
KUTUSU KONTROLÜNE GÖNDERİLEN MESAJ
|
ANLAMI
|
LB_ADDFILE |
DlgDirList
fonksiyonu ile doldurulmuş bir dizin listeleme kutusuna bir dosya ekler
ve eklenen dosyanın sıra numarasını döndürür. Mesajın wParam parametresi
olarak sıfır verilir, lParam parametresi olarak kontrole eklenecek dosyanın
ismi verilir. |
LB_ADDSTRING |
Listeleme
kutusuna bir karakter katarı ekler ve eklenen elemanın sıra numarasını döndürür.
Kontrol LBS_SORT pencere biçimine sahip ise, karakter katarı sıralamaya
uygun bir şekilde eklenir. Diğer durumlarda listenin sonuna eklenir. Mesajın
wParam parametresi olarak sıfır verilir, lParam parametresi olarak listeye
eklenecek karakter katarının adresi verilir. |
LB_DELETESTRING |
Listeleme
kutusundaki bir karakter katarını siler ve listede geri kalan toplam eleman
sayısını döndürür. Mesajın wParam parametresi olarak silinecek karakter
katarının sıra numarası verilir, lParam parametresi olarak sıfır verilir.
|
LB_DIR |
Listeleme
kutusuna bir dosya dizisinde yer alan dosya isimlerini ekler ve eklenen
son dosya adının sıra numarasını döndürür. Mesajın wParam parametresi olarak
dosya özellikleri verilir, lParam parametresi olarak dosya adının adresi
verilir. wParam parametresine geçilebilecek sembolik sabitler ve anlamları
şunlardır :
    - DDL_ARCHIVE : Arşiv dosyalarının eklenmesi için kullanılır.
    - DDL_DIRECTORY : Alt dizinlerin eklenmesi için kullanılır.
Alt dizin isimleri köşeli parantezler ([]) içerisinde belirtilir.
    - DDL_DRIVES : Sürücü isimlerinin eklenmesi için kullanılır.
Sürücü isimleri [-a-] şeklinde belirtilir.
    - DDL_EXCLUSIVE : Sadece belirtilen özelliklere sahip dosyaların
eklenmesi için kullanılır.
    - DDL_HIDDEN : Gizli dosyaların eklenmesi için kullanılır.
    - DDL_READONLY : Sadece-okunur dosyaların eklenmesi için
kullanılır.
    - DDL_READWRITE : Okunabilir-yazılabilir dosyaların eklenmesi
için kullanılır.
    - DDL_SYSTEM : Sistem dosyalarının eklenmesi için kullanılır.
|
LB_FINDSTRING |
İsmi,
verilen karakter katarı ile başlayan ilk liste elemanını bulur ve bu elemanın
sıra numarasını döndürür. Mesajın wParam parametresi olarak aramanın başlatılacağı
liste elemanından bir önceki liste elemanı verilir, lParam parametresi olarak
aranacak karakter katarının adresi verilir. |
LB_FINDSTRINGEXACT |
İsmi,
verilen karakter katarı ile tamamen uyuşan ilk liste elemanını bulur ve
bu elemanın sıra numarasını döndürür. Mesajın wParam parametresi olarak
aramanın başlatılacağı liste elemanından bir önceki liste elemanı verilir,
lParam parametresi olarak aranacak karakter katarının adresi verilir. |
LB_GETANCHORINDEX |
Fare
ile seçilen liste elemanını bulur ve bu elemanın sıra numarasını döndürür.
Mesajın wParam ve lParam parametreleri sıfır verilir. |
LB_GETCARETINDEX |
Listeleme
kutusunda o an odaklanılan liste elemanını bulur ve bu elemanın sıra numarasını
döndürür. Mesajın wParam ve lParam parametreleri sıfır verilir. |
LB_GETCOUNT |
Listeleme
kutusunun toplam liste elemanı sayısını döndürür. Mesajın wParam ve lParam
parametreleri sıfır verilir. |
LB_GETCURSEL |
Listeleme
kutusunda o an seçili halde bulunan liste elemanını bularak bu elemanın
sıra numarasını döndürür. Mesajın wParam ve lParam parametreleri sıfır verilir. |
LB_GETHORIZONTALEXTENT |
Listeleme
kutusunun kaydırılabilir genişliğinin piksel cinsinden değerini döndürür.
Mesajın wParam ve lParam parametreleri sıfır verilir. |
LB_GETITEMDATA |
Listeleme
kutusunun belli bir liste elemanına ilişkin bilgiyi döndürür. Mesajın wParam
parametresi olarak liste elemanının sıra numarası verilir, lParam parametresi
olarak sıfır verilir. |
LB_GETITEMHEIGHT |
Listeleme
kutusunun belli bir elemanının piksel cinsinden yükseklik değerini döndürür.
Mesajın wParam parametresi olarak liste elemanının sıra numarası verilir,
lParam parametresi olarak sıfır verilir. |
LB_GETITEMRECT |
Kontrolün
ekran üzerindeki koordinatlarını döndürür. Mesajın wParam parametresi olarak
liste elemanının sıra numarası verilir, lParam parametresi olarak koordinat
değerlerinin atanacağı yapı nesnesinin adresi verilir. |
LB_GETLOCALE |
Kontrole
ilişkin bölgesel bilgiyi döndürür. Geri dönüş değerinin yüksek anlamlı WORD
değeri ülke kodunu, düşük anlamlı WORD değeri dil tanımlayıcısı değerini
ifade eder. Mesajın wParam ve lParam parametreleri sıfır verilir. |
LB_GETSEL |
Listeleme
kutusunun seçim durumuna ilişkin bilgi döndürür. Mesajın wParam parametresi
olarak sıra numarası değeri verilir, lParam parametresi olarak sıfır verilir. |
LB_GETSELCOUNT |
Çok-seçimli
bir listeleme kutusu kontrolü için, o an seçili olan toplam eleman sayısını
döndürür. Mesajın wParam ve lParam parametreleri olarak sıfır verilir. |
LB_GETSELITEMS |
Çok-seçimli
bir listeleme kutusu kontrolü için, o an seçili olan elemanların sıra numaralarını
içeren bir dizi oluşturur ve toplam seçili eleman sayısını döndürür. Mesajın
wParam parametresi olarak dizinin eleman sayısı verilir, lParam parametresi
olarak dizinin adresi verilir. |
LB_GETTEXT |
Listeleme
kutusunun belli bir elemanına ilişkin isim bilgisini döndürür. Mesajın wParam
parametresi olarak elemanın sıra numarası verilir, lParam parametresi olarak
tampon bölgenin adresi verilir. |
LB_GETTEXTLEN |
Listeleme
kutusunun belli bir elemanına ilişkin isim bilgisinin karakter uzunluğunu
döndürür. Mesajı n wParam parametresi olarak elemanın sıra numarası verilir,
lParam parametresi olarak sıfır verilir. |
LB_GETTOPINDEX |
Listeleme
kutusunun görünen ilk elemanının sıra numarasını döndürür. Mesajın wParam
ve lParam parametreleri olarak sıfır verilir. |
LB_INITSTORAGE |
Belli
bir sayıda liste elemanı ve bu elemanlara ilişkin isim bilgileri için bellek
tahsis eder. Mesajın wParam parametresi olarak eklenecek eleman sayısı verilir,
lParam parametresi olarak tahsis edilecek bellek bölgesinin byte cinsinden
değeri verilir. |
LB_INSERTSTRING |
Listeleme
kutusuna, belirtilen sıra numarasına sahip bir karakter katarı ekler. Mesajın
wParam parametresi olarak elemanın sıra numarası verilir, lParam parametresi
olarak liste elemanının sıra numarası verilir, lParam parametresi olarak
eklenecek karakter katarının adresi verilir. |
LB_ITEMFROMPOINT |
Listeleme
kutusunun belirtilen koordinatlara en yakın konumda bulunan elemanının
sıra numarasını döndürür. Mesajın wParam parametresi olarak sıfır verilir,
lParam parametresi olarak noktanın koordinatları verilir.
|
LB_RESETCONTENT |
Listeleme
kutusunun tüm elemanlarını silerek listeyi sıfırlar. Mesajın wParam ve lParam
parametreleri sıfır verilir. |
LB_SELECTSTRING |
İsmi
verilen karakter katarı ile başlayan ilk liste elemanını seçili konuma getirir.
Mesajın wParam parametresi olarak aramanın başlatılacağı elemandan bir önceki
elemanın sıra numarası verilir, lParam parametresi olarak aranacak karakter
katarının adresi verilir. |
LB_SELITEMRANGE |
Sıra
numarası verilen liste elemanlarını seçili konuma getirir. Mesajın wParam
parametresi olarak seçim durumunu belirten bir değer verilir, lParam parametresi
olarak ilk ve son sıra numaraları verilir. |
LB_SELITEMRANGEEX |
Sıra
numarası verilen liste elemanlarını seçili konuma getirir. Verilen aralık
değerlerinin ilki, diğerinden daha büyükse seçim işlemi yapılmaz. mesajın
wParam parametresi olarak ilk sıra numarası, lParam parametresi olarak son
sıra numarası verilir. |
LB_SETANCHORINDEX |
Çok seçimli
listeleme kutusunda, seçimin başlatılacağı liste elemanının sıra numarasını
belirler. Mesajın wParam parametresi olarak sıra numarası değeri verilir,
lParam parametresi olarak sıfır verilir.
|
LB_SETCARETINDEX |
Sıra
numarası verilen liste elemanına odaklanılmasını sağlar. Mesajın wParam
parametresi olarak sıra numarası değeri verilir, lParam parametresi olarak
kontrole kaydırma işleminin uygulanıp uygulanmayacağını belirten mantıksal
bir değer verilir. Eğer FALSE değeri verilirse ilgili eleman kontrol içerisinde
tamamen görünür hale gelene dek kaydırma işlemi uygulanır, TRUE değeri verilirse
elemanın kontrol içerisinde bir kısmı görünür hale gelene dek kaydırma işlemi
uygulanır. |
LB_SETCOLUMNWIDTH |
Listeleme
kutusunun tüm kolonlarına piksel cinsinden genişlik değeri atar. Mesajın
wParam parametresi olarak piksel cinsinden genişlik değeri verilir, lParam
parametresi olarak sıfır verilir. |
LB_SETCOUNT |
Listeleme
kutusunun kaç tane elemanı olacağını belirler. Mesajın wParam parametresi
olarak listeleme kutusunun eleman sayısı verilir, lParam parametresi olarak
sıfır verilir. |
LB_SETCURSEL |
Belirtilen
elemanı seçili hale getirir. Mesajın wParam parametresi olarak sıra numarası
değeri verilir, lParam parametresi olarak sıfır verilir. |
LB_SETHORIZONTALEXTENT |
Listeleme
kutusunun kaydırılabilir genişliğinin piksel cinsinden değerini ayarlar.
Mesajın wParam parametresi olarak yatay kaydırma genişliği değeri verilir,
lParam parametresi olarak sıfır verilir. |
LB_SETITEMDATA |
Verilen
liste elemanına, verilen bilgiyi atar. Mesajın wParam parametresi olarak
sıra numarası değeri verilir, lParam parametresi olarak elemana atanacak
bilgi verilir. |
LB_SETITEMHEIGHT |
Listeleme
kutusunun liste elemanlarına piksel cinsinden yükseklik değeri atar. Mesajın
wParam parametresi olarak sıra numarası değeri verilir, lParam parametresi
olarak yükseklik değeri verilir. |
LB_SETLOCALE |
Listeleme
kutusuna bölgesel bilgi atar, kontrolün bir önceki bölgesel bilgisini döndürür.
Mesajın wParam parametresi olarak bölgesel bilgi tanımlayıcısı değeri verilir,
lParam parametresi olarak sıfır verilir. |
LB_SETSEL |
Çok-seçimli
bir listeleme kutusunda, verilen bir elemanı seçili hale getirir. Mesajın
wParam parametresi olarak seçili olma durumunu belirten mantıksal bir değer
verilir, lParam parametresi olarak sıra numarası değeri verilir. |
LB_SETTABSTOPS |
Kontrolün
sekme sıra numaralarını ayarlar. Mesajın wParam parametresi olarak sekme
sayısı verilir, lParam parametresi olarak sekme numaraları dizisinin adresi
verilir. |
LBN_SETTOPINDEX |
Verilen
sıra numarasına sahip olan liste elemanı kontrolün en üstünde görünecek
şekilde kaydırma yapılmasını sağlar. Mesajın wParam parametresi olarak sıra
numarası değeri verilir, lParam parametresi olarak sıfır verilir. |
Bu yazımızda yapacağımız
uygulamada üç tane liste kutusu kontrolü oluşturacağız. Kullanıcı, ilk liste
kutusuna bir karakter katarı girerek ekleme yapabilecek. İlk listeleme kutusunun
elemanlarını üzerilerine fare ile tıklamak yoluyla, ikinci listeleme kutusuna
ekleyebilecek. İkinci listeleme kutusundaki elemanlardan istediklerini silebilecek
ve sildiği elemanlar üçüncü listeleme kutusuna eklenecek.
Uygulamamızın pencere
fonksiyonunu inceleyelim :
void OnAddPshButtonClick();
void OnDeletePshButtonClick();
void OnListBox1DblClick();
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)
                OnAddPshButtonClick();
   
        else if (LOWORD(wParam) == ID_PSH_BTN_2
&& HIWORD(wParam) == BN_CLICKED)
                OnDeletePshButtonClick();
   
        else if (LOWORD(wParam) == ID_LISTBOX_1
&& HIWORD(wParam) == LBN_DBLCLK)
                OnListBox1DblClick();
   
        break;
   
    case WM_CREATE :
   
        hListBox1 = CreateWindow("listbox","",
                   
                   
        WS_CHILD | WS_VISIBLE | LBS_NOTIFY,
                   
                   
        90,50,150,250,hWnd,(HMENU)ID_LISTBOX_1,
                   
                   
        ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        SendMessage(hListBox1,LB_ADDSTRING,0,elements[0]);
            SendMessage(hListBox1,LB_ADDSTRING,0,elements[1]);
            SendMessage(hListBox1,LB_ADDSTRING,0,elements[2]);
            SendMessage(hListBox1,LB_ADDSTRING,0,elements[3]);
            SendMessage(hListBox1,LB_ADDSTRING,0,elements[4]);
   
        hStatic1 = CreateWindow("static","Eklenecek
:",
                   
                   
        WS_CHILD | WS_VISIBLE,
                   
                   
        5,310,75,20,hWnd,(HMENU)ID_LABEL_1,
                   
                   
        ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        hEditBox1 = CreateWindow("edit","",
                   
                   
        WS_CHILD | WS_VISIBLE | ES_LEFT,
                   
                   
        90,310,150,20,hWnd,(HMENU)ID_EDITBOX_1,
                   
                   
        ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        hPushButton1 = CreateWindow("button","Ekle",
                   
                   
        WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
                   
                   
        90,335,100,20,hWnd,(HMENU)ID_PSH_BTN_1,
                   
                   
        ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        ////////////////////////////////////////////////////////////////////////////////////
   
        hListBox2 = CreateWindow("listbox","",
                   
                   
        WS_CHILD | WS_VISIBLE | LBS_SORT,
                   
                   
        350,50,150,250,hWnd,(HMENU)ID_LISTBOX_2,
                   
                   
        ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        hStatic2 = CreateWindow("static","Silinen
:",
                   
                   
        WS_CHILD | WS_VISIBLE,
                   
                   
        255,310,75,20,hWnd,(HMENU)ID_LABEL_2,
                   
                   
        ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        hEditBox2 = CreateWindow("edit","",
                   
                   
        WS_CHILD | WS_VISIBLE | ES_LEFT,
                   
                   
        350,310,150,20,hWnd,(HMENU)ID_EDITBOX_2,
                   
                   
        ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        hPushButton2 = CreateWindow("button","Sil",
                   
                   
        WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
                   
                   
        525,50,100,20,hWnd,(HMENU)ID_PSH_BTN_2,
                   
                   
        ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        ////////////////////////////////////////////////////////////////////////////////////
   
        hListBox3 = CreateWindow("listbox","",
                   
                   
        WS_CHILD | WS_VISIBLE | LBS_NOSEL,
                   
                   
        635,50,150,250,hWnd,(HMENU)ID_LISTBOX_3,
                   
                   
        ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        break;
   
    case WM_DESTROY :
            PostQuitMessage(0);
            break;
        default :
            return DefWindowProc(hWnd,message,wParam,lParam);
    }
    return 0;
}
|
Pencere fonksiyonundan
önce prototip bildirimi yapılan üç fonksiyon, kontrollere ilişkin birtakım olaylar
olduğunda çağrılacak fonksiyonlardır. OnAddPshButtonClick isimli fonksiyon,
kullanıcı bir karakter katarı girip, ardından Ekle tuşuna bastığı zaman çağrılır.
Bu fonksiyon, girilen karakter katarını, ilk listeleme kutusuna ekleme işlemini
yapacak. OnDeletePshButtonClick isimli fonksiyon, kullanıcı ikinci listeleme
kutusundan bir eleman seçip, ardından Sil tuşuna bastığı zaman çağrılır. Bu
fonksiyon seçilen elemanı ikinci listeleme kutusundan silerek, silinen elemanın
adını yazı kutusu kontrolüne yazacak ve üçüncü listeleme kutusuna ekleyecek.
OnListBox1DblClick isimli fonksiyon, kullanıcı ilk liste kutusunda herhangi
bir elemana fare ile çift tıkladığı zaman çağrılır. Bu fonksiyon, ilk listeleme
kutusunda seçilen elemanı, ikinci listeleme kutusuna ekleyecek.
Pencere fonksiyonunda,
WM_COMMAND mesajında, yukarıda açıkladığımız fonksiyonların ne zaman çağrılacağını
belirledik. WM_CREATE mesajında, uygulamada kullandığımız standart kontrolleri
oluşturduk. Listeleme kutusu kontrolü oluştururken, CreateWindow fonksiyonuna
parametre olarak, listbox pencere sınıf ismini verdiğimizi yukarıda belirtmiştik.
İlk listeleme kutusuna pencere biçimi parametresi olarak LBS_NOTIFY pencere
biçimi sembolik sabitini geçerek, kontrolün ana pencereye bilgi mesajlarını
iletmesini sağladık. İkinci listeleme kutusunun elemanlarının sıralı görünmesi
için bu kontrolü, LBS_SORT pencere biçimi sembolik sabiti ile oluşturduk. Üçüncü
listeleme kutusu kontrolünün elemanlarının seçilmesini engellemek için bu kontrolü
de LBS_NOSEL pencere biçimi sembolik sabiti ile oluşturduk.
İlk listeleme kutusu
kontrolüne LB_ADDSTRING mesajı ileterek, kontrole beş tane eleman ekledik. Uygulamanın
çalışır hali şöyle olacaktır :
Şimdi yukarıda
prototip bildirimlerini verdiğimiz üç fonksiyonu sırasıyla inceleyelim :
void OnAddPshButtonClick()
{
    char text[20];
    int count = SendMessage(hEditBox1,EM_GETLINE,0,text);
   
if (count < 1)
        return;
   
SendMessage(hListBox1,LB_ADDSTRING,0,text);
}
|
Bu fonsiyon, pencerenin
sol alt kısmında yer alan düğme kontrolüne basıldığı zaman çağrılmaktadır ve
düğme kontrolünün üzerinde yer alan yazı kutusu kontrolüne girilen karakter
katarını, ilk listeleme kutusu kontrolüne eklemektedir. Bunun için öncelikle
yazı kutusu kontrolüne EM_GETLINE mesajı gönderilerek kontrole girilen karakter
katarı text adresine yazılmaktadır. Daha sonra bu adresteki karakter katarı,
listeleme kutusu kontrolüne LB_ADDSTRING mesajı gönderilerek eklenmektedir.
void OnDeletePshButtonClick()
{
    char text[20];
    int selIndex = SendMessage(hListBox2,LB_GETCURSEL,0,0);
   
if (selIndex == LB_ERR)
        return;
   
SendMessage(hListBox2,LB_GETTEXT,selIndex,text);
    SetWindowText(hEditBox2,text);
    SendMessage(hListBox3,LB_ADDSTRING,0,text);
    SendMessage(hListBox2,LB_DELETESTRING,selIndex,0);
}
|
Bu fonksiyon, ikinci
listeleme kutusu kontrolü yanında yer alan düğme kontrolüne basıldığı zaman
çağrılmaktadır ve ikinci listeleme kutusu kontrolünde o an seçili olan elemanı
silmektedir. Silinen karakter katarı listeleme kutusu kontrolü altında yer alan
yazı kutusu kontrolüne yazılmakta ve üçüncü listeleme kutusu kontrolüne eklenmektedir.
Fonksiyonun başında, ikinci listeleme kutusu kontrolüne LB_GETCURSEL mesajı
gönderilerek kontrolde seçili olan elemanın sıra numarası alınmaktadır. Bu sıra
numarası değerinin geçerli bir sayı olup olmadığı kontrol edilmektedir. Ardından
seçili olan elemanın ismi, listeleme kutusu kontrolüne LB_GETTEXT mesajı gönderilerek
text adresine yazdırılmaktadır. Bu adreste tutulan karakter katarı, yazı kutusu
kontrolüne yazılmakta, ardından üçüncü listeleme kutusuna eklenmektedir. Seçili
olan eleman ile ilgili işlemler tamamlandıktan sonra ikinci listeleme kutusu
kontrolüne LB_DELETESTRING mesajı gönderilerek, eleman kontrolden silinmektedir.
void OnListBox1DblClick()
{
    char text[20];
    int count = 0;
    int selIndex = SendMessage(hListBox1,LB_GETCURSEL,0,0);
   
if (selIndex == LB_ERR)
        return;
   
count = SendMessage(hListBox1,LB_GETTEXT,selIndex,text);
if (count < 1)
return;
SendMessage(hListBox2,LB_ADDSTRING,0,text);
}
|
Bu fonksiyon, ilk
listeleme kutusunun elemanlarından birisine fare ile çift tıklandığı zaman çağrılmaktadır
ve seçili olan elemanı ikinci listeleme kutusuna eklemektedir. Fonksiyonun başında,
ilk listeleme kutusuna LB_GETCURSEL mesajı gönderilerek o an seçili olan elemanın
sıra numarası alınmakta ve LB_GETTEXT mesajı ile seçili olan elemanın adı öğrenilmektedir.
Ardından ikinci listeleme kutusu kontrolüne LB_ADDSTRING mesajı gönderilerek
ilk kontrolde seçili olan eleman, ikinci kontrole eklenmektedir.
Bu yazımızda listeleme
kutusu kontrolünü inceledik ve kontrolün kullanımını içeren temel bir uygulama
yaptık. Uygulamaya ilişkin kaynak kodları buradan indirebilirsiniz.
Bir sonraki yazımızda
görüşmek üzere, mutlu günler dilerim.
KAYNAKLAR
- Win32 Programlama
Yardım Sayfaları
Makale:
Windows API - Listeleme Kutusu Kontrolünün Oluşturulması ve Kullanımı C ve Sistem Programlama Çiğdem Çavdaroğlu
|