pencere fonksiyonunun geri dönüş değeri

2 Temmuz 2013 Salı Unknown 0 yorum
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: