Windows
API programlama
ile oluşturulan uygulamalarda, programın kullanıcı ile olan
etkileşimini sağlamak
için kullanıcıya grafik ara yüzler sunulur. Bu grafik ara yüzler de,
daha önceki
yazılarımızda değindiğimiz pencerelerdir. Konsol uygulamalarının
aksine, GUI
uygulamalarında kullanıcıdan veri almak ve kullanıcıya sonuçları
iletmek için
bu ara yüzler üzerindeki kontroller ile mesajlaşma yöntemi kullanılır.
Pencereler
oluşturulurken, genellikle bir konuya ilişkin olan tüm işlemleri yapan
kontroller
bir pencereye yerleştirilir. Böylece uygulama içerisindeki her pencere
belli
bir menüyü, komutu kapsar. Bu noktada tasarlayacağımız yapı,
programımızın görsel
olarak zenginliğini artırıcı ve kolayca kullanılabilen bir yapı
olmalıdır.
Uygulamalarda ana
menüyü içeren ve programın başlatıldığı sırada açılan bir ana pencere
vardır.
Diğer pencereler, bu ana pencere içerisinde, tasarladığımız yapıya
uygun şekilde
oluşturulur. Windows sistemi, pencereleri hiyerarşik bir düzende
tuttuğu bir
pencere sistemine sahiptir. Uygulamalarımızda oluşturduğumuz
pencereler de bu
sisteme dahil edilerek yönetilirler. Oluşturduğumuz her pencere için
sistem
tarafından tutamaç (handle) denilen bir değer üretilir. Bu tutamaç
değerleri,
pencerelere ilişkin işlem yapan fonksiyonlarda parametre değişkeni
olarak programcıdan
istenir. Sistemin pencere için ürettiği bu tutamaç değeri HWND
türünden bir
göstericidir. Bu değerler, pencere açık olduğu sürece sistem
tarafından saklanır.
Pencerenin kapatılmasıyla bu değer serbest bırakılır. Windows
sistemlerinde
pencerenin açıldığı yeri, sınırlarını ve pencerenin ana özelliklerini
belirleyen
birkaç çeşit pencereden söz edilebilir. Bu yazımızda pencere
sistemine, pencere
çeşitlerine ve bunların nasıl oluşturulduğuna, ne amaçla
kullanıldığına değineceğiz.
Windows
sistemindeki
pencere biçimi kavramları şöyle sıralanabilir :
1.
Masaüstü pencereleri
(Desktop)
2. Ana pencereler (top level)
3. Alt pencereler (child)
4. Üst pencereler (parent)
5. Kardeş pencereler (siblings)
6. Sahiplenilmiş pencere (owned)
Şimdi bu
kavramları
sırayla ele alalım.
1.
MASAÜSTÜ PENCERELERİ (DESKTOP WINDOWS)
Sistemde
en dışta
kalan pencereye ’Masaüstü Penceresi’ denmektedir. Windows’un kendi
masaüstü
ekranı aslında bir penceredir. Windows başlatıldığında masaüstü
penceresi otomatik
olarak yaratılır. Masaüstü, tüm uygulamaların oluşturduğu pencereler
için temel
teşkil eden sistem-tanımlı bir penceredir. Bu pencereye bir görüntü
dosyası
atanır ve bu görüntü duvar kağıdı olarak tüm ekranı kaplar. Sistemin
masaüstü
penceresinin tutamaç değerini almak için GetDesktopWindow API
fonksiyonu kullanılabilir.
SystemParametersInfo isimli fonksiyona SPI_SETDESKWALLPAPER sembolik
sabiti
ve bir görüntü dosyasını işaret eden gösterici parametre değişkeni
olarak geçilerek
masaüstü görüntüsü kodlama yoluyla değiştirilebilir. Bu fonksiyonların
parametrik
yapıları şöyledir :
HWND GetDesktopWindow(VOID);
BOOL SystemParametersInfo
(
    UINT uiAction,    // Sistem
parametresi
    UINT uiParam,    // Yapılacak işleme
bağlı
bir parametre
    PVOID pvParam, // Yapılacak işleme bağlı bir
parametre
    UINT fWinIni      //
Güncelleme bayrağı
);
|
GetDesktopWindow
fonksiyonunun parametre değişkeni yoktur. Bize geriye HWND türünden
bir gösterici
döndürür. Bu gösterici, masaüstü penceresi tutamacıdır.
SystemParametersInfo
fonksiyonu, sistem parametrelerinin sorgulanması veya değiştirilmesi
amacıyla
kullanılır. Masaüstü arka plan görüntüsünü değiştirmek için,
fonksiyona sistem
parametresi olarak SPI_SETDESKWALLPAPER sabiti geçilmelidir. pvParam
parametresi
olarak da görüntü dosyasının yolunu belirten bir karakter katarı
geçilir.
2.
ANA PENCERELER (TOP LEVEL WINDOWS)
Bu
pencereler,
masaüstüne açılan pencerelerdir. CreateWindow fonksiyonu ile bir ana
pencere
oluştururken hWndParent parametresi NULL olarak belirtilir. hWndParent
parametre
değişkeni, oluşturulan pencerenin sınırlarını belirleyen pencere
olarak düşünülebilir.
Bu parametre değişkeni için NULL geçildiğinde bu, pencerenin doğrudan
masaüstüne
açılacağı anlamına gelir. CraeteWindow fonksiyonunun, pencerenin
biçimine ilişkin
parametre değişkeni olan dwStyle’a vereceğimiz değer de pencere
çeşidine göre
belirlenir. Ana pencere yaratırken pencere biçimi olarak WS_OVERLAPPED
veya
WS_OVERLAPPEDWINDOW biçimi girilmelidir, WS_CHILD veya WS_POPUP
biçimleri girilmemelidir.
WS_OVERLAPPEDWINDOW sabiti WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU,
WS_THICKFRAME,
WS_MINIMIZEBOX ve WS_MAXIMIZEBOX sabitlerinin birleşimidir.
3.
ALT PENCERELER (CHILD WINDOWS)
Alt
pencereler,
belli bir pencerenin (üst pencerelerinin) sınırları içerisinde kalan
penceredir.
Kullanışlı bir ara yüz sunabilmek için, genellikle uygulamaya ait ana
pencere,
birbirinden farklı işlemleri yapan alt pencerelere bölünür.
CreateWindow fonksiyonu
ile alt pencere oluştururken hWndParent parametre değişkeni olarak bu
pencerenin
üst penceresinin tutamaç değeri girilir. Pencere biçimi olarak da
WS_CHILD sembolik
sabiti girilir. Her alt pencere mutlaka bir tane üst pencereye sahip
olmak zorundadır.
CreateWindow fonksiyonunun parametre değişkenleri bu duruma uygun
girilmezse
Windows pencereyi oluşturmaz. Eğer alt pencere, üst penceresi ile aynı
pencere
sınıfı kullanılarak yaratılırsa, aynı pencere fonksiyonunu
paylaşacakları için
davranışları da üst pencerenin davranışları gibi olacaktır. ’Child’
biçimine
sahip pencereler, menüye sahip olamazlar.
4.
ÜST PENCERELER (PARENT WINDOWS)
Üst
pencereler,
alt pencerelerin sınırlarını belirleyen ve onu kapsayan pencerelerdir.
Bir pencerenin
üst penceresi sadece bir tane olabilir, ancak bir pencerenin birden
fazla sayıda
alt penceresi olabilir. Alt pencereler de birbirleri arasında alt-üst
ilişkisi
içerisinde olabilirler. Üst pencereler, WS_OVERLAPPED, WS_POPUP veya
WS_CHILD
biçimine sahip olan pencereler olabilirler. Alt pencerelerin
konumlandırılması,
onların üst pencerelerinin sol üst köşeleri baz alınarak
yapılmaktadır. Alt
pencereler, üst pencerelerinin sınırları dışarısına çıkamazlar, üst
pencere
sınırlarını taşan kısımları Windows tarafından kesilir. Üst
pencerelerin davranışları,
alt pencerelerini de etkiler. Örneğin bir üst pencere yok edildiği
zaman, ona
ait alt pencereler bu işlem gerçekleşmeden önce yok edilir. Bir üst
pencere
gizlendiğinde, yine aynı şekilde ona ait olan alt pencereler bu işlem
gerçekleşmeden
önce gizlenir. Üst pencere hareket ettirildiğinde ona ait olan alt
pencereler
de üst pencere ile birlikte hareket ettirilir. Üst pencere
gösterildiğinde,
ona ait olan alt pencereler bu işlem gerçekleştikten sonra gösterilir.
5.
KARDEŞ PENCERELER (SIBLING WINDOWS)
Üst
penceresi aynı
olan alt pencerelere, kardeş pencereler denmektedir. Kardeş
pencereler, onları
birbirlerinden ayırt etmek amacıyla kullanılan bir ID değerine
sahiptirler.
Bu ID değerleri farklı olmak zorunda değildir, ancak pencerelerin
ayırt edilebilmesi
açısından farklı değerler verilmesi önemlidir. CreateWindow
fonksiyonunun hMenu
isimli parametre değişkeni menü belirlemede kullanılıyordu. Eğer
yarattığımız
pencere, alt pencere ise bu parametre değişkeni için pencerenin ID
değeri geçilmelidir.
Windows, kardeş pencereleri kendi içerisinde bir bağlı liste
içerisinde tutar.
Bu bağlı liste, Z Sırası olarak bilinir. Bu sırada, en son yaratılan
kardeş
pencere en önde yer alır. Kardeş pencerelerin ekrandaki görünümleri de
Z sırasındaki
konumlarına bağlıdır. Z sırasının en önünde yer alan pencere, ekranda
da en
önde görünecektir.
6.
SAHİPLENİLMİŞ PENCERELER (OWNED WINDOWS)
Sahiplenilmiş pencereler,
her zaman üst penceresinin önünde görünen alt pencerelerdir.
CreateWindow fonksiyonu
ile bu biçimde bir pencere yaratılacağı zaman, hWndParent parametresi
olarak
üst pencerenin tutamaç değeri, dwStyle parametresi olarak da WS_POPUP
sabiti
girilmelidir. Sahiplenilmiş bir alt pencere, üst penceresi
küçültüldüğü zaman
otomatik olarak küçültülür. Sahiplenilmiş bir pencerenin üst penceresi
bir alt
pencere olamaz. Eğer CreateWindow fonksiyonunda hWndParent parametresi
için
bir alt pencerenin tutamaç değeri girilirse, bu durumda Windows o alt
pencereye
ilişkin ana pencereyi üst pencere olarak atar. Sahiplenilmiş bir
pencerenin
üst penceresi, bir kere atandıktan sonra bir daha değiştirilemez.
Ayrıca bu
pencere, diğer alt pencerelerden farklı olarak, üst penceresinin
sınırları dışarısına
çıkabilir.
Şimdi bu
pencere
biçimlerine örnek teşkil edecek küçük bir uygulama geliştirelim.
Uygulamamızda
bir ana pencere, bu ana pencerenin alt pencereleri olan iki alt
pencere ve bir
de sahiplenilmiş pencere oluşturalım. Alt pencereler, aynı pencere
fonksiyonunu
kullansınlar. Uygulamanın başında, pencere fonksiyonlarına ilişkin
prototip
bildirimlerimizi yapalım :
LRESULT CALLBACK
WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK WndChildProc(HWND hWnd,UINT message,WPARAM
wParam,LPARAM
lParam); |
İlk
pencere fonksiyonu
ana pencereye ilişkin, ikincisi ise alt pencerelere ilişkin olacaktır.
Alt pencerelere
atanacak ID değerlerini de uygulama başında sembolik sabit olarak
bildirelim
:
#define ID_CHILD1
100
#define ID_CHILD2 101 |
Sembolik
sabit
bildirimlerimizi de yaptıktan sonra, WinMain fonksiyonumuza
geçebiliriz :
int
WINAPI
WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR
lpszCmdParam,int
nCmdShow)
{
    //Değişken bildirimleri :
    WNDCLASS wndClass;
    HWND hWnd;
    MSG message;
   
//Pencere sınıflarına ilişkin özelliklerin belirtilmesi ve
pencere sınıflarının
sisteme kaydedilmesi :
    if (!hPrevInstance)
{
       wndClass.style = CS_HREDRAW |
CS_VREDRAW;
       wndClass.cbClsExtra = 0;
       wndClass.cbWndExtra = 0;
       wndClass.hInstance =
hInstance;
       wndClass.hIcon =
LoadIcon(NULL,IDI_WINLOGO);
       wndClass.hbrBackground =
(HBRUSH)GetStockObject(GRAY_BRUSH);
       wndClass.hCursor =
LoadCursor(NULL,IDC_ARROW);
       wndClass.lpszMenuName = NULL;
       wndClass.lpszClassName =
"MainWindows";
       wndClass.lpfnWndProc =
(WNDPROC)WndProc;
       if
(!RegisterClass(&wndClass))
          return -1;
    }
    if (!hPrevInstance)
{
       wndClass.style = CS_HREDRAW |
CS_VREDRAW;
       wndClass.cbClsExtra = 0;
       wndClass.cbWndExtra = 0;
       wndClass.hInstance =
hInstance;
       wndClass.hIcon =
LoadIcon(NULL,IDI_WINLOGO);
       wndClass.hbrBackground =
(HBRUSH)GetStockObject(BLACK_BRUSH);
       wndClass.hCursor =
LoadCursor(NULL,IDC_ARROW);
       wndClass.lpszMenuName = NULL;
       wndClass.lpszClassName =
"ChildWindows";
       wndClass.lpfnWndProc =
(WNDPROC)WndChildProc;
       if
(!RegisterClass(&wndClass))
          return -1;
    }
   
//Ana pencerenin oluşturulması ve gösterilmesi :
    hWnd = CreateWindow("MainWindows",
                                   "Pencere Sistemi - ANA
PENCERE",
                                   WS_OVERLAPPEDWINDOW,
                                   CW_USEDEFAULT,
                                   0,
                                   CW_USEDEFAULT,
                                   0,
                                   NULL,
                                   NULL,
                                   hInstance,
                                   NULL);
    if (!hWnd)
       return -1;
    g_hWnd =
hWnd;
    ShowWindow(hWnd,SW_RESTORE);
    UpdateWindow(hWnd);
   
//Mesaj döngüsü :
    while(GetMessage(&message,0,0,0))
{
      
TranslateMessage(&message);
      
DispatchMessage(&message);
    }
    return (message.wParam);
}
|
WinMain
fonksiyonunda
yaptığımız işlemleri adım adım inceleyelim. Fonksiyonun başında,
kullanacağımız
değişkenleri tanımladık. Bunlar WNDCLASS, HWND ve MSG türlerinden olan
değişkenlerdir.
WNDCLASS türünden olan değişkenimizi pencere sınıflarına ilişkin
özellikleri
belirtmek ve pencere sınıflarını sisteme kaydetmek için, HWND türünden
olan
değişkenimizi, ana penceremizin tutamaç değerini saklamak için, MSG
türünden
olan değişkenimizi ise mesaj döngüsünü oluştururken kullanacağız.
Bunların yanı
sıra, global alanda HWND türünden bir değişken daha tanımladık.
WinMain fonksiyonu
içerisinde elde ettiğimiz ana pencere tutamaç değerini de bu
değişkende saklayacağız.
Bu değere uygulamamızın diğer kısımlarından da erişmemiz gerekecek.
- Pencere sınıflarına
ilişkin özelliklerin belirtilmesi ve pencere sınıflarının sisteme
kaydedilmesi
: Pencere
sınıflarına ilişkin özellikler, WNDCLASS türünden değişkenler
kullanılarak
belirtilir. Özellikleri atanan pencere sınıfları sisteme kaydedilir.
Kodun
bu kısmında, iki pencere sınıfının özelliklerini belirleyeceğiz.
Bunlardan
ilki ana pencereye ilişkin sınıf, diğeri ise alt pencerelere ilişkin
sınıftır.
Her iki pencere sınıfı için de, pencere biçimi, ikonu, arka plan
rengi, fare
imleci ve pencere fonksiyonu gibi özellikler benzer şekilde
belirlendikten
sonra, iki pencere sınıfına da sistemde onları tanımlayan isimler
verdik.
Ana pencereler için ’MainWindows’ ismini, alt pencereler için ise
’ChildWindows’
ismini kullandık. Pencereleri oluşturma aşamasında bu isimleri
kullanacağız.
Pencere sınıflarına ilişkin özellikler belirlendikten sonra bu
sınıflar, RegisterClass
fonksiyonu ile sisteme kaydedilir. Önceki yazılarımızdan
hatırlayacağınız
üzere, bir pencere sınıfı sisteme RegisterClass fonksiyonu ile
kaydedilmediği
sürece, o sınıfa ilişkin bir pencere oluşturamıyoruz. Pencere
sınıfları sisteme
kaydedildikten sonra kodun diğer aşamasına geçebiliriz.
- Ana
pencerenin
oluşturulması : Uygulamamıza
ilişkin ana pencereyi WinMain fonksiyonumuzda oluşturduk.
CreateWindow fonksiyonunu
kullanarak daha önce sisteme kaydedilmiş olan ’MainWindows’ pencere
sınıfı
türünden bir pencere oluşturacağımızı belirtiyoruz. Bu pencere ana
pencere
olacağı için, pencere biçiminde WS_OVERLAPPEDWINDOW biçimini
kullandık. Alt
pencereleri, ana pencereye ilişkin pencere fonksiyonunda
oluşturacağız. Alt
pencerelerin sisteme kaydedilmesi işlemini ise bir önceki aşamada
yapmıştık.
(Alt pencereler de kodun bu kısmında oluşturulabilir.)
- Mesaj döngüsünün
kurulması : Kodun
bu kısmında, sistemdeki mesajları dinleyebilmek amacıyla mesaj
döngümüzü,
önceki uygulamalarımızdakine benzer biçimde oluşturuyoruz.
WinMain
fonksiyonundan
sonra, ana pencereye ilişkin pencere fonksiyonu olan WndProc
fonksiyonunu oluşturalım
:
LRESULT CALLBACK
WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    static HWND hWndChild1, hWndChild2;
    switch(message)
{
       case WM_CREATE :
          //Birinci alt
pencerenin
oluşturulması :
          hWndChild1 =
CreateWindow("ChildWindows","ALT PENCERE 1",
                                                
WS_CHILD | WS_CAPTION
                                                 | WS_SYSMENU,
                                                 100,100,200,300,
                                                 hWnd,
                                                 (HMENU)ID_CHILD1,
                            &nbp                   
((LPCREATESTRUCT)lParam)->hInstance,NULL);
          if
(!hWndChild1)
            
return -1;
         
EnableWindow(hWndChild1,TRUE);
         
ShowWindow(hWndChild1,SW_SHOW);
         
//İkinci alt pencerenin oluşturulması :
          hWndChild2 =
CreateWindow("ChildWindows","ALT
PENCERE 2",
                                                
WS_CHILD | WS_CAPTION
                                                
| WS_SYSMENU,
                                                
400,100,200,300,
                                                
hWnd,
                                                
(HMENU)ID_CHILD2,
                            &nbp                   
((LPCREATESTRUCT)lParam)->hInstance,NULL);
          if
(!hWndChild2)
            
return -1;
         
EnableWindow(hWndChild2,TRUE);
         
ShowWindow(hWndChild2,SW_SHOW);
          break;
       case WM_DESTROY
:
         
PostQuitMessage(0);
          break;
       default
:
          return
DefWindowProc(hWnd,message,wParam,lParam);
      }
       return 0;
}
|
Pencere
fonksiyonlarında,
sistemdeki mesajları dinleyerek belli mesajlar alındığı takdirde belli
işlemlerin
yapılmasını sağlıyorduk. Uygulamamızın ana penceresine ilişkin pencere
fonksiyonunda
da, ana penceremiz yaratıldığında diğer alt pencerelerin yaratılmasını
sağlayacak
kodu yazdık. Diğer mesajların işlenmesini ise Windows’a bıraktık. Bir
uygulama
içerisinde CreateWindowEx veya CreateWindow fonksiyonu ile bir pencere
oluşturulmak
istendiğinde, WM_CREATE isimli bir mesaj gönderilir. Bu mesaj, pencere
yaratıldıktan
sonra, fakat görüntülenmeden hemen önce pencereye ulaşır. Biz de mesaj
döngüsünden
bu mesajı aldığımız zaman alt pencerelerimizi oluşturduk. Alt
pencerelerin oluşturulması
için, CreateWindow fonksiyonunda, pencere sınıfı ismi olarak
’ChildWindows’
ismini geçtik. Alt pencerelerimizin üst penceresi olarak ana
penceremize ilişkin
tutamaç değerini geçtik. CreateWindow fonksiyonunun hMenu isimli
parametre değişkeni,
üst pencereler oluşturulurken menü belirlemek amacıyla, alt pencereler
oluşturulurken
ise o pencereye ilişkin ID değerini belirlemek amacıyla
kullanılıyordu. Bu parametre
değişkenleri için de, global alanda tanımladığımız sembolik sabitleri
geçtik.
Alt pencere oluşturacağımız için pencere biçimi olarak WS_CHILDWINDOW
biçimini
kullandık. İki alt pencerenin de başarıyla oluşturulup
oluşturulmadığını kontrol
ettikten sonra pencerelerin görünür olmalarını sağladık. Artık
uygulamamızın
ana penceresi içerisinde iki tane de alt penceremiz bulunuyor. Bu alt
pencereler,
üst pencere olarak aynı pencereyi kullandıkları için aynı zamanda
kardeş pencerelerdir.
Şimdi
sırada sahiplenilmiş
bir pencere oluşturma işlemi var. Bu pencere, her zaman üst
penceresinin önünde
görüntülenen ve üst penceresinin sınırları dışarısına çıkabilen bir
penceredir.
Bu pencereyi de alt pencerelere ilişkin pencere fonksiyonunda
oluşturacağız.
LRESULT CALLBACK
WndChildProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM
lParam)
{
    switch(message)  {
       case WM_LBUTTONDOWN :
         
MessageBox(g_hWnd,"Devam
etmek için düğmelerden birisine basınız...","Pencere
Sistemi Uygulaması",MB_OKCANCEL);
          break;
       default :
          return
DefWindowProc(hWnd,message,wParam,lParam);
    }
    return 0;
} |
Sahiplenilmiş pencere
oluşturmak için MessageBox API fonksiyonunu kullanacağız. Bu
fonksiyon, bir
mesaj kutusunun oluşturulmasını ve gösterilmesini sağlar. Fonksiyon
mesaj kutusuna
ait üst pencereyi belirten HWND türünden bir parametre değişkenine
sahiptir.
Bu parametre değişkeni için global alanda sakladığımız ana pencere
tutamaç değerini
geçeceğiz. Böylece mesaj kutumuzun sahip penceresi, uygulamamızdaki
ana pencere
olacaktır. Mesaj kutusu, ana pencerenin önünde görüntülenecek ve ana
pencerenin
sınırları dışarısına da çıkabilecek. MessageBox fonksiyonunun prototip
bildirimi
şöyledir :
int
MessageBox (
   
HWND hWnd,          // Sahip
pencerenin
tutamaç değeri
    LPCTSTR lpText,     // Mesaj
kutusunda görüntülenecek
yazının adresi
    LPCTSTR lpCaption, // Mesaj kutusunun başlığında
görüntülenecek
yazının adresi
    UINT
uType          
// Mesaj kutusu biçimi
); |
Fonksiyonun ilk
parametre değişkeni, yukarıda da bahsettiğimiz üzere, mesaj kutusunun
sahip
penceresinin tutamaç değeridir. Biz fonksiyonu çağırırken bu parametre
değişkeni
için ana penceremizin tutamaç değerini vereceğiz. İkinci parametre
değişkeni
mesaj kutusunun içinde görüntülenecek yazıyı gösteren bir gösterici,
üçüncü
parametre değişkeni mesaj kutusunun başlığında görüntülenecek yazının
başlangıç
adresidir. Dördüncü parametre mesaj kutusunun biçimini, sahip olduğu
düğmeleri
belirtmektedir. Bu parametre değişkeni için geçilebilecek değerler,
sembolik
sabit biçiminde tanımlanmıştır. Şimdi alt pencerelerimizin pencere
fonksiyonunu
inceleyelim :
Burada
MessageBox
fonksiyonunu çağırdığımız kısım, sistemden ’WM_LBUTTONDOWN’ mesajının
alındığı
kısımdır. Bu mesaj, fare imleci ilgili pencerenin sınırları içerisinde
iken
kullanıcının farenin sol tuşuna basmasıyla oluşmaktadır. Programımızın
çalışma
zamanında alt pencerelerden birisinin üzerinde iken farenin sol tuşuna
bastığımız
zaman mesaj kutumuz oluşacaktır. MB_OKCANCEL sembolik sabiti, mesaj
kutumuzun
iki düğmeye sahip olmasını sağlar. Bunlar OK ve Cancel düğmeleridir.
Mesaj kutusunun
üst penceresinin sınırları dışarısına çıkabildiğine ve üst
penceresinin önünde
görüntülendiğine dikkat edin. Uygulamayı çalıştırdığınızda şu
görüntüyü elde
etmelisiniz :
Alt
pencerelerden
herhangi birisinin üzerinde iken farenin sol tuşuna bastığınızda şu
görüntüyü
elde etmelisiniz :
Önümüzdeki yazımızda
pencere sistemi üzerinde dolaşan ve pencerelere ilişkin birtakım
işlemleri yapan
fonksiyonları inceleyeceğiz. Örnek uygulamayı buradan indirebilirsiniz.
(Visual
Studio .NET 2003’te hazırlanmıştır.) Mutlu günler dilerim..
KAYNAKLAR
-
Win32 Programlama
Yardım Sayfaları
Makale:
Windows API - Pencere Sistemi C ve Sistem Programlama Çiğdem Çavdaroğlu
|