seo dialog penceresi

2 Temmuz 2013 Salı Unknown 0 yorum

WM_INITDIALOG Mesajı


            Yapay dialog penceresi fonksiyonunda WM_CREATE mesajı işlenmeye çalışılırsa programcı şunu bilmelidir: Bu noktada henüz dialog penceresinin kendi penceresi yaratılmış olmasına karşın içerisindeki kontroller henüz yaratılmamıştır. Dolayısıyla bu mesajın yapay dialog penceresi içerisinde işlenmesi pek faydalı değildir. Oysa kontroller yaratıldıktan sonra gerçek pencere fonksiyonu yapay pencere fonksiyonunu WM_INITDIALOG mesajıyla çağırır. Bu noktada kontroller yaratılmıştır ama görünür halde değildir. Yani gerçek dialog penceresi fonksiyonunun WM_CREATE mesaında şunlar yapılmıştır:
1. Yapay dialog penceresi fonksiyonu WM_CREATE mesajıyla çağırılmıştır.
2. Kontroller WS_VISIBLE pencere biçimi olmadan yaratılmıştır.
3. Yapay dialog penceresi fonksiyonu WM_INITDIALOG mesajıyla çağırılmıştır.
4. Kontroller ShowWindow fonksiyonuyla görüntülenmiştir. 

Örnek Dialog Penceresi Programı


            Dağıtılan örnek programda menü'den bir seçim yapıldığında bir dialog penceresi oluşturulmuştur. Dialog penceresi içerisinde 4 tane kontrol yaratılmıştır. Edit box içerisine yazılan yazı bir push button'a basıldığında list box'a eklenmiştir. Diğer push button'a basıldığında dialog penceresi sonlandırılmıştır. Pencere açıldığında list box'ın içerisinde iki yazı görünmektedir. Bu yazılar WM_INITDIALOG mesajında eklenmiştir. EndDialog fonksiyonu doğal olarak yapay dialog penceresi fonksiyonu içerisinde çağırılmalıdır. DialogBox API fonksiyonu dialog pencerelerini ve kontrolleri yarattıktan sonra kendi mesaj döngüsüne girer. Tıpkı WinMain'deki mesaj döngüsü gibi kuruktan mesajları alır, dialog penceresine ilişkinse DispatchMessage ile işler, başka bir pencereye ilişkinse kuyruktan alarak görmemezlikten gelir ve siler.Böylece modal dialog penceresi açıldığında kapanana kadar arka planda bir işlem gerçekleşemez. yapay pencere fonksiyonu içerisinde EndDialog API fonksiyonu çağırıldığında gerçek dialog penceresi fonksiyonu dialog penceresini kapatır, DialogBox içerisindeki mesaj döngüsünden çıkılır, böylece akış DialogBox fonksiyonundan devam eder.

Default Push Button

            Deafult push button sadece dialog pencerelerinde kullanılır. Dialog penceresi üzerinde hiçbir push button kontrolü aktif kontrol değilse(örneğin o anda edit kontrolü üzerinde yazı yazılıyor olabilir) enter tuşuna basıldığında üzerine click yapılmış varsayılan push button kontroldür. Bir dialog üzerinde tek bir DEFPUSHBUTTON kontrolü olmalıdır. Eğer hiçbir push button DEFPUSHBUTTON değilse enter tuşuna basıldığında LOWORD(wParam) IDOK olacak biçimde WM_COMMAND mesajı çağırılır. Dialog penceresi içerisinde ESC ya da Ctrl+break tuşlarına basıldığında WM_COMMAND mesajı LOWORD(wParam) IDCANCEL olacak biçimde çağırılır.

Sınıf Çalışması: Programın menüsü şu biçimdedir:
Dialog1
Dialog2
Exit

Dialog1: Adı Soyadı ve bu değeri alacak bir edit box, No ve bu değeri alacak bir edit box bir list box, ok ve exit pushbutton'ları
Dialog2: Static kontrol ve ok tuşu

Dialog Tabanlı Uygulamalar

            Dialog tabanlı çalışma programda bir ana pencere olmadan yalnızca dialog penceresi açarak çalışma anlamına gelir. Tabii bu durumda DialogBox fonksiyonunda hWndParent parametresi olarak NULL girmek gerekir. Dialog tabanlı çalışma küçük uygulamalarda hızlı kod yazma olanağını sağlar. Dialog tabanlı çalışmada WinMain içerisinde yalnızca DialogBox fonksiyonuyla dialog penceresi açılır. Başka bir koda gereksinim duyulmaz.


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdParam, int nCmdShow)
{
                return DialogBox(
                               hInstace,
                               MAKEINTRESOURCE(ID_DIALOG),
                               NULL,
                               (DLGPROG)DialogProc
                );
}

Böylece yalnızca yapay dialog penceresi fonksiyonunun yazılması ile küçük uygulamalar gerçekleştirilebilir. Herhangi bir WNDCLASS yapısının tanıtılması ve mesaj döngüsünün oluşturulması gerekmez, çünkü DialogBox fonksiyonu zaten dialog penceresinin ana penceresini yaratmak için önceden tanımlanmış bir sınıfı kullanmaktadır. DialogBox fonksiyonu ayrıca kendi mesaj döngüsüne sahip olduğu için WinMain içerisinde bir mesaj döngüsü yaratmaya gerek kalmaz. İçinden çıkılabilen en basit diloag pencere fonksiyonu şöyle yapılabilir:

BOOL CALLBACK DialogProc(HWND hWnd, UINT iMessage,
WPARAM wParam, LPARAM lParam)
{
                if (iMessage == WM_COMMAND && LOWORD(wParam) == IDOK) {
                               EndDialog(hWnd, 0);
                               return TRUE;
                }
                return FALSE;
}

Bu minimum kodla yazılmış olan dialog penceresi fonksiyonu dialog mesajlarını işlemez ancak test amacıyla kullanılabilir.

Özel Kontroller


            Programcı kendisinin yarattığı bir kontrolü de dialog penceresinin içerisine yerleştirebilir. Gerçek dialog penceresi fonksiyonu ilgili kontrolü CreateWindow fonksiyonuyla yaratabilmek için kontrolün yaratılacağı sınıf ismine gerek duyar. Aslında dialog penceresinin resource'unun içinde kullanılan PUSHBUTTON, EDITTEXT gibi dialog elemanları bu kontrollerin yaratılması esnasında kullanılacak sınıf ismini belirtir. En genel dialog kaynağı elemanı "CONTROL" diye isimlendirilen elemandır. Çünkü bu eleman içerisinde yaratuılacak kontrolün sınıfı belirtilebilir. Böylece PUSHBUTTON, EDITTEXT, STATIC gibi ayrı anahtar sözcükler kullanmak yerine bu kontrollerin hepsi sınıf ismi belirtilerek CONTROL anahtar öszcüğüyle belirtilebilir. Yani dialog elemanı olarak PUSHBUTTON yazmak yerine CONTROL yazarak button biçiminde sınıf ismi belirtmek aynı anlama gelir.


CONTROL Elemanının Syntax'i


CONTROL "başlık yazısı",
                alt_pencere_id_değeri,
                "sınıf ismi",
                pencere biçimi,
                x,
                y,
                genişlik,
                yükseklik

Örneğin aşağıdaki iki kontrol elemanı eşdeğer anlamdadır:

PUSHBUTTON "Edit Ok",
                IB_PBOK,
                75,
                32,
                50,
                14,
                WS_CHILD | WS_VISIBLE
CONTROL "Edit Ok",
                ID_PBOK,
                "button",
                WS_CHILD | WS_VISIBLE,
                75,
                32,
                50,

                14

0 yorum: