| 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
 
 
 
  Listeleme 
  Kutusu Kontrolüne İlişkin Özel Fonksiyonlar 
    | 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. |  
 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.
 
 
 
  Listeleme 
  Kutusu Kontrolüne Gönderilen Mesajlar 
    | 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 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.
 
 
 
  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. 
    | 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. |  
 Uygulamamızın pencere 
  fonksiyonunu inceleyelim :
 
 
 
  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. 
    | 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 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 :
 
 
 
  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 OnAddPshButtonClick() {
     char text[20];
     int count = SendMessage(hEditBox1,EM_GETLINE,0,text);  
           
        if (count < 1)
         return;
 
     
        SendMessage(hListBox1,LB_ADDSTRING,0,text);
 }
 
 
 |  
 
 
  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 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, 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. 
    | 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 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
 |