Windows sistemlerinde,
pencerelerin nasıl oluşturulacağına ilişkin bilgileri önceki yazılarımızda ele
almıştık. Bu bilgileri gözden geçirerek özetleyelim : Öncelikle oluşturmak istediğimiz
pencereye ilişkin özellikleri belirtmek için WNDCLASS yapısı türünden bir nesne
oluşturarak, bu yapı nesnesinin veri elemanlarına pencere özelliklerimize ilişkin
bilgileri atıyorduk :
  
//...
   WNDCLASS wndClass;
   //...
   wndClass.style = CS_HREDRAW | CS_VREDRAW;
   wndClass.lpfnWndProc = (WNDPROC)WndProc;
   wndClass.cbClsExtra = 0;
   wndClass.cbWndExtra = 0;
   wndClass.hInstance = hInstance;
   wndClass.hIcon = LoadIcon(NULL,IDI_WINLOGO);
   wndClass.hCursor = LoadCursor(NULL,IDC_ARROW);
   wndClass.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(0,0,0));;
   wndClass.lpszMenuName = NULL;
   wndClass.lpszClassName = "gui";
   //...
|
Pencere özelliklerimizi
belirttikten sonra, sisteme penceremizi tanıtmak amacıyla RegisterClass fonksiyonunu
çağırıyorduk ve yeni pencere türümüzü sisteme kaydediyorduk. Bir uygulama içerisinde
sisteme tanıttığımız pencere sınıfları, uygulama sonuna kadar sistemde kalıyordu.
Bir pencere sınıfını RegisterClass fonksiyonu ile sisteme kaydetmeden, o pencere
sınıfından CreateWindow vb bir fonksiyon ile bir pencere oluşturamıyorduk. Peki
kontol ve standart kontroller ne anlama gelmektedir?
Kontrol Nedir?
Windows sistemlerinde
kontroller, bir uygulamanın temel giriş çıkış işlemlerini yapabilmek için kullandığı
alt pencereler olarak tanımlanır. Kontroler, kullanıcıya bir seçeneği seçtirmek,
kullanıcıdan bir bilgi almak ve kullanıcıya elde ettiği bir bilgiyi göstermek
gibi çok çeşitli amaçlar için kullanılmaktadır.
Standart
Kontroller Nedir?
Windows sistemleri
açılırken, sisteme otomatik olarak kaydedilen bazı pencere sınıfları vardır.
Bu pencere sınıflarını kullanarak oluşturduğumuz pencereler standart Windows
kontrolleri olarak bilinir. Bu pencerelere ilişkin pencere fonksiyonları da
yazılmış bir biçimde sistemde bulunmaktadır. Windows uygulamalarında, pencereler
üzerinde gördüğümüz yazı kutuları (Edit, Text Box), düğmeler (Button), listeleme
kutuları (List Box), bileşik giriş kutuları (Combo Box), araç çubukları (Tool
Bar), menüler vb alanların hepsi Windows kontrolleridir. Bu kontrollere ilişkin
pencere sınıfları bizim için yazılmış ve sisteme kaydedilmiş durumdadır. Bu
pencerelere ilişkin pencere fonksiyonları da yazılmış olarak sistemde bulunmaktadır.
Bir kontrol oluşturmak için biizm tek yapmamız gereken, o kontrole ilişkin pencere
sınıfını kullanarak CreateWindow gibi pencere oluşturan bir fonksiyonu çağırmaktır.
HWND CreateWindow
(
    LPCTSTR lpClassName,      //Sisteme tanıtılan
pencere sınıf ismi
    LPCTSTR lpWindowName,  //Pencere başlığında görüntülenecek
yazı
    DWORD dwStyle,             //Pencere
biçimi
    int x,               
            //Pencerenin yatay pozisyonu
    int y,               
            //Pencerenin dikey pozisyonu
    int nWidth,            
       //Pencere genişliği
    int nHeight,            
      //Pencere yüksekliği
    HWND hWndParent,         //Parent
ya da owner pencere tutamaç değeri
    HMENU hMenu,            
 //Menü veya child pencere tutamaç değeri
    HANDLE hInstance,         //Uygulamanın
çalıştırılma adresi
    LPVOID lParam            
  //Pencere yaratılma bilgileri göstericisi
); |
CreateWindow fonksiyonu
ile standart bir kontrol oluşturulurken pencere sınıfı ismi olarak, o kontrole
ilişkin pencere sınıfı ismi kullanılır. Fonksiyonun ikinci parametresi, pencere
oluştururken, pencere başlığında görüntülenecek başlık yazısını belirtiyordu.
Kontrol oluştururken ise bu parametre, kontrolün türüne göre değişik anlamlara
gelir. Örneğin statik kontrolde kontrolün üzerinde görüntülenecek yazı, yazı
kutusu kontrolünde kutunun içindeki yazı gibi anlamlara gelirken, listeleme
kutusu gibi bazı kontrollerde de bu parametre hiçbir anlam ifade etmemektedir
ve boş bırakılabilir. CreateWindow fonksiyonunun üçüncü parametresi, oluşturulacak
pencerenin biçimi ile ilgiliydi. Kontrol oluştururken de bu parametre benzer
anlam ifade eder. Ancak bu parametre değişkeni yerine geçeceğimiz sembolik sabitler,
kontrolün türüne göre değişebilir. Bazı kontroller için özel anlamlar taşıyan
pencere biçimi sembolik sabitleri tanımlanmıştır. Pencerenin yatay ve düşey
pozisyonunu belirten x ve y parametreleri, kontrol oluşturulurken başlangıç
noktası kontrolün ana penceresinin sol üst köşesi orijin noktası olarak kabul
edilerek hesaplanır. Fonksiyonun HMENU türündeki parametresi, kontrol oluşturulurken
o kontrolün tanımlayıcı (ID) değeri olarak verilir.
Windows sistemlerinde
sıklıkla kullanılan standart kontroller şunlardır :
1. Düğme kontrolü
(Button Control)
2. Statik kontrol (Static control)
3. Bileşik giriş kutusu kontrolü (Combo box control)
4. Listeleme kutusu kontrolü (List box control)
5. Yazı kutusu kontrolü (Edit Control)
6. Liste görünümü kontrolü (List view control)
7. Durum çubuğu kontrolü (Status bar control)
8. Akıtma çubuğu kontrolü (Scrool bar control)
9. Sekme kontrolü (Tab page control)
10. Ağaç görünümü kontrolü (Tree view control)
11. Seçenek kutusu kontrolü (Check box control)
12. Seçenek düğmesi kontrolü, radyo düğmesi kontrolü (Radio button control)
//...
Ayrıca bu kontrollerin
bir arada kullanılmasıyla ve kontrollere ilave bir takım özellikler eklenmesiyle
yeni kontroller elde edilir. Yeni nesne yönelimli programlama dillerinin derleyici
IDE’lerinde Araç Çubuğu (ToolBox) başlığı altında birçok kontrol görürüz. Bu
kontroller, sistemde tanımlı olarak bulunan standart kontroller kullanılarak
oluşturulmuştur. Bu dillerde kontroller Windows API programlama kullanılmaksızın
sürükle-bırak tekniği ile uygulamaya eklenirler. Ancak bu kontroller arka planda,
Windows API yardımıyla oluşturulur ve bizim kod yazmamıza gerek kalmaz.
Yukarıda bahsettiğimiz
kontroller bir Windows penceresi üzerinde şu şekilde görünür :
Kontrollerin
Pencere Biçimleri
Kontroller oluşturulurken
CreateWindow fonksiyonunun üçüncü parametresi olan ve pencere biçimini belirleyen
parametreye WS_CHILD biçimi mutlaka verilmelidir. Çünkü tüm kontroller belli
bir ana pencerenin alt penceresi olarak oluşturulurlar. Her kontrolün kendisine
özel olarak tanımlanmış bazı pencere biçimleri de vardır. Bu biçimleri ifade
eden sembolik sabitler, ilk iki harfi kontrolü temsil edecek şekilde isimlendirilmiş
ve tanımlanmışlardır. Kontrolleri ele alırken bu özel pencere biçimlerine ve
ne anlama geldiklerine değineceğiz.
Kontroller
ile Haberleşme
Kontroller ile
haberleşme konusunu iki başlık altında inceleyebiliriz. İlk başlığımız kontrollerin
belli işlemleri yapmasını sağlayabilmek için, onlara uygulama içerisinden mesajlar
göndermek; ikinci başlığımız ise kontrollerin belli durumlar oluştuğu takdirde
uygulamamıza mesaj göndermesidir.
Nasıl ki pencereleri
oluşturduktan sonra onlara API fonksiyonları ile mesajlar gönderiyor ve onlardan
gelen mesajları alıp yorumluyorsak, kontroller ile çalışırken de aynı API fonksiyonlarını
kullanarak kontroller ile haberleşebilir ve onların belli işlemleri yapmasını,
ayrıca onlardan gelen mesajları alarak yorumlayabilir ve uygulamamızın buna
göre davranmasını sağlayabiliriz. Kontrollere göndereceğimiz mesajlar da, tıpkı
pencere biçimleri gibi, ilk iki harfleri mesajın ilişkin olduğu kontrolü belirtecek
şekilde isimlendirilmiş ve sembolik sabitler olarak tanımlanmışlardır. SendMessage
veya PostMessage fonksiyonlarının ilk parametresi olarak kontrolün tutamaç değerini
verip, ikinci parametrelerine bu mesajlara ilişkin sembolik sabitleri geçtiğimizde
kontrol ona yaptırmak istediğimiz işi anlar ve yerine getirir. Mesajlara ilişkin
bu sembolik sabitlerin ilk iki harfinden sonraki kısımları, mesajın anlamını
ifade edecek şekilde verilmiştir.
Kontroller de durumlarındaki
değişiklikleri üst pencerelere mesajlaşma yoluyla iletirler. Kontroller bir
durumu üst pencereye WM_COMMAND mesajı göndererek iletirler. WM_COMMAND mesajı,
iki bilgi içerir. Bu değerden, LOWORD makrosu ile düşük anlamlı WORD değeri,
HIWORD makrosu ile yüksek anlamlı WORD değeri alınarak iki parametre elde edilir.
Düşük anlamlı WORD değeri, mesajın hangi kontrolden geldiğini belirten tanımlayıcı
değerdir. Yüksek anlamlı WORD değeri ise, mesajın hangi nedenle gönderildiğini
ifade eder. Kontrollerden gelen mesajlar da, aynı isimlendirme tekniği kullanılarak
sembolik sabitler olarak tanımlanmışlardır.
Uygulama içerisinde,
bir kontrol oluşturulduktan sonra SendMessage veya PostMessage fonksiyonları
kullanılarak kontrollere istenildiği anda bir mesaj gönderilmesi sağlanabilir.
Bunun için tek ihtiyacımız olan, kontrol oluşturulurken elde ettiğimiz kontrole
ilişkin tutamaç değeri ve göndermek istediğimiz mesajı ifade eden sembolik sabit
ifadesidir. Kontrollerden gelen mesajları aldığımız kısım ise, pencere fonksiyonu
içerisinde gönderilen mesajları işlediğimiz switch-case ifadesinde WM_COMMAND
mesajının ele alınması kısmıdır. Daha önce de bahsettiğimiz gibi bu mesajdan,
mesajın hangi kontrolden ne amaçla gönderildiği bilgileri edinilebilir.
switch (message)
{
    //...
    case WM_COMMAND :
    //...
    default :
    //...
} |
Şimdi küçük bir
uygulama yaparak, en basit kontrollerden birisi olan statik kontrolün nasıl
oluşturulduğunu ve bu kontrol ile haberleşme işlemlerini inceleyelim.
Statik
Kontrolün (Static Control) Oluşturulması ve Kullanılması
Statik kontrolün
oluşturulması için, static sınıf ismi kullanılarak bir pencere oluşturulur.
Static ismi, bu kontrol için önceden tanımlanarak sisteme kaydedilmiş olarak
bulunan standart kontrol pencere ismidir. Pencerelerin oluşturulması konusunu
önceki yazılarımızda ele aldığımız için kodun o kısmını geçerek, ana penceremizin
pencere fonksiyonunu ele alalım. Ön bilgi olarak, uygulamamızın başlangıç fonksiyonu
olan WinMain fonksiyonunda siyah renkli bir pencere oluşturduğumuzu belirtelim.
LRESULT CALLBACK
WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    static HWND hStaticControl1, hStaticControl2;
    char title1[26] = "Statik Kontrolümüz Oluştu";
    char title2[28] = "1. Statik kontrolün başlığı";
    char title3[28];
   
switch(message) {
       case WM_CREATE :
          hStaticControl1 = CreateWindow("static",title1,WS_CHILD
| WS_VISIBLE,
                                                   
100,100,200,30,hWnd,(HMENU)ID_STATIC_CONTROL1,
                                                   
((LPCREATESTRUCT)lParam)->hInstance,NULL);
          hStaticControl2 = CreateWindow("static","",WS_CHILD
| WS_VISIBLE,
                                                   
350,100,200,30,hWnd,(HMENU)ID_STATIC_CONTROL2,
                                                   
((LPCREATESTRUCT)lParam)->hInstance,NULL);
          break;
      
case WM_LBUTTONDOWN :
          SetWindowText(hStaticControl1,title2);
          break;
      
case WM_RBUTTONDOWN :
          GetWindowText(hStaticControl1,
title3, 28);
          SetWindowText(hStaticControl2,title3);
          break;
      
case WM_DESTROY :
          PostQuitMessage(0);
          break;
      
default :
          return DefWindowProc(hWnd,message,wParam,lParam);
    }
    return 0;
}
|
Şimdi fonksiyonumuzu
adım adım inceleyelim. Pencere fonksiyonumuza parametre değişkeni olarak gelen
hWnd tutamaç değeri, uygulamamızın ana penceresine aittir. Oluşturacağımız statik
kontroller, bu ana pencere içerisinde olacağı için, kontrolleri oluştururken
bu değeri kullanmamız gerekecektir. CreateWindow fonksiyonunda kullandığımız
ID_STATIC_CONTROL1 ve ID_STATIC_CONTROL2 sembolik sabitleri, sırasıyla 100 ve
101 değerlerine tanımlanmış sabitlerdir. Bu değerler, kontroler oluşturulurken
fonksiyonun menü parametresi yerine geçilecek değerlerdir.
Gördüğünüz gibi,
statik kontrol oluşturmak için kullandığımız pencere sınıfı ’static’ ismine
sahiptir. CreateWindow fonksiyonunun ikinci parametresi, oluşturularak pencerenin
başlık yazısını belirtiyordu. Statik kontrol oluşturulurken ise bu parametre,
statik kontrol üzerinde gösterilecek yazıyı belirtmektedir. Pencere özellikleri
parametresi için, WS_CHILD sabitini kullanmamız zorunludur. Çünkü tüm standart
kontroller, birer alt penceredir. Kontrolün ana penceresi olarak da, WinMain
fonksiyonunda oluşturmuş olduğumuz ana pencerenin tutamaç değerini veriyoruz.
Çünkü bu kontrollerin, ana pencere içerisinde görüntülenmesini istiyoruz. Fonksiyonun
dördüncü ve beşinci parametreleri, ana pencerenin sol üst köşesi orijin olmak
üzere, kontrolün ana pencere üzerindeki yerini belirtmektedir. Altıncı ve yedinci
parametreler, kontrolün genişlik ve yükseklik değerlerini belirtmektedir. Pencere
fonksiyonunda, WM_CREATE mesajı alınır alınmaz statik kontrollerimiz de belirtilen
özelliklere sahip bir şekilde oluşturulacaktır.
Ana pencere fonksiyonunda
farenin sol tuşuna ve sağ tuşuna basılma mesajları alınması durumlarında yaptığımız
işlemler, oluşturulan statik kontrolün içerisindeki yazının değiştirilmesini,
bu yazının alınarak diğer statik kontrolün yazısı olarak atanmasını sağlar.
SetWindowText fonksiyonu, önceki yazılarımızdan da hatırlayacağınız üzere, tutamaç
değeri kendisine parametre olarak geçilen pencerenin başlık yazısının değiştirilmesini
sağlıyordu. Aynı şekilde GetWindowText fonksiyonu da, pencerenin başlık yazısını
almamızı sağlıyordu. Kontroller de birer pencere olduğuna göre, pencereler için
kullandığımız bu fonksiyonları, anlamlı oldukları durumlarda kontroller için
de kullanabiliriz. Örneğin bir statik kontrol için pencere başlığı, statik kontrol
içerisinde yazan yazıyı belirtmektedir. O halde bu fonksiyonları kullanarak
statik kontrol içerisinde yazan bir yazıyı öğrenebilir veya değiştirilmesini
sağlayabiliriz.
Farenin sol tuşuna
basılmasıyla kuyruktan WM_LBUTTONDOWN mesajı alındığında ilk oluşturduğumuz
statik kontrolün yazısını değiştiriyoruz. Bu amaçla SetWindowText fonksiyonuna,
tutamaç değeri olarak hStaticControl1 değerini, yeni başlık yazısı değeri olarak
da title2 isimli karakter katarını veriyoruz. Pencereve statik kontroller oluşturulduktan
sonra farenin sol tuşuna tıklanmasıyla birinci statik kontrolümüzün içerisindeki
yazı değişmiş olacaktır. Farenin sağ tuşuna basılmasıyla kuyruktan WM_RBUTTONDOWN
mesajı alındığında ise, ilk statik kontrolümüzün başlık yazısını GetWindowText
fonksiyonunu kullanarak alıyoruz ve ikinci statik kontrolüme SetWindowText fonksiyonunu
kullanarak atıyoruz. GetWindowText fonksiyonunun ilk parametresi olarak ilk
statik kontrolümüzün tutamaç değerini verdik. İkinci parametresi, alınan yazının
saklanacağı adresi ve üçüncü parametresi de alınacak maksimum karakter sayısını
belirtiyordu. Bu değerleri de verdikten sonra, birinci statik kontrolümüzün
içerisindeki yazı, title3 adresinden itibaren yazılacaktır. Sonraki adımda da
SetWindowText fonksiyonu ile, alınan bu yazının ikinci statik kontrole atanmasını
sağladık. Uygulamanın çalışma anında farenin sağ tuşuna basılması durumunda
her iki statik kontrolümüzün yazısı da aynı olacaktır :
Uygulamanın
çalışan ilk hali :
Farenin
sol tuşuna basılması :
Farenin
sağ tuşuna basılması :
Statik
Kontrole İlişkin Pencere Biçimleri :
Statik kontrolleri
anlatırken, her kontrolün kendisine özel bazı pencere biçimleri olduğunu ve
CreateWindow fonksiyonunun pencere biçimi parametresinde bu değerlerinde kullanılabileceğini
söylemiştik. Statik kontrol için tanımlanan pencere biçimlerine ilişkin sembolik
sabitlerin isimleri SS_ öneki ile başlar. Bu pencere biçimleri | operatörü ile
birleştirilerek bir arada kullanılabilir. Şimdi bu sembolik sabitleri ve anlamlarını
inceleyelim :
STATİK
KONTROL PENCERE BİÇİMİ SEMBOLİK SABİT İSMİ
|
ANLAMI
|
SS_BITMAP |
Statik kontrol içerisinde bir bitmap dosyasının görüntüleneceğini belirtir.
Başlık yazısı olarak, kullanılan kaynakta dosya yeri tanımlanmış olan bir
dosya adı verilir. Bu pencere biçimi kullanıldığında, genişlik ve yükseklik
parametreleri ihmal edilir ve bu değerler resim dosyası kontrole sığacak
biçimde otomatik olarak ayarlanır. |
SS_BLACKFRAME |
Kontrolün
etrafına, pencere çerçevelerinin rengi ile aynı renkte bir çerçeve çizilmesini
sağlar. Varsayılan pencere çerçevesi rengi siyahtır. |
SS_BLACKRECT |
Kontrolün,
pencere çerçevesinin rengine sahip içi dolu bir dikdörtgen biçiminde görüntülenmesini
sağlar. |
SS_CENTER |
Kontrolün
içerisindeki yazının ortalanmasını sağlar. |
SS_CENTERIMAGE |
Eğer
statik kontrol içerisinde bir resim dosyasının içeriği görüntüleniyorsa
ve bu resmin ebatları kontrolden daha küçük ise, boş kalan kısımlar resim
dosyasının sol üst piksel rengi ile doldurulup doldurulmayacağını belirler.
|
SS_ENHMETAFILE |
Statik
kontrol içerisinde bir matefile dosyasının görüntülenmesini sağlar. |
SS_ETCHEDFRAME |
Kontrolün
çerçevesinin EDGE_ETCHED kenar biçimine sahip bir biçimde çizilmesini sağlar.
|
SS_ETCHEDHORZ |
Kontrolün
çerçevesinin alt ve üst kenarlarının EDGE_ETCHED kenar biçimine sahip bir
biçimde çizilmesini sağlar. |
SS_ETCHEDVERT |
Kontrolün
çerçevesinin sol ve sağ kenarlarının EDGE_ETCHED kenar biçimine sahip bir
biçimde çizilmesini sağlar. |
SS_GRAYFRAME |
Kontrolün
etrafına, arka plan rengi ile aynı renkte bir çerçeve çizilmesini sağlar.
Varsayılan arka plan rengi gridir. |
SS_GRAYRECT |
Kontrolün,
arka plan rengine sahip içi dolu bir dikdörtgen biçiminde görüntülenmesini
sağlar. |
SS_ICON |
Statik
kontrol içerisinde bir ikon dosyasının görüntüleneceğini belirtir. Başlık
yazısı olarak, kullanılan kaynakta dosya yeri tanımlanmış olan bir dosya
adı verilir. Bu pencere biçimi kullanıldığında, genişlik ve yükseklik parametreleri
ihmal edilir ve bu değerler ikon kontrole sığacak biçimde otomatik olarak
ayarlanır. |
SS_LEFT |
Kontrolün
içerisindeki yazının sola dayalı bir biçimde yazılmasını sağlar. |
SS_LEFTNOWORDWRAP |
Kontrolün
içerisindeki yazının sola dayalı bir biçimde yazılmasını sağlar. Yazının
kontrole sığmayan kısımları için alt satıra geçilmez. |
SS_NOPREFIX |
Kontrolün
içerisindeki yazıda bulunan ampersand karakterlerinin (&) görüntülenmesi
ile ilgili ayarlar yapar. Yazı içerisindeki ampersand karakterlerinin olduğu
gibi gösterilmesini engeller; bunun yerine ampersand karakterinden bir sonra
yer alan karakterinin altının çizili görüntülenmesini sağlar. |
SS_NOTIFY |
Belirli
olaylar gerçekleştiğinde kontrolün uygulamaya mesajlar göndermesini sağlar.
Bu özellik eklenmezse, bu durumlar oluştuğunda kontrol bizi haberdar etmeyecektir.
(Örneğin kontrolün üzerine tıklanması gibi) |
SS_OWNERDRAW |
Statik
kontrolün çiziminden, onun sahiplenici penceresinin sorumlu olmasını sağlar.
Kontrolün yeniden çizilmesi gerektiği durumlarda, sahiplenici pencereye
WM_DRAWITEM mesajı gönderilir. |
SS_REALSIZEIMAGE |
Bitmap
veya ikon görüntüleyen bir statik kontrolün, bitmap veya ikon dosyası yüklendiğinde
veya kontrol çizildiğinde yeniden boyutlandırılmasını önler. Eğer bitmap’in
veya ikon’un ebatları statik kontrolden daha büyükse sığmayan kısımlar kesilir.
|
SS_RIGHT |
Kontrolün
içerisindeki yazının sağa hizalanmasını sağlar. |
SS_RIGHTJUST |
Kontrolün
sağ ve alt kenarlarının sabitlenmesini sağlar. Bitmap veya ikon dosyası
yüklendiğinde sadece üst ve sol kenarların hizalanmasını sağlar. |
SS_SIMPLE |
Yazının
kontrol içerisinde tek bir satırda ve sola hizalanmış bir şekilde görüntülenmesini
sağlar. |
SS_SUNKEN |
Kontrolün
sol ve üst kenarlarını gölgelendirir. |
SS_WHITEFRAME |
Kontrolün
etrafına, pencere arka plan rengi ile aynı renkte bir çerçeve çizilmesini
sağlar. Varsayılan pencere arka plan rengi siyahtır. |
SS_WHITERECT |
Kontrolün,
pencere arka plan rengine sahip içi dolu bir dikdörtgen biçiminde görüntülenmesini
sağlar. |
Statik
Kontrole Gönderilen Mesajlar
Statik kontrollere
göndereceğimiz mesajlara ilişkin sembolik sabitler STM_ öneki kullanılarak isimlendirilmişlerdir.
Bu mesajlar ve anlamlarını inceleyelim :
STATİK
KONTROLE GÖNDERİLEN MESAJLAR
|
ANLAMI
|
STM_GETIMAGE |
Bir statik kontrol içerisinde görüntülenen görüntünün tutamaç değerini almak
için uygulama tarafından statik kontrole gönderilen mesajdır. Bu mesajın
wParam parametresi görüntü türünü belirtir, lParam parametresi ise kullanılmaz
ve sıfır olarak geçilebilir. wParam parametresinin değeri, IMAGE_BITMAP,
IMAGE_CURSOR, IMAGE_ENHMETAFILE ve IMAGE_ICON değerlerinden birisi olabilir.
Bu mesaj kontrole gönderildiğinde bize geri döndürülecek olan değer, ilgili
görüntünün tutamaç değeridir. |
STM_SETIMAGE |
Bir
statik kontrol içerisinde görüntülenen görüntünün yeni bir görüntü ile değiştirilmesi
amacıyla uygulama tarafından statik kontrole gönderilen mesajdır. Bu mesajın
wParam parametresi görüntü türünü, lParam parametresi ise görüntünün tutamaç
değerini belirtir. wParam parametresinin değeri, IMAGE_BITMAP, IMAGE_CURSOR,
IMAGE_ENHMETAFILE ve IMAGE_ICON değerlerinden birisi olabilir. Bu mesaj
kontrole gönderildiğinde bize geri döndürülecek olan değer, kontrolde önceden
görüntülenen görüntüye ilişkin tutamaç değeridir. |
STM_GETICON |
İkon
görüntüleyen bir statik kontrol için, bu ikona ilişkin tutamaç değerinin
elde edilmesi amacıyla gönderilir. wParam ve lParam parametreleri kullanılmaz,
sıfır geçilir. Eğer kontrolde hiçbir ikon görüntülenmiyorsa NULL değer döndürür,
aksi takdirde görüntülenen ikonun tutamaç değerini döndürür. |
STM_SETICON |
İkon
görüntüleyebilecek biçimde oluşturulmuş bir statik kontrol için, bir ikonun
görüntülenmesini sağlamak amacıyla gönderilir. . wParam parametresi görüntülenecek
ikona ilişkin tutamaç değerini belirtir, lParam parametresi kullanılmaz,
sıfır geçilir. Eğer kontrolde daha önceden bir ikon görüntüleniyorsa fonksiyon
bu ikonun tutamaç değerini döndürür. |
WM_CTLCOLORSTATIC |
Bu
mesaj statik kontrolün yeniden çizilmesi gerektiği durumlarda, kontrolün
ana penceresine gönderilir. wParam parametresi olarak görüntüleme bağlamının
(Display Context - DC) tutamaç değeri, lParam parametresi olarak statik
kontrolün tutamaç değeri verilir. |
Statik
Kontrolün Uygulamaya Gönderdiği Mesajlar
Statik kontrolün
uygulamalara göndereceği mesajları, STN_ öneki kullanılarak isimlendirilmiştir.
Kontrol tarafından bu mesajların gönderilmesini sağlamak için kontrolü oluştururken
SS_NOTIFY pencere biçimini kullanmamız gereklidir. Şimdi bu mesajları ve anlamlarını
inceleyelim :
STATİK
KONTROLÜN GÖNDERDİĞİ MESAJLAR
|
ANLAMI
|
STN_CLICKED |
Kullanıcı tarafından statik kontrol üzerine tıklandığı zaman, kontrolün
ana penceresine gönderilir. Bu mesaj kullanılarak, LOWORD makrosu ile statik
kontrolün tanımlayıcı değeri, HIWORD makrosu kullanılarak statik kontrolün
tutamaç değeri elde edilebilir. |
STN_DBLCLK |
Kullanıcı
tarafından statik kontrol üzerine çift tıklandığı zaman, kontrolün ana penceresine
gönderilir. Bu mesaj kullanılarak, LOWORD makrosu ile statik kontrolün tanımlayıcı
değeri, HIWORD makrosu kullanılarak statik kontrolün tutamaç değeri elde
edilebilir. |
STN_DISABLE |
Statik
kontrol pasif duruma (disabled) getirildiği zaman, kontrolün ana penceresine
gönderilir. Bu mesaj kullanılarak, LOWORD makrosu ile statik kontrolün tanımlayıcı
değeri, HIWORD makrosu kullanılarak statik kontrolün tutamaç değeri elde
edilebilir. |
STN_ENABLE |
Statik
kontrol etkin duruma (enabled) getirildiği zaman, kontrolün ana penceresine
gönderilir. Bu mesaj kullanılarak, LOWORD makrosu ile statik kontrolün tanımlayıcı
değeri, HIWORD makrosu kullanılarak statik kontrolün tutamaç değeri elde
edilebilir. |
Bu yazımızda standart
kontrollerin ne anlama geldiğini, nasıl kullanıldıklarını genel anlamıyla inceledik.
En basit kontrollerden birisi olan statik kontrolü ayrıntılı bir şekilde ele
aldık ve örneklendirdik. Önümüzdeki yazılarda standart kontrolleri incelemeye
devam edeceğiz. Herkese mutlu günler dilerim.
Uygulamaya ilişkin
kaynak kod dosyasını buradan
indirebilirsiniz. (Örnek uygulama Visual Studio .Net 2003’te hazırlanmıştır.)
KAYNAKLAR
- Win32 Programlama
Yardım Sayfaları
Makale:
Windows API - Standart Kontroller ve Statik Kontrol C ve Sistem Programlama Çiğdem Çavdaroğlu
|