Windows İşletim Sisteminin Pencere Yapısı
işletim |
Windows sisteminin pencere
yapısıda kullanılan 5 önemli kavram vardır:
- Ana pencere(top level window, frame window)
- Üst pencere(parent window)
- Alt pencere(child window)
- Owner pencere(owner window)
- Owned pencere(owned window)
Ana pencereler masa üstü
penceresinin alt pencereleriymiş gibi işlem görür. CreateWindow ile hWndParent
parametresi NULL girilerek, pencere biçiminde WS_CHILD kullanılmayarak yaratılırlar.
Ana pencereler doğrudan görev çubuğu(taskbar) üzerinde görünürler. Bir program
istenildiği kadar ana pencereye sahip olabilir(Görev çubuğu ile Ctrl+Alt+Del'e
basıldığında elde edilen görev listesi farklı kavramları ifade eder. Görev
çubuğunda ana pencereler, görev listesinde programlar listelenir). Üst pencere
birden fazla alt pencereye sahip olabilir. Alt pencereler CreateWindow
fonksiyonunda hWndParent parametresi yerine üst pencerenin handle değeri,
pencere biçimi yerine de WS_CHILD kullanılarak yaratılırlar. Alt pencere
kavramı ile owned pencere kavramları çok yakındır. Owned pencere yaratabilmek
için CreateWindow fonksiyonunun hWndParent parametresi yerine üst pencerenin
handle değeri girilir, fakat pencere biçiminde WS_CHILD belirtilmez. Alt
pencere üst pencerenin sınırları dışına çıkamaz ama owned pencere çıkabilir.
Owned pencerenin üst penceresine owner pencere denir. Owned pencereler her
zaman owner pencerelerin üzerinde kalırlar. Owner pencere minimize edildiğinde
owned pencere görüntülenmez. Üst pencerenin bir alt pencere listesi vardır. Üst
pencerenin alt pencerelerine kardeş pencereler denilir(sibliting windows).
Windows pencerelere ilişkin içsel veri yapısını şöyle kurar: Masa üstünün alt
pencere listesinde bütün ana pencereler bulunur. Ana pencerelerin her birinin
alt pencere listesinde ana pencerelerin kendi alt pencereleri bulunmaktadır.
yani masa üstü aslında directory sistemindeki root directory gibi işlem görür.
Alt Pencere Üst Pencere Sistemine İlişkin Faydalı
Fonksiyonlar
GetDlgItem Fonksiyonu
Windows sisteminde
pencerenin türü ne olursa olsun, handle değerleri birbirlerinden farklıdır. Bu
handle değeri pencerenin veri yapısına ilişkin sistem bölgesinin başlabngıç
adresidir. Her pencerenin bir kardeş pencere listesi vardır. Masaüstü
penceresinin kardeş pencere listesi içerisinde ana pencereler bulunur. Farklı
alt pencerelerin ID değerleri aynı olabilir, ancak kardeş pencerelerin ID
değerleri birbirlerinden farklı olmak zorundadır. Bunun için yalnızca alt
pencerenin ID değerini vererek alt pencerenin handle değerini elde edemeyiz.
Alt pencerenin ID değeri dışında ayrıca üst pencerenin handle değerini de
verirsekalt pencerenin handle değerini elde edebiliriz. Bu API fonksiyonu alt
pencerenin ID ve üst pencerenin handle değeri verilerek alt pencerenin handle
değerini elde etmekte kullanılır. Prototipi:
HWND GetDlgItem( HWND hDlg, int nID);
Bu işlem tipik olarak dialog pencerelerinde kullanıldığı için
fonksiyonların isimlendirilmesi dialog çağrışımı yapacak biçimde yapılmıştır.
Oysa bu fonksiyonlar her türlü alt pencere üst pencere sisteminde çalışır.
GetDlgCtrlId Fonksiyonu
Bu fonksiyon GetDlgItem
fonksiyonunun mantıksal olarak tersini yapmaktadır. Yani alt pencerenin handle
değeri ile alt pencerenin ID değerinin elde edilmesini sağlar. Prototipi:
int
GetDlgCtrlId(HWND hWndChild);
SendDlgItemMessage Fonksiyonu
Bu fonksiyon aslında kendi
içerisinde GetDlgItem ve SendMessage fonksiyonlarını çağırmaktadır. Üst
pencerenin handle, alt pencerenin ID değerini alarak alt pencereye mesaj
gönderir. Prototipi:
LONG
SendDlgItemMessage(
HWND hMainWnd,
int nID,
UINT message,
WPARAM wParam,
LPARAM lParam
);
Fonksiyon
aslında şöyle yazılmıştır:
LONG
SendDlgItemMessage(
HWND hMainWnd, int nID, UINT
message,
WPARAM wParam, LPARAM lParam)
{
HWND hChildWnd;
hChildWnd = GetDlgItem(hmainWnd,
hID);
return SendMessage(hChildWnd,
message, wParam, lParam);
}
Dialog Kaynağının Oluşturulması
Bir dialog kaynağı
aşağıdaki genel biçim ile belirtilir:
<Kaynak
İsimi> <dialog> [Pencere Biçim]
{
Kontrol bilgileri
}
Buradaki pencere biçimi dialog penceresinin yaratılmasında kullanılan
pencere biçimidir. Genellikle WS_POPUP içerir. WS_POPUP owned pencere yaratmak
için tercih edilen bir pencere biçimdir. Pencere başlığı içermez. Bunun yanı
sıra üst pencere yaratılırken kullanılan diğer pencere biçimleri buraya
eklenebilir. Örneğin dialog penceresi WS_CAPTION eklenebilir, bu durumda dialog
penceresinin başlığı çıkar, ya da WS_SYSMENU eklenerek sistem menüsüne sahip
olması sağlanabilir. Hatta owned pencere yerine alt pencere WS_CHILD eklenerek
oluşturulabilir(WS_POPUP ile WS_CHILD birlikte kullanılamaz). Dialog kaynağının
içerisine kontrol bilgileri yerleştirilir. Her kontrolün bir ismi vardır.
Ayrıca kontrollerin pencere biçimleri, ID numaraları koordinatları belirtilir.
Dialog içerisindeki kontrollerin isimleri şöyledir:
CTEXT
|
static kontrol
|
PUSHBUTTON
|
push button kontrolü
|
LISTBOX
|
list box kontrolü
|
COMBOBOX
|
combo box kontrolü
|
EDITTEXT
|
edit box kontrolü
|
DEFPUSHBUTTON
|
default push button kontrolü
|
ICON
|
icon kontrolü
|
Tabii aslında dialog
kaynağı da normal olarak kaynak editörü ile oluşturulur. Kaynak editöründe
dialog penceresi ve kontroller görsel olarak yerleştirilir. Kaynak editörü
bunun kaynak dilindeki karşılığını yazar.
Aslında dialog kaynağında
belirtilen herşey dialog penceresinin ve içerisindeki kontrollerin CreateWindow
fonksiyonu ile yaratılması için gereksinim duyulan parametre bilgileridir.
Dialog penceresi içerisinde programcının oluşturduğu kontroller de
kullanılabilir.
Modal Dialog Pencereleri
Modal dialog pencereleri
DialogBox API fonksiyonuyla yaratılır, EndDialog API fonksiyonuyla
sonlandırılır. Tabii dialog penceresi de bir pencere olduğuna göre onun da bir
pencere fonksiyonunun olması gerekir. Dialog penceresi üzerindeki bir push
button kontrolüne click yapıldığında, push button kontrolü dialog pencerisine
ilişkin pencere fonksiyonunu WM_COMMAND mesajıyla çağırır. Dialog
pencerelerinin pencere fonksiyonlarına gerçek pencere fonksiyonu denir. Bu
fonksiyonlar user32.dll içerisindedir ve programcıdan gizlenmiştir. DialogBox
API fonksiyonu programcının oluşturduğu yapay bir pencere fonksiyonunu
parametre olarak alır. Dialog kontrolleri üzerinde bir işlem gerçekleştiğinde
gizlenmiş gerçek dialog penceresi fonksiyonu programcının yapay dialog
penceresi fonksiyonunu çağırır. Gerçek dialog pencere fonksiyonunun
gizlenmesinin nedeni şöyle açıklanabilir: Gerçek dialog pencere fonksiyonu
WM_CREATE mesajı içerisinde kontrolleri yaratır, ok tuşlarına ve tab tuşuna
duyarlı işlemler yapar, daha pek çok ayrıntılı alt seviye işlemleri
gerçekleştirir. Yani yazılması karmaşıktır. Oysa yapay dialog pencere
fonksiyonu yalnızca kontrollerle iletişim kurmak için temel işlemleri yapacak
biçimde tasarlanır. DialogBox API fonksiyonunun parametrik yapısı şöyledir:
int DialogBox(
HINSTANCE hInstance,
LPCTSTR lpResource,
HWND hParentWnd,
DLGPROC lpDialogFunc
);
Fonksiyonun
birinci parametresi WinMain fonksiyonuna geçirilen hInstance değeridir. İkinci
parametre dialog kaynağının ismidir. Üçüncü parametre dialog penceresinin
açılacağı üst pencerenin handle değeridir. Dördüncü parametre yapay dialog
penceresi fonksiyonuna ilişkin fonksiyon göstericisidir. Buradaki DLGPROC
windows.h içerisinde aşağıdaki gibi typedef edilmiştir:
typedef BOOL (CALLBACK
*DLGPROC)(HWND, UINST, WPARAM, LPARAM);
Yapay Dialog Penceresi Fonksiyonunun Tasarımı
Yapay pencere
fonksiyonunun geri dönüş değeri normalinden faklı olarak LRESULT(long) değil
BOOL(int) biçimindedir. Normal pencere fonksiyonunda bir mesaj işlenmişse 0
değeri ile işlenmemişse DefWindowProc fonksiyonunun geri dönüş değeriyle geri
döner. Yapay dialog pencere foınksiyonunun geri dönüş değeri mesaj işlenmemişse
FALSE ile işlenmişse TRUE değeriyle geri döner. Aslında yapay dialog pencere
fonksiyonu FALSE ile geri döndüğünde gerçek pencere fonksiyonu bu mesajın
işlenmediğini anlaarak DefWindowProc fonksiyonunu çağırır. bu durumda
DefWindowProc fonksiyonu yapay dialog penceresi fonksiyonunun içerisinde
çağırılmamalıdır.
0 yorum: