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: