windows işletim sisteminin pencere yapısı

2 Temmuz 2013 Salı Unknown 0 yorum

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: