Sistem içersinde açılan pencereler birbirinden farklı özelliklere sahip
olabilir. Bu nedenle bu pencereler ayrı kategorilere dâhil edilirler.
Sırasıyla pencere çeşitlerini inceleyelim.
Overlapped (üst üste binen) Pencereler; bu
aslında masaüstünde açmış olduğumuz ve birbiri üzerinde görüntülenerek
aktif duruma getirilen temel pencerelerdir. Aynı zamanda ana form
olarak da anılırlar. Şekil 2.1 de görüntülenen form overlapped pencere
olarak belirtilen pencerelere örnektir.
; Pop-Up Pencereler; genelde
ShowDialog metodu ile açılan pencerelerdir. Bu pencere sınıfına diyalog
kutuları ve mesaj kutuları dâhildir. Ana form üzerinde açılan ve
kullanıcıya bir mesaj vermek ya da kullanıcının bir tercih yapmasını
sağlamak amacıyla kullanılan pencere tipidir. Bu tipte bir pencere
yaratmak için CreateWindowEx() fonksiyonuna WS_POPUP stili aktarılır.
Yaratılan pencereye ait bir başlık çubuğunda oluşturulmak isteniyorsa
WS_CAPTION yine aynı fonksiyona aktarılır.
Alt (Child) Pencereler; bu
pencere stili genelde MDI programlarında kullanılan alt formları
yaratmak için belirtilir. CreateWindowEx() fonksiyonuna WS_CHILD stili
aktarılarak pencere alt form olarak açılabilir. Elbette ki yaratılan
alt formlara ait bir ana form bulunması zorunludur. Bu nedenle
yaratılama esnasında belirtilen fonksiyona ana pencere hangi pencere
olduğu aktarılır. Eğer yaratılacak sınıf WS_CHILD olarak belirtilir ve
ana form belirtilemezse sistem pencereyi yaratmayacaktır.
Alt formun boyutları ise, ana formdan büyük olduğu takdirde ana form
için sistem otomatik olarak yatay ve dikey kaydırma çubukları
oluşturacaktır. Alt formun herhangi bir parçası hiçbir şekilde ana
formun dışında bir noktada görüntülenmeyecektir.
Alt formların yapısı gereği ana formlara gönderilen mesajlar da alt
formları etkileyecektir. Örnek olarak ana formun yok edilmesi önce alt
formun (ya da formların) yok edilmesini sağlayacaktır. Ya da ana formun
gizlenmesi önce alt formun gizlenmesine, ekranda yer değiştirilmesi
önce alt formun yer değiştirmesine neden olacaktır.
İlginç bir şekilde bir alt form istendiği anda alt form olmaktan
çıkarılabilir. Böyle bir mesaj gönderildiğin anda alt form otomatik
olarak daha önceki ana formun dışında bir noktada görüntülenerek ana
form olarak değerlendirilir. Bu işlem SetParent() fonksiyonuna alt form
için null değerinin atanması ile gerçekleştirilir. Aynı zamanda
SetParent() metodu ile istenirse ana form değiştirilebilir.
Tüm bunlara ek olarak alt formlar içinde de alt form oluşturulabilir.
Bu sayı istenildiği kadar arttırılabilir. Ve ayrıca alt formlara
gönderilen sistem mesajları direk olarak alt formlara gönderilir.
Herhangi bir şekilde bu mesajlar ana form üzerinden geçerek alt
formlara gönderilmez. MDI programları daha sonra ayrıca incelenecektir.
Katmanlı (layered) Pencereler; genellikle
çok fazla sayıda görsel içerik bulunduran bu nedenle sistem tarafından
boyanmak için çok fazla zaman ve işlem gerektiren formları, performans
artışı için bu şekilde tanımlayabilirsiniz. Bir katmanlı pencere
oluşturmak için CreateWindowEx() fonksiyonuna WS_EX_LAYERED pencere
stili olarak gönderilir. Ya da pencere yaratıldıktan sonra
SetWindowLong() fonksiyonuna aynı pencere stili gönderilerek yaratılan
pencerenin stili katmanlı olarak ayarlanabilir.
Mesaj Pencereleri; herhangi
bir şekilde görünen bir penceresi olmayan ve sadece sistem mesajlarını
almak ve sisteme mesaj yollamak için kullanılan pencerelerdir. Bu tipte
bir pencere yaratmak için HWND_MESSAGE sabiti CreateWindowEx()
fonksiyonuna gönderilir. Mesaj pencereleri Broadcast mesajları almazlar.
Pencere İlişkileri:
Yaratılan pencereler genelde sistem içerisinde tek başlarına
olmadıkları için yaratılan diğer pencerelerle mutlaka bir ilişkileri
vardır. Bu nedenle açık olan diğer pencerelerle herhangi bir pencerenin
ilişkisi sistem içerisinde sınıflandırılmıştır. Pencereler Ön Plan,
Arka Plan ve Sahibi Bulunan (Owned) pencereler olarak sınıflandırılır.
Ön ve Arka Plan Pencereleri; Sistem
içerisinde bulunan kanalların yaratmış olduğu pencereler, çalışan
kanalın ön plan kanal olması halinde ön plan penceresi, kanalın arka
plan kanalı olması halinde arka plan penceresi olarak yorumlanır. Ön
plan kanallar işlemci zamanından daha fazla kullanırken, arka plan
kanalları daha az zaman kullanırlar. Bu nedenle ön plan pencereleri,
arka plan pencerelerine göre daha fazla işlemci zamanı kullanmış
olurlar.
Sahibi Bulunan Pencereler; tüm alt formlar
bu kategoriye girerler. Aynı zamanda kimi overlapped ve pop-up
pencerelerde bu kategoriye girebilirler. Diyalog kutuları ve mesaj
kutularıda bu kategoriye dâhildir.
Z-Order; pencerelerin
ekranda üst üste gelmesi esnasında görüntülenme sırasına Z-Order denir.
Z-Order sırasında en üstte olan pencere otomatik olarak diğer
pencerelerin üstünde görüntülenir. Bu nedenle aktif pencereler direk
olarak en üst sıradadır. Aynı şekilde yeni açılan bir pencere de en üst
sıraya getirilir. Alt formlarda ise, bir ana forma bağlı olarak açılan
tüm alt formlar kendi içlerinde ayrı bir Z-Order sırasına sahip olular.
Sistemin masaüstündeki Z-Order sırasına alt formlar dahil değildir.
Ancak ve ancak ana formları aktif duruma getirildiğinden ana form
Z-Order sırasında en üste çıkar ve alt formlar yine kendi içlerinde
ayrı bir Z-Order sırasına sahip olurlar. SetWindowPos() ve
DeferWindowPos() fonksiyonları kullanılarak Z-Order sırası
değiştirilebilir. GetTopWindow() fonksiyonu sıra içerisinde en üstte
olan pencerenin handle numarasını döndürür. GetNextWindow()
fonksiyonuda bir sonraki pencerenin handle numarasını döndürür.
Pencere Durumları:
Açılan her pencere 9 farklı durumda olabilir. Aktif, aktif
olmayan (inactive), kullanılamaz (disabled), kullanılabilir (enabled),
saklı (hidden), görünür (visible) simge durumunda, tam ekran ve normal
boyut (restored) olabilir.
Aktif pencereler;
Z-Order sırasında en üstte olan ve kullanıcının giriş yaptığı ve ya
girişini beklediği pencerelerdir. Sistem içerisinde aynı anda sadece
bir pencere aktif olabilir. GetActiveWindow() fonksiyonu kullanılarak
aktif pencerenin handle numarası alınabilir.
Aktif olmayan pencereler; sistem içersinde açık olan fakat Z-Order sırasında en üstte olamayan altta bekleyen pencerelerdir.
Kullanılamaz (disabled) pencereler; sistem
tarafından, aktif durumda olsa bile kullanılamaz duruma getirilebilen,
kullanıcı girişi alamayan ve/veya kullanıcı hareketlerine yanıt
vermeyen pencerelerdir. Bu pencereler kullanıcı girişine izin vermese
bile sistemden ve/veya diğer programlardan mesaj alabilir ve bu
merkezlere mesaj gönderebilirler. Genellikle pencereler üzerindeki
kontrollere uygulanan bu özellik direk olarak formun kendisine de
uygulanabilir. EnableWindow() fonksiyonu kullanılarak bir pencere
kullanılamaz duruma getirilebilir.
İlginç bir
şekilde bir ana formun alt formu kullanılamaz hale getirilmişse, bu
forma uygulanan tüm fare hareketleri sistem tarafından ana forma
yönlendirilir.
Kullanılabilir (enabled) pencereler; açılan
tüm pencereler varsayılan olarak kullanılabilir durumdadır. Yine
EnabledWindow() fonksiyonu kullanılarak kullanılamaz hale getirilen
pencere kullanılabilir duruma getirilebilir. Konu ile ilgili bir
çalışma örnek kodlar arasında bulunabilir.
Saklı (hidden) pencereler; program
tarafından yaratılan ancak saklı olarak belirtildiği için sistem
tarafından boyanmayan ve bu nedenle görüntülenmeyen pencerelerdir.
Saklı pencereler aynı zamanda kullanılamaz (disabled) pencere olarak
yorumlanır. Ekranda görüntülenmeyen pencere kullanıcı girişi alamaz ve
kullanıcı girişlerine yanıt veremez durumdadır.
Ana
formu saklı olan tüm alt formlar saklı olarak belirtilmemiş olsalar
bile, ana forma bağlı olduklarından dolayı onlarda saklı olarak
belirtilerek görüntülenmezler.
Bütün bunlara ek olarak simge durumuna küçültülen pencerelerde nispeten saklı olarak yorumlanabilir.
Görünür (visible) pencereler; varsayılan
olarak program tarafından yaratılan ve sistem tarafından görüntülen tüm
formlar bu kategoriye girerler. Bir form yaratmanın amacı ekseriyetle
kullanıcı girişi almaktır.
Simge durumuna küçültülmüş pencereler; kullanıcı tarafından form üzerinde uygun noktaya tıklanması sonucu görev çubuğuna indirilen pencerelerdir.
Tam ekran pencereler; yine
kullanıcı tarafından uygun noktaya tıklanması ile tüm ekranı (görev
çubuğunun durumuna göre) kaplayacak şekilde büyültülmüş pencerelerdir.
Normal boyut pencereler; açıldığı anda program tarafından belirlenen piksel ölçülerinde görüntülenen pencerelerdir.
Pencere Animasyonu:
Yaratılan pencerelerin görüntülenmesi ve yok edilmesi esnasında sistem
içerisinde belirtilen özel efektler pencereye uygulanabilir.
AnimateWindow() fonksiyonu kullanılarak bu işlem gerçekleştirilebilir.
AW_SLIDE bayrağı kullanılarak pencere kaydırılarak, AW_BLEND gitgide
transparan hale getirilerek, AW_CENTER bayrağı kullanılarak ortadan
dışa ya da dıştan ortaya doğru görüntüden çıkarılır ya da görüntülenir.
Konu ile ilgili çalışma örnek kodlar arasında bulunabilir.
Pencerenin Yok Edilmesi:
Genel anlamda bir program yaratmış olduğu tüm pencereleri yok etmek
zorundadır. Yaratılma işlemi sırasında önce istemci olmayan alan
yaratılıp daha sonra istemci alanı yaratılırken, yok edilme direk
olarak gerçekleşir. DestroyWindow() fonksiyonu kullanılarak pencere
kapatılır. Pencere kapatma komutu gönderildiğinde program, önce
pencereyi görüntüden yok eder daha sonra handle numarasını yok eder en
sonunda da pencere ile ilişkili olan tüm kaynakları (resources) yok
eder. Eğer program pencere ile ilişkili verileri yok etmezse sistem
programın yerine bu kaynakları kendi yok edecektir.
Bir
pencerenin yok edilmesi kayıt edilmiş pencere sınıfının sistemden
silinmesi anlamına gelmez. Programlar aynı pencere sınıfından yine yeni
pencereler yaratabilir.
Aynı
zamanda bir ana formun yok edilmesi, formu yaratan kanalın yok edilmesi
anlamına geldiği için program kapatılır. Bu aşamada ana forma bağlı
olan tüm alt formlarda kapatılır.