Pencere Fonksiyonunun Geri Dönüş
Değeri
işletim |
Pencere
fonksiyonunun geri dönüş değeri DispatchMessage fonksiyonu tarafından
yorumlanır. Fonksiyonun geri dönüş değeri mesajdan mesaja değişir. Yani hangi
mesaj geldiğinde neyle geri dönüleceği önceden bilinmek zorundadır. Ancak aksi
söylenmediği sürece pencere fonksiyonu eğer mesajı işlemişse 0 ile geri
dönmelidir. İşlememişse DefWindowProc fonksiyonunun geri dönüş değeriyle geri
dönmelidir.
LRESULT
CALLBACK WindowProc(HWND hWnd, UINT, message, WPARAM wParam, LPARAM lParam);
{
switch(message) {
case .......... :
........
........
break;
case .......... :
........
........
break;
default:
return
DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
Pencerenin Kapatılması Sırasında
Gerçekleşen İşlemler
Bir
pencereye kapatmak için klik yapıldığında ya da klavye ile Alt+F4 tuşlarına
basıldığında Windows yalnızca mesaj kuyruğuna WM_CLOSE mesajını bırakır. Bu
mesaja karşılık DefWindowProc DestroyWindow API fonksiyonunu çağırmaktadır. Bu
API fonksiyonu pencereyi kapar ve mesaj kuyruğuna WM_DESTROY mesajını koyar.
WM_DESTROY mesajı genellikle programcı tarafından işlenir. Programcı bu mesaj
karşılığında PostQuitMessage API fonksiyonunu çağırmalıdır(zaten DefWindowProc
fonksiyonu da default olarak PostQuitMessage fonksiyonunu çağırır), bu fonksiyon
yalnızca kuyruğa WM_QUIT mesajını yerleştirir. GetMessage fonksiyonu da bu
mesajı alarak 0 ile geri döner ve WinMain sonlanır.
Visual C++ Geliştirme Sisteminin Kullanılması
Windows altında geliştirme
ortamlarında programlama sistemi karmaşık olduğu için mutlaka proje dosyası
oluşturularak çalışılır. Uygun bir proje dosyası oluşturabilmek için File =>
New seçilir. Eğer Win32 Console Application seçilirse konsol programı
yazılabilir. Bir konsol programı tamamen DOS'teki bilgilerle yazılabilir. Ancak
Windows'un grafik özellikleri kullanılamaz. Eğer Win32 Application seçilirse
API düzeyinde programlama yapılabilir. 6.0 sürümünde iskelet programı oluşturan
bir wizard da yerleştirilmiştir. Tüm projeler için ayrı bir dizin açılır ve
proje dosyaları o dizin içerisine yerleştirilir. Dizin proje ismiyle aynı
isimde olur. Açılan dizin içerisine projedeki bütün kaynak dosyalar
yerleştirilir. Proje dizininin altında res ve debug/release isimli iki dizin
oluşturulur(bu genellikle debug olur, program kaynak kullanmamışsa res dizini
açılmaz). Res dizini içerisinde kaynak kullanımına ilişkin dosyalar bulunur.
Debug/release'in içerisinde bütün obj modüller, exe dosyaları ve precompiled
header dosyası bulunur. Precompiled header dosyası başlık dosyalarını çabuk
analiz etmek için gerekir, çok büyük bir dosyadır. Bir projeyi diskete almak
için önce debug/release dizini silinmeli ve proje tüm alt dizinleriyle beraber
alınmalıdır. Bir proje yaratıldığında bütün proje işlemleri ismine proje çalışma
alanı(project workspace) denilen bir pencere yardımıyla yürütülür. Proje
çalışma alanı penceresi kapatılabilir(projenin kapandığı anlamına gelmez), daha
sonra Alt+0 tuşları ile açılabilir. Bir projenin tamamen kapatılması için
File=>Close Workspace seçilmelidir. Proje çalışma alanı penceresinin 4 alt
penceresi vardır.
Class View:
|
Burada bütün C++'taki sınıflar C'deki fonksiyonlar listelenir. Buradaki
bir elemanın üzerine double click yapılırsa o fonksiyonun tanımlamasının
bulunduğu yere gidilebilir.
|
File View:
|
Burada projenin içindeki dosyaların listesi bulunur. Bu pencere aynı
zamanda projeye dosya eklemek ve projeden dosya çıkarmak için de kullanılır.
Eklemek için projenin üzerinde sağ fare tuşuna basılıp Add Files To Project
seçilerek yapılır.
|
Resource View:
|
Bu pencere program kaynak kullanıyorsa yaratılır. Kaynak işlemleri bu
pencereden izlenebilir.
|
Info View:
|
Yardım almakta kullanılır.
|
Programın Derlenmesi ve Çalıştırılması
Editördeki program
Build=>Compile menüsüyle derlenir(Ctrl+F7). Proje içerisindeki bütün
dosyaları ve kaynak dosyasını derleyip hep beraber link ederek exe yapmak için
Build=>Build seçilir(F7). Bu seçenek yalnızca değişmiş olan dosyaları
yeniden derler. Koşulsuz bütün dosyaları derleyip exe yapmak için
Build=>Rebuild seçilir. Bir programı çalıştırmak için Build=>execute
seçilir(Ctrl+F5). Tabii değişen dosyalar bu arada tekrar derlenir. Bir projeyi
açmak için File=>Open Workspace.
Bir fonksiyonun pencere
fonksiyonu olduğunu belirtmek için o fonksiyon isminin WndClass yapısının
lpfnWndProc elemanına yazılması gerekir.
Windows Programlamada Yardım İşlemleri
Windows altında
programlama için iyi bir yardım desteğinin olması gerekir. Visual C++
geliştirme ortamının Online Book diye isimlendirilen bir yardım desteği vardır.
Visual C++ 6.0 sürümünde yardım desteği MSDN programının ayrıca install
edilmesiyle sağlanır. Online Book içerisinde sistemin orijinal kitapları
bulundurulmaktadır.
Mouse Mesajları
Bir pencerenin başlık
kısmı çıkartılmış bölgesine çalışma alanı(client area) denir. Çalışma alanının
sol üst köşegeni pek çok işlem için orijin noktası belirtir. Mouse pencerenin çalışma alanı içerisinde bir yerde
tıklandığında ve çekildiğinde Windows mesaj kuyuruğuna WM_LBUTTONDOWN,
WM_RBUTTONDOWN, WM_LBUTTONUP, WM_RBUTTONUP mesajlarını ekler. Bu mesajların
lParam ve lParam parametreleri şu bilgileri içerir:
wParam: Click yapıldığında aynı zamanda bir tuşa basılıp basılmadığını
belirtir. Şunlardan oluşur:
MK_CONTROL
MK_LBUTTON
MK_RBUTTON
MK_MBUTTON
MK_SHIFT
lParam: Mouse'un click yapıldığı pixel pozisyonudur.
xPos =
LOWRD(lParam);
yPos =
HIWORD(lParam);
LOWORD
ve HIWORD makroları 32 bit bir bilginin yüksek anlamlı ve düşük anlamlı 2
byte'ını elde etmek için kullanılır.
#define HIWORD(x) ((WORD) (x) >> 16)
#define LOWORD(x) ((WORD) (x))
Bu makrolar windows.h içerisinde tanımlanmıştır.
MessageBox Fonksiyonu
Windows'ta acil bir mesaj
basmak için MessageBox API fonksiyonu kullanılır. Bu fonksiyon ile pencere
başlığı, pencerenin içerisindeki mesaj, istenen tuş takımı ve görüntülenecek
ikon belirlenebilir.
int MessageBox(
HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption
UINT uType
);
Fonksiyonun
birinci parametresi messagebox penceresinin çıkartılacağı üst pencerenin handle
değeridir. Bu parametre NULL olarak girilebilir(messagebox yaratmak için bir
pencere yaratmak gerekli değildir). Yani programın hiçbir pencereyi olmasa bile
messagebox çıkartılabilir. İkinci parametresi pencerenin içine yazılacak
yazının başlangıç adresini alır. Üçüncü parametresi pencerenin başlık yazısını
belirtir. Dördüncü parametresi tuş takımı ve ikon görüntüsünü belirler. Tuş
takımları şunlar olabilir:
MB_ABORTRETRYIGNORE
MB_OK
MB_OKCANCEL
MB_YESNO
MB_YESNOCANCEL
İkon görüntüsü şunlar olabilir:
MB_ICONEXCLAMATION
MB_ICONWARNING
MB_ICONINFORMATION
MB_ICONASTERIKS
MB_ICONQUESTION
MB_ICONSTOP
Tuş takımıyla ikon
görüntüsü bit OR işlemine sokularak birleştirilebilir. Örneğin: MB_OK |
MB_ICONEXCLAMATION
Tuş takımlarından bir
tanesi default olarak seçilebilir. Default tuş enter tuşuna basıldığında seçilmiş
kabul edilen tuştur. Default tuşu belirlemek için 3 tane sembolik sabit vardır:
MB_DEFBUTTON1
MB_DEFBUTTON2
MB_DEFBUTTON3
Bu sembolik sabitler de diğerleriyle birleştirilerek kullanılırlar.
Örneğin:
MB_YESNOCANCEL | MB_ICON_EXCLAMATION | MB_DEFBUTTON3
Fonksiyonun geri dönüş değeri hangi tuşa basılarak pencerenin kapatıldığı
bilgisini verir. Şunlardan bir tanesi olabilir:
ID_ABORT
ID_CANCEL
ID_IGNORE
ID_NO
ID_OK
ID_RETRY
ID_YES
Mouse'un sol tuşuna basıldığında messagebox çıkartan uygulama:
LRESULT CALLBACK
WndProc(HWND hwnd, UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch (message) {
case WM_DESTROY:
PostQuitMessage(0);
break;
case
WM_LBUTTONDOWN:
MessageBox(hwnd, "Deneme",
"Deneme", MB_YESNOCANCEL |
MB_ICONSTOP | MB_DEFBUTTON2);
break;
default:
return
DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
Sınıf çalışması: Farenin sol tuşuna basıldığında yesnocancel messagebox'ı
gözükecek, bunlardan bir tanesi seçildiğinde başka bi messagebox ile hangi
tuş'a basıldığı yazdırılacak.
LRESULT CALLBACK
WndProc(HWND hwnd, UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch (message) {
case WM_DESTROY:
PostQuitMessage(0);
break;
case
WM_LBUTTONDOWN:
iMsgBoxReturnValue = MessageBox(hwnd, "Deneme yapıyom ben",
"Deneme dedik aşşaada", MB_YESNOCANCEL | MB_ICONSTOP |
MB_DEFBUTTON2);
switch
(iMsgBoxReturnValue) {
case
IDYES:
MessageBox(hwnd, "Yes'e bastın kardeş", "Deneme", MB_OK
| MB_ICONSTOP);
break;
case
IDNO:
MessageBox(hwnd, "No'ya bastın kardeş", "Deneme", MB_OK
| MB_ICONSTOP);
break;
case
IDCANCEL:
MessageBox(hwnd, "Cancel'a bastın kardeş", "Deneme",
MB_OK | MB_ICONSTOP);
break;
}
break;
default:
return
DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
0 yorum: