Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




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: degeri elemanin karakter kontrole kutusu kutusunun listeleme lparam mesajin numarasi parametresi pencere verilir verilir. 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 : 16.7.2006
Okunma Sayısı : 33452
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Ş
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 21.11.2024
Turhal Temizer
Mac OS/X Removing CUDA 21.11.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak 21.11.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi 21.11.2024
  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 - Listeleme 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, ’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
  • Yazılan Yorumlar
  • Yorum Yaz
AĞU
6
2006
Win32 Sistem programcılığı adına büyük bir döküman boşluğunu her ne kadar çoğunluğu doğrudan çeviri olsada doldurduğunuzu mutlulukla ve gururla izliyorum. Çalışmalarınızın aksamatmaksızın devamını diliyor ve teşekkür ediyorum.
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