Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Çiğdem Çavdaroğlu
Çiğdem Çavdaroğlu
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
28 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: createwindow degiskeni fonksiyonu iliskin parametre pencere pencereler pencereler pencerelerin pencerenin penceresi penceresinin pencereye return sisteme C / Sys Prog. Çiğdem Çavdaroğlu
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : İleri
Kategori : C / Sys Prog.
Yayınlanma Tarihi : 27.9.2005
Okunma Sayısı : 30822
Yorum Sayısı : 4     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 31.10.2024
Turhal Temizer
Mac OS/X Removing CUDA 31.10.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi 31.10.2024
Burak Selim Şenyurt
Rust, WASM, Web Api ve Can-Ban Board ! 31.10.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Windows API - Pencere Sistemi
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
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
  • Yazılan Yorumlar
  • Yorum Yaz
MAY
23
2006
Muhammet Ali Dede, biraz kitap falan karıştır istersen, ufkunu genişletmeye yardımcı olur. OpenGL n bittiğini söylemek GNULinux camiasının 2d3d hardware grafiğinin de bittiğini söylemekle eşdeğerdirki. Şu sıralarda bile en az 10 tane opengl içeren proje bşlamış durumda.
EYL
30
2005
Yorum yazmayacaktım ama merak ettiğimdem OpenGL ölüyorsa yerine ne geliyor.Neden ölüyor sorusuna cevap olarak verebileceğiniz birşeyler var mı?OpenGL belki doğrudan kullanılmıyor ama başka sınıflarla OpenGL üzerinden başka sınıflar ile grafik uygulamaları geliştirebiliyorsunuz (Inventor gibi).Bunun dışında OpenGL ölse bile (ki dillerin ölmediğini CC++ dan görüyoruz) OpenGL den çok şey miras alan bir sistem geliştirilir.Ancak yukarıda da dediğim gibi zaten kimse OpenGLi öldürerek bu işi yapmıyor.OpenGL üzerine daha gelişmiş sınıflar geliştiriyor.Bir de üslubunuza dikkat ederseniz hepimiz için daha hoş olur.
EYL
30
2005
Win32 API programlama ve OpenGLin öldüğü tezinize ne yazıkki katılamayacağım. Bugün win32 sistemlerini hala kullanıyoruz. Bu sistemler üzerinde API programlama ile uğraşan birçok programcı da var. Yeni dillerin geliştirilmesiyle GUI oluşturma işlemleri oldukça pratik hale geldi, ancak bu işlerin arkaplanında neler yapıldığını öğrenmek isteyen insanların sayısı da azımsanacak düzeyde değil. Bu sistemler kullanılmaya devam edildiği müddetçe de win32 ölmeyecektir. Yeni sistemlerin geliştirilmesiyle kullanılmayacak hale gelebilir, ancak bu, bugün win32 programlama öğrenmemize engel değildir. OpenGL ise hala birçok grafik uygulamada, oyunlarda kullanılıyor. Üç boyutlu modelleme yazılımlarında kullanılıyor. Programlama dillerinin seviyelerinin gittikçe yükseliyor olması, düşük seviyeli dillerin öldüğü ve kullanılmayacağı anlamına gelmiyor. Sizin ilginizi çekmiyor olsa bile bu konuyla ilgilenen birçok programcı mevcut. Buradaki win32 API ile ilgili makalelerdeki uygulamaların bir amacı da, sistemin arka planda nasıl çalıştığını, neler yapmamıza imkan sağladığını anlatabilmektir. Buradaki her uygulamayı pratikte böyle kullanın gibi bir amacı ise elbetteki yoktur. Kimi insan API programlama öğrenmek ve kullanmak için okur, kimisi de sadece nasıl çalıştığını öğrenmek için okur. İlgisini çekmeyen kişi zaten hiç okumaz. Son olarak, makalelere yorum eklerken kullandığınız dile biraz daha özen göstermenizi rica ediyorum. Sitemizin seviyesini düşürecek kelimelerden kaçınmanızı rica ediyorum. Bu hususa dikkat ettiğimiz sürece olumlu veya olumsuz eleştirilere elbette açığım.
EYL
30
2005
ablam takmışsın sen bu win32api ve opengl e bunlar ölüyolar yavaş yavaş
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor