Snake Force / Ana Sayfa
Forum Anasayfası Forum Anasayfası > Programlama > Win32 Api
  Aktif Konular Aktif Konular
  SSS SSS  Forumu Ara   Kayıt Ol Kayıt Ol  Giriş Giriş


Kapalı KonuWin32 Api - Pencereler

 Yanıt Yaz Yanıt Yaz
Yazar
Mesaj
  Konu Arama Konu Arama  Konu Seçenekleri Konu Seçenekleri
StreAmeR Açılır Kutu Gör
Yönetici
Yönetici
Simge

Kayıt Tarihi: 01/Ocak/2006
Konum: İstanbul
Aktif Durum: Aktif Değil
Gönderilenler: 107
Mesajın Direkt Linki Konu: Win32 Api - Pencereler
    Gönderim Zamanı: 26/Mart/2007 Saat 21:09

Win32 Programlama için Referanslar

Çeviren İbrahim Akgül 

www.snakeforce.com 

 
Not: Makale her gün güncellenmektedir. Diğer ziyaretlerinizde kaldığınız yerden okumaya devam edebilirsiniz.
Bölüm:

- Pencereler (Windows) -

 

            Pencere en yalın haliyle Microsoft Windows işletim sistemi için yazılmış, kullanıcıdan girdiler alan ve çıkış veren ekransal formda dikdörtgensel bir alandır. Bir pencere, ekranı diğer pencereler ile paylaşır ve farklı uygulamaları içerebilir. Bir pencere an olarak bir kullanıcıdan/programda yalnızca tek bir giriş alabilir. Kullanıcı Mouse, klavye ve diğer giriş aygıtları ile bu pencere ve içerdiği uygulama ile etkileşim kurabilir.

 

- Pencereler Hakkında (About Windows) –

 

            Pencerelerin asıl amacı kullanıcılar ile uygulamaları etkileşimli hale getirmektir. Görsel olarak hazırlanan bir Win32 uygulamasının yapacağı ilk iş bir “Pencere“oluşturmak olacaktır. Bu dokümanda Microsoft Win32 Application Programming interface (API) kullanarak pencerelerin diğer pencereler ile olan etkileşimlerinin nasıl gerçekleştiğini ,ayrıca boyutlandırma, taşıma ve pencerelerin görüntülendirmesi gibi konuları ele alacağız.

 

 - Masaüstü Penceresi (Desktop Window) –

 

            Windows ilk başladığında otomatik olarak masaüstü(desktop) penceresini oluşturacaktır. Masaüstü penceresi ekranın arka planını biçimlendiren sistem-tanımlı bir penceredir ve diğer tüm uygulamaların kullandığı bütün pencerelere taban oluşturur.

 

            Masaüstü (Desktop) pencereleri ekranın arka planını biçimlendirmede Bitmap işleme kuralını kullanır. Bitmap kuralı ile oluşturulmuş şablona Masaüstü resmi (Desktop Wallpaper) denir. Varsayılan olarak masaüstü resmi olarak registry ‘de .BMP formatı öngörülmüştür.

 

            GetDesktopWindow fonksiyonunu kullanarak masaüstünün handle’ini elde edebilirsiniz.

 

            Sistem taraflı uygulamalar ve Denetim Masası applet’ları eklentileri gibi uygulamalar masüstü resmini SystemParametersInfo fonksiyonun wAction parametresine SPI_SETDESKWALLPAPER ve lpvParam parametresine de istenilen Bitmap dosyasının yolunu belirterek değiştirirler. SystemParametersInfo belirtilen yoldan Bitmap dosyayı yükler, ekranın arka planını bu dosyayı kullanarak biçimlendirir ve registry’ye bu dosyanın artık güncel arkaplan resmi olduğuna dair girişini günceller.

 

- Uygulama Pencereleri (Applications Windows) –

 

            Her grafiksel Win32 tabanlı uygulama en azından bir pencere oluşturur ve bu oluşturulan ilk pencereye de Ana Pencere(Main Window) denir. Bu pencere artık Uygulama ve Kullanıcı için bir arayüz (interface) vazifesi yapar. Çoğu uygulama birden fazla pencere oluşturur ancak doğrudan veya dolaylı olarak yapılan işler Ana pencereye (Main Window) bağlıdır. Her bir pencere kullanıcıdan giriş almak ve ekrana çıktı vermek gibi rollere sahiptir.

 

            Bir uygulama başladığında, sistem ayrıca uygulama ile birlikte görev çubuğu butonu (taskbar button)  ilişkilendirir. Uygulama aktif olduğunda bu buton basık şekilde görüntülenecektir. 

 

- Bir uygulama Penceresinde yer alan Bileşenler – (Components of an Application Window)

 

            Bir uygulama penceresi (application window) başlık çubuğu (title bar), bir menü çubuğu (menu bar), pencere menüsü (window menu [önceden sistem menu olarak anılırdı]) , minimize düğmesi, maximize düğmesi, restore düğmesi, kapatma düğmesi,  boyutlandırılabilir çerçeve, bir çalışma alanı, yatay kaydırma çubuğu (horizontal scroll bar) ve dikey kaydırma çubuğu (veritical scroll bar) gibi bileşenlere sahiptir.

 

Başlık çubuğu (Title bar) pencerenin amacını belirten, veya uygulamanın adının yazılabileceği text içerebilen bir alandır. Başlık çubuğu aracılığı ile kullanıcı Mouse veya herhangi bir noktalama aygıtı ile pencereyi taşıyabilir.

 

            Çoğu uygulama içerdiği standart veya özel işlevselliklerini kolay erişilebilir kılabilmek için Menu Çubuğu (menu bar) kullanır. Menu bar’ın içeriği ve elamanları kategorize edilebilmesi açısından elverişlidir. Menu bar elemanlarından biri seçildiğinde varsayılan olarak açılır(popup) bir menü şeklinde görünür.

 

            Pencere menüsü (window menu) Windows tarafından yönetilir ve oluşturulur. Bu menü kullanıcı tarafından seçildiğinde pencerenin boyutlandırması, taşınması, kapatılması veya farklı bir görevi yerine getiren standart bir biçimde açılır. Menüler hakkında daha fazla bilgi için , bkz:Menüler

 

            Boyutlandırılabilir çerçeve (Sizing Border) Pencerenin etrafını çerçeveleyen sınır alanıdır. Bu alanı kullanarak pencereyi Mouse veya herhangi bir noktalama aygıtı ile tekrar boyutlandırabilirsiniz.

 

            Çalışma alanı (Client Area) uygulamanın içerdiği text ve grafiksel özellikleri doğrudan ekrana çıkış olarak sunduğu pencere alanıdır. Uygulama client area’da ki bileşenlerle etkileşime girebilmek için(ör: kullanıcıdan gelen istekler veya diğer pencerelerden gelen istekler)  pencere prosedürleri(window procedure) kullanmak zorundadırlar. Windows prosedürleri hakkında daha ayrıntılı bilgiler için : bknz: Pencere prosedürleri.

 

Yatay kaydırma çubuğu (Horizontal scrool bar) ve dikey kaydırma çubuğu (Veritical Scrool bar) kendisini kullanan Mouse veya klavye giriş değerlerini dönüştürerek client area içeriğini kaydırmaya yararlar. Örnek olarak şu anda bu dokumanı pencere’de ki yatay ve dikey kaydırma çubukları vasıtası ile okuyorsunuz.

 

            Başlık çubuğu (title bar), menu bar, pencere menüsü (window menu), minimize ve maximize tuşları, boyutlandırma çerçevesi(sizing border), kaydırma çubukları (scroolbars) pencerede client area’nın dışında yer alırlar. Client area dışında ki çoğu işi Windows yönetir ve diğer geri kalan işin çoğunu da uygulama kendisi yönetir. Özellikle uygulama client area’nın davranışlarını yönetmektedir.

 

- Kontroller, Dialog kutuları ve Mesaj Kutuları (Controllers, Dialog Boxes and Message Boxes) –

 

            Bir uygulama Ana pencereye ilaveten de pencerelerin farklı tiplerini kullanabilir.

 

Bir kontrol (control) uygulamanın kullanıcıdan bir dosyanın ismini alıp onu açmak için veya koordinatları verilmiş bir metni hafızaya kopyalamak gibi işlemler için kullanılır. Kontroller çoğunlukla client area içerisinde yer alırlar ve kullanıcı ile uygulama arasında görsel bir arayüz sunarlar. Butonlar, text boxlar, imajlar ve etiketler gibi elemanlara sahiptirler. Daha ayrıntılı bilgi için bkz:Kontroller

 

Kontroller her zaman bir başka pencerenin altında yer alırlar , çoğunluklada dialog kutularında (dialog box). Bir Dialog kutusu bir veya daha fazla kontrol içeren bir penceredir. Bir uygulama dialog kutularını tamamlayıcı bir görev gibi kullanıcıdan giriş veya yanıt almak için kullanır. Örnek olarak bildik “Dosya Aç” veya “Dosya Kaydet” dialog kutuları gibi.

 

Mesaj Kutuları (Message Box) adında anlaşılacağı üzere kullanıcıyı uyarmak, hatırlatmak veya bilgilendirmek amacıyla kullanılan pencerelerdir . Çoğunlukla programlarımızda hata bildirimi amacıyla kullanırız.

 

Dialog kutuları ve mesaj kutuları bir Ana Pencere (main window) ‘nin kullandığı standart yapıyı kullanmaz. Çoğunda başlık çubuğu(title bar), menu bar, ve çerçeve(boyutlandırılamaz) vardır lakin kaydırma çubuğu, minimiza ve maximize www.snakeforce.com ve kaydırma çubukları yoktur. Daha fazla bilgi için bknz: Dialog Kutuları

 

- Z Düzlemi (Z-Order) –

 

            Z düzlemi üst üste/örtüşen pencerelerin pozisyonlarını pencere yığını (window stack) da tutar. Pencere yığınlayıcısı Z-order adı verilen hayali bir eksen üzerinde ekrandan dışarıya doğru bir düzlemdir. Z-order’in en tepesindeki pencere diğer tüm pencerelerin üzerinde yer alır ve tam tersi olarak Z-orderin en altındaki pencere diğer tüm pencerelerin altına kalmış demektir.

 

            Windows Z-Order ‘i Tek bağlı liste(single-list) şeklinde tutar. Windows Z-Order’a pencereleri En üst düzey pencereler(Topmost Windows), Üst Seviye pencereler (Top-level Windows) veya alt pencereler (child Windows) şeklinde ekler. Bir En üst düzey pencere (Topmost window) diğer en üst düzey olmayan tüm pencerelerin o anda aktif pencere veya en önde yer alan pencere olup olmadığına bakmaksızın hepsinin üzerinde yer alacaktır. Bir En üst seviye pencere WS_EX_TOPMOST stiline sahiptir. Z-order’da da Topmost Window’slar diğer TopMost olmayan pencerelerden önce yer alırlar. Bir alt pencere(child window) Z-Order’da kendilerine sahip olan üst pencereler ile gruplanmış şekilde yer alırlar.

 

            Bir uygulama bir pencere oluşturduğunda, Windows onu aynı tipteki pencerelerin Z-Order’inin üstüne koyar. BringWindowToTop fonksiyonunu kullanarak pencerenizi aynı tipteki diğer pencerelerin Z-Order’inin tepesine alabilirsiniz. SetWindowPos ve DeferWindowPos fonksiyonlarını kullanarak Z-Order dizilimini tekrar ayarlayabilirsiniz.

 

Bir uygulamanın alt pencerelerinin Z-Order’da ki durumlarını da GetTopWindow  fonksiyonuna ana pencerenin (parent window)’un handle’ini verip bulabilirsiniz. Bu işlemin sonucunda fonksiyondan geriye En üstte yer alan alt pencerenin handle’i döner. Bu handle ile GetNextWindow fonksiyonunu kullanıp o pencereye ait Z-Order üzerinde ileri geri giderek diğer alt pencerelerin handle’larını da  ulaşabilirsiniz.

 

- Pencere Oluşturma (Window Creation) –

 

            Bir uygulama CreateWindow veya CreateWindowEx fonksiyonlarını kullanarak, Windowsun istediği pencere niteliklerini ve özellikler bilgilerini sağlayarak kendine pencere oluşturabilir. CreateWindowEx CreateWindow’un sahip olmadığı dwExStyle parametresine sahiptir. Bunun dışında bir farklılığı yoktur. Aslında CreateWindow da çağrı olarak CreateWindowEx’i çağırır amcak terk farkla dwExStyle parametresini 0 geçer. Bu yüzden dökümanın ileriki kısımlarında referans olarak CreateWindowEx’i incelemeniz daha mantıklı olacaktır.

 

            Win32 API ayrıca farklı ve özel amaçlara hizmet eden dialog kutuları ve mesaj kutuları da oluşturabilecek fonksiyonları sağlamaktadır. Daha ayrıntılı bilgi için bknz: Dialog Kutuları

 

- Pencere Nitelikleri (Window Attributes) –

 

            Bir uygulama bir pencere oluşturacağı zaman aşağıdaki bilgileri sağlamalıdır:

 

-          Pencere Sınıfı   (Window Class)

-          Pencere Adı      (Window Name)

-          Pencere Stili     (Window Style)

-          Ust veya Sahip Pencere            (Parent or Owner Windows)

-          Boyut   (Size)

-          Konum (Location)

-          Pozisyon (Position)

-          Alt pencere id’si veya menu handle’i (Child-window identifier or Menu handle)

-          Tanimlayici handle’i (Instance handle)

-          Oluşturulma Bilgisi ( Creation Data)

 www.snakeforce.com

 

Şimdi bu nitelikleri aşağıda açıklıyalım.

 

Pencere Sınıfları (Window Classes)

 

            Her pencere birer pencere sınıfıymış gibi davranır. Bir uygulama bu sınıftan herhangi bir pencere oluşturmadan önce bir pencere sınıfı (window class)’nı register etmek zorundadır. Bir pencere sınıfı (Window Class) çoğu durumda pencerenin davranışını ve görünüşünü tanımlar. Windows Class’larının ana bileşeni pencereye gönderilen ve gelen bütün istekleri işleyen window procedure’dür.Pencereye gelen bu istekler mesaj (messages) forumundadır.

 

Pencere Adı (Window Name)

 

            Bir Pencere bir isme sahip olabilir. Bir Pencere adı (Window Name) (ayrıca Window Text diye de anılır) kullanıcı için bir pencerenin tanımlayıcı kimliğini betimleyen bir text stringt’dir. Eğer tanımlanmış ise Pencere, Dialog kutusu veya Mesaj kutularında pencere adı, başlık çubuğu( title bar) ‘n da yer alır. Bir Control  nesnesi için Window Name ise Controllerin kendi sınıfları üzerine bağımlıdır. Buton, edit control veya static control gibi control nesneleri pencere isimlerini (window name) kendi dikdörtgensel alanları içinde gösterirler. Listbox, combobox, veya static control gibi nesneler ise bir pencere ismi göstermezler.

 

            Bir uygulama SetWindowText fonksiyonunu kullanarak sonradan oluşturulmuş bir pencerenin Pencrere Adı(window name)’ni değiştirebilir. Ayrıca GetWindowTextLength ve GetWindowText fonksiyonları ile güncel pencere üzerindeki Pencere Adı (window name) ‘i alabilir.

 

Pencere Stili (Window Style)

 

            Her pencere bir veya daha fazla değişik stile sahiptir. Bir Pencere Stili (window style) window’s class tarafından tanımlanmamış pencerelerin daha esnek tiplendirilmesini, görsel davranışlarının belirlenmesini sağlayan isimlendirilmiş sabitlerdir. Burada hatırlamanız gereken pencere’den kastın sadece konun başından beri kastettiğimiz parent veya child pencereler değil ayrıca pencere sınıfından türetilen button,edit,scroolbar gibi window’lardır. Örneğin bir SCROLLBAR class’ı bir scroll bar kontrolü oluşturur lakin onun pencere üzerinde yatay’ mı yoksa dikey mi yerleşeceğine SBS_HORZ ve SBS_VERT style’ları ile karar verir. Bazı pencere stilleri (window style) tüm pencerelere uygulanabilir ancak çoğu zaman stiller pencerenin sahip olduğu class’a göre özeldirler.

 

Üst veya Sahip Pencere (Parent or Owner Window)

 

            Bir pencere üst bir pencere (parent window) olabilir. Eğer bir pencere alt pencere (child window) olarak anılıyorsa bu onun bir üst pencere (parent window) ‘ye sahip olduğunu gösterir. Üst pencere (parent window) alt pencerenin (child window) pozisyonlandırabilmesi için koordinat sistem desteğini sağlar. Bir pencerenin, üst pencereye (parent window) sahip olması onun görüntülenme davranışlarını da etkileyecektir. Örneğin bir alt pencere (child window) üst pencerenin (parent window) sınır köşelerinin dışına taşınmaya çalışıldığında o bölümleri kırpılarak gösterilmeyecektir. Bir pencere üst pencere (parent window)’a sahip değil ise veya kendisi parent olan tüm pencereler masaüstü pencere’si nde  üst seviye pencere (top-level window) olarak anılır. Bir uygulama EnumWindows fonksiyonunu kullanarak üst-seviye’li (top-level) pencerelerin handle’larını elde edebilir. EnumWindow her elde ettiği handle’i uygulama-tanımlı (application-defined) EnumWindowsProc adlı callback fonksiyonuna iletir.

 

            Kısaca özetlemek gerekirse bir pencere sadece kendisi (own) , veya sahiplenen (owner) veyahut başka bir pencere tarafından sahiplenilmiş bir formda olabilir. Sahip alınmış bir pencere her zaman sahip pencerenin önünde görünecektir, sahip pencere minimize edildiğinde o da minimize olacak, kapatıldığında o da kapatılacaktır.

 

 

Konum, Boyut ve Z-Oder’a Pozisyonu (Location, Size, Position in the Z-Order)

 

                Her “Pencere” bir konuma (location), boyuta (size) ve Z-Düzleminde indexlenen pozisyona sahiptir.

Konum (Location) için ekranın en üst sol köşesi baz alınır. Bu Child pencereler için de Parant pencerenin client alanın en sol üst köşesidir. Boyut (size) ise genişlik ve yüksekliği pixel cinsiden pencere boyutunu gösterir. Z-Order ise daha önceden Z-Order bölümünde anlattığımız gibi Z-Order listesinin içinde overlapping olmuş pencerenin pozisyonunu gösterir. Daha ayrtınılı için bknz : Z-Order

 

 

Alt Pencere Kimliği ve Menu Handle’i (Child-Window Identifier or Menu Handle)

 

                Bir Alt Pencere (Child-Window) kendini tanımlayan tekil bir kimliğe (identifier) sahiptir.  Bu kimlik olusturma islemi ozellikle uygulamanizda birden fazla child-window kullanırak kullanışlı olmaktadır.  Bu kimligi SetWindowLong fonksiyonunu kullanarak değiştirebilir, GetWindowLong fonksiyonu ile de istediğiniz bir child-window’un değerini elde edebilirsiniz.

 

                Her pencere child-windows’lardan başka menu’ye de sahip olabilir.  Pencerelerinde menu kullanmak isteyen uygulamalar bunu window class’I tanımlarken sisteme register etmelidirler.

 

Tanımlayıcı Başlık (Instance Handle)

 

            Her Win32-tabanlı uygulamanın bu sistemle bağdaşan bir tanımlayıcı başlığı (Instance Handle) vardır. Windows bu handle’I uygulama başladığında uygulamaya verir.  Bir uygulamanın kendisinden bir den çok aynı anda çalışabileceğinden dolayı o uygulamayı diğer uygulamadan ayırabilmek için Window bu “Instance handle”’I kullanır. 

 

- Pencere Tanımlayıcıları (Window Handles) –

 

            Bir Pencere olusturulduktan sonra pencere oluşturucu fonksiyon (CreateWindow / CreateWindowEx) o pencereye sistemde tekil olan bir pencere tanımlayıcısı (windows handle) değeri atar. Uygulamalar bu değerleri farklı pencereler ile doğrudan etkileşime girmek için kullanır. Bir Pencere tanımlayıcısı değeri (Window Handle) HWND (dword) data tipinde tutulur.

 

            Win32 API’leri belirli fonksiyonlar için farklı özel anlamlı window handle’lar kullanabilir. Örneğin uygulamalarınızda SendMessageTimeout fonksiyonu da HWND_TOPMOST, SendMessage fonksiyonunda HWND_BROADCAST veya MapWindowPoints fonksiyonunda HWND_DESKTOP sabitlerini kullanabilirsiniz.

 

NULL bir pencere handle’i olmamasına rağmen bazı fonksiyonlar bir pencereyi etkilemek istemediklerinde bu parametreyi kullanabilirler. Mesela CreateWindowEx fonksiyonu ile parent veya owner (yani bağımlı olmayan bir pencere) oluşturduğunuzda bu hwndParent parametresini NULL geçebilirsiniz. Örneğin:

 

 

    INVOKE CreateWindowEx,NULL,ADDR Sinif,ADDR PrgAdi,\

           WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\

           CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\

           hInstance,NULL

           

 

Ancak tersi bir durumda yani CreateWindowEx ile bir child window veya control nesnesi oluşturcağımız durumlarda bu parametreye mutlaka owner veya parent pencerenin handle’ini geçmeliyiz. Örnek kod:

 

WndProc proc    hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

LOCAL hdc:HDC

LOCAL ps:PAINTSTRUCT

LOCAL hFont:HFONT

 

    .IF uMsg == WM_CREATE

           

       invoke  CreateWindowEx, WS_EX_CLIENTEDGE,\

                                ADDR EditClass,NULL,\

                                WS_VISIBLE+WS_CHILD,\

                                5,30,540,25,\

                                hWnd,hYazi,\

                                hInstance,NULL

                mov hWndEdit, eax

               invoke  SetFocus, eax                       

 

Not: CreateWindowEx parametresi dökümanın ilerleyen bölümlerinde anlatılacaktır.

 

Bir uygulama FindWindow fonksiyonunu kullanarak sistemde var olan window name’leri ve window class’ları bu fonkiysiyona parametre olarak belirterek istenilen fonksiyonun handle’ini elde edebilir. Eğer bu arama limitini child window’larada genişletmek isterseniz FindWindowEx fonksiyonunu kullanabilirsiniz. IsWindow fonksiyonuda window handle’inin geçerli bir tanımlayıcı kimliğe sahip olup olmadığını sınar ve böylece pencerenin varlığını doğrular.

 

- Ana Pencere Oluşturma (Main Window Creation) –

 

            Her Win32-tabanlı uygulaması bir giriş noktası olarak WinMain fonksiyonuna sahip olmalıdır. WinMain ; Ana pencereyi (Windows Main) oluşturmak ve ana pencere için window class hazırlayıp register etmek gibi bir dizi kritik işleri yerine getirir. WinMain Window Class yapısını sisteme register edebilmek için RegisterClass fonksiyonunu çağırır ve ardından CreateWindowEx fonksiyonu ile de ana pencereyi oluşturur.

 

Not: WinMain programcı tarafından istenilen bir isim ile değiştirilebilir.

 

            WinMain fonksiyonunu kullanarak uygulamanızdan sadece tek bir örneğin sistemde çalışmasını sağlayabilirsiniz. Bunu CreateMutex çağrısı ile basitçe gerçekleştirebilirsiniz. Eğer programınız tekrar çalıştırılmak istenirse aynı kod bloğu içerisinden  bu komuttan geri gelen değeri GetLastError ile değerlendirdiğinizde dönen değerin ERROR_ALREADY_EXIST olduğunu tespit ederseniz bu programınızdan ikinci bir örneğin çalıştığını gösterir.

 

            Pencereler oluşturulduktan sonra da otomatik olarak ekranda görünmezler. Bunun için ShowWindow fonksiyonu kullanılması gerekmektedir. Ana Pencere (Main Window) tanımlama işlemleri bittikten sonra uygulamalar WinMain fonksiyonu içinde ShowWindow fonksiyonunu iki parametre ile kullanarak pencereyi gösterir. İlk parametre main window’un handle’i ikinci parametre pencerenin ilk gösteriliş anındaki olacağı durumu (minimize,maximize,gizli) gösteren bayrakları ifade eder. Bu flaglar SW_ ön eki ile gruplandırılmış sabitlerdir. Varsayılan olarak bir pencerenin gösterim flagı SW_SHOWDEFAULT’tur.

 

            Eğer bir Pencere Unicode window olarak oluşturulmuş ise yalnızca Unicode mesajlar alabilir demektir. Bir pencerenin unicode pencere olup olmadığını IsUnicodeWindow çağrısını kullanarak öğrenebilirsiniz.

 

-Pencere-Oluşum Mesajları (Window-Creation Messages) –

 

Herhangi bir  Pencere oluştuğu anda Windows ilgili pencerenin window procedure’üne mesajlar göndermeye başlar. Windows pencereye daha cilent alana sahip değilken ilk olarak WM_NCCREATE mesajı, client alanı oluştuktan sonra ise WM_CREATE mesajı gönderir. Windows procedure’ü daha pencere ekran da görünmeden önce bu iki mesajla muhattap olur. Her iki mesada  CreateWindowEx fonksiyonunda belirtilen tüm bilgileri kapsayan CREATESTRUCT yapısına pointer içerir. Programcılar bu mesajları window procedure içerisinde başlangıç ile ilgili bilgileri öğrenmek maksatlı kullanabilirler.

 

Child bir pencere oluşturulduğu zaman, Windows Parent olan pencereye WM_NCCREATE ve WM_CREATE mesajlarından sonra birde WM_PARENTNOTIFY mesajı gönderir. Bu gönderilecek mesajların sayısı ve sırası pencereyi oluşturuken ki kullanılan window class, window style, window functions ları ile bağımlıdır.

 

-Multithread Uygulamalar –

 

            Win32-tabanlı uygulamalar bir çok thread’da sahip olabilir ve her bir thread kendisi için bir pencere oluşturabilir. Ancak pencereyi oluşturacak olan thread da bu pencereye gelecek mesajları işlemek için bir window procedure sahip olmaldır.

 

            Bir uygulama EnumThreadWindows fonksiyonunu kullanarak, thread’lar tarafından oluşturulmuş olan Pencerelerin sayısını öğrenebilir. Bu fonksiyon ayrıca her bulduğu thread tarafından oluşturulmuş olan pencerenin handle’ini uygulama-tanımlı bir callback fonksiyonu olan EnumThreadWndProc’a iletir.

 

            GetWindowThreadProcessId fonksiyonu, bir pencereyi oluşturmuş olan thread’in id’si ni kendini çağıran koda verir.

 

            Ayrıca başka bir thread tarafından oluşturulmuş olan bir pencerenin o anki ekrandaki gösterim durumunu (hide/show/minimize/maximize etc…) değiştirmek için de ShowWindowAsync fonksyionu kullanılır.

 

- Genel Pencere Stilleri (General Window Styles) –

 

            Win32 API genel pencere stilleri ve sınıfa-özel (class-specific) stiller barındırır. Genel pencere stillerini betimleyen sabitler WS_ öneki ile başlarlar ve ana pencere (main window), dialog kutuları ,  ve alt pencereler (child windows) için diğer stiller ile OR operatorü vasıtası ile kombine bir şekilde kullanabilirler. Sınıfa-Özel (Class Spesific) pencere stilleri ise “edit control” ve list box” lar gibi ön tanımlı kontrol sınıfları (control classes) na sahip olan pencerelerin davranışlarını ve görünüm niteliklerini tanımlar.

 

            Bir uygulama çoğunlukla pencere stillerini bir pencereyi ilk oluşturduklarında tanımlarlar. Tabi bu işlemi pencere oluştuk’dan ve uygulama başladıktan sonra da SetWindowLong fonksiyonu ile yapabilir.

 

Üst Seviye Pencere(Overlapped Window)

 

            Overlapped kavramı Z-Order bölümünde de bahsedildiği gibi pencerelerin ekrandaki hizalama ve öncelik durumlarını belirtir. Bir Overlapped window  bir başlık çubuğu (title bar), çerçeve (border) ve çalışma alanı (client area) olan ve bir uygulamanın ana penceresi olarak hizmet eden üst-seviye (top-level) bir penceredir. Ayrıca bir pencere menüsü (window menu), minimize, maximize ve kaydırma çubuğu (scroll bar)’a sahip olabilir. Bir Overlapped pencere tıpkı diğer ana pencereler gibi diğer tüm bileşenlere sahip olabilir.

 

            Spesifik bir durum olarak CreateWindowEx fonksiyonu ile bir pencere olusturken WS_OVERLAPPED veya WS_OVERLAPPEDWINDOW stillerini kullanarak Overlapped bir pencere olluşturabilirsiniz. Eğer pencereyi oluştururken WS_OVERLAPPED stili kullanırsanız pencere bir başlık çubuğu (title bar) ve çerçeveye (border) sahip olabilir. Eğer WS_OVERLAPPEDWINDOW stilini seçerseniz pencereniz diğer pencerelerin sahip olduğu diğer tüm nitelikleri içerebilir.

 

- Alt Pencere (Child Window) –

     

            Bir Alt Pencere (Child Window) , Üst Pencere (Parent Window)’un client alanına sınırlandırılmış WS_CHILD stilini kullanan bir penceredir. Bir uygulama child pencereleri çoğunlukla sahip olduğu parent pencerenin client alanını fonksiyonel bir şekilde değerlendirmek için kullanır.

 

            Bir child pencere’yi CreateWindowEx fonksiyonuna WS_CHILD stilini belirterek oluşturabilirsiniz.

 

            Child bir  pencere her zaman Parent bir pencerenin sahipliği altında olmalıdır. Parent pencere bir overlapped window, pop-up window veya belkide başka bir child window dahi olabilir. Yani bir şekilde CreateWindowEx ile child bir pencere oluşturabilmek için bir parent pencereye sahip olmalısınız. Örneğin CreateWindowEx fonksiyonunda stil olarak WS_CHILD belirtir ama parent pencereyi belirtmez iseniz , Windows bu pencereyi asla oluşturmayacaktır.

 

            Bir Child Window client alana sahip olabilir ama aksi belirtilmedikçe diğer pencerelerin sahip olduğu gibi özelliklere sahip olmazlar. Bir uygulama child window için başlık çubuğu(title bar), minimize ve maximize düğmeleri, çerçeve (border),  ve kaydırma çubukları (scroll bars) oluşturmak isteyebilir ancak bir child window bir menüye sahip olamaz.

 

Konumlama (Positioning)

 

            Windows varsayılan olarak her zaman child window’u Parent Window’un client alanının en üst sol köşesini baz alarak konumlandırır. Child pencerenin hiç bir kısmı Parent pencerenin çerçevesinin dışında gözükemez. Eğer bir uygulama child pencerenin görünme alanını parent pencerenin boyutlarından daha büyük oranlarda göstermeye çalışırsa dahi Windows bu fazlalık alanları kırparak görürünür alanı sadece Parent pencerenin client alanın izin verilen miktarı kadar gösterir. Aşağıdaki gibi durumlarda Parent pencere gibi onun barındırdığı child pencerede etkilenir.

 

Parent (Ana) Window              Child (Alt) Window

Yok edilme(Destroyed)              Parent pencere yok edilmeden önce yokedilir

Gizlenme(Hidden)                      Eğer parent pencere gizlenirse oda gizlenir  ve yalnızca parent pencere göründüğünde o da görülebilir olur.

Taşınma(Moved)                        Taşıma esnasında Ana(Parent) pencerelerin client alanları ile birlikte hareket ederler. Ayrıca bu taşınma esnasında gerçekleşecek olan biçimlendirme (painting) işleminden de child window’un window procedure’ü sorumludur.

Gösterilme(Shown)                    Önce Parent pencere görünür sonra Child pencere

 

Ana Pencere ilişkileri (Relationship to Parent Window)

 

            Bir uygulama SetParent fonksiyonunu kullanarak bir child pencerenin parent pencere sahipliğini değiştirebilir. Bu durumda, Windows child pencerenin eski parentin pencerenin çalışma alanından (client area) çıkarır ve ataması yapılmış diğer parent pencerenin client alanına taşır. Eğer SetParent fonksiyonuna handle olarak “NULL” geçilir ise yeni parent pencere Windows tarafından masaüstü penceresi(desktop window) olarak ayarlanacaktır. Buda demektirki; o child window artık kendi uygulamasında değil masaüstü penceresinde gözükecektir. Aynı zamanda GetParent fonksiyonu ile de herhangi bir child pencerenin , parent pencere handle’ni alabilirsiniz.

 

            Bir child pencere ancak tek bir parent pencereye sahiptir fakat bir parent pencere birden fazla child pencereye sahip olabilir. EnumChildWindows fonksiyonu bir parent pencerenin sahip olduğu tüm child pencereleri bulur ve bu child pencerelerin handle’larını EnumChildProc fonksiyonuna gönderir.

 

Mesajlar (Messages)

 

            Windows eğer bir giriş mesajı child window’a gidiyorsa onu parent window’a göndermeden doğrudan child windowa gönderir. Ancak tek bir şartla dır ki bu da eğer child window EnableWindow fonksiyonu ile disable edilmemişse gerçekleşir. Eğer child window disable durumda olursa artık child window üzerine gelen mesajlar, parent window’a gelir.

 

            Child pencereler tekil bir tamsayı olarak tanımlanmış bir tanımlayıcı kimliğe (integer identifier) sahiptir. Child window tanımlayıcıları özellikle kontrol pencereleri (control windows) ile çalışırken önemli bir rol oynarlar. Biraz daha açarsak uygulamalar  kontrollere bu tanımlayıcılar vasıtası ile herhangi bir dolaylı yol izlemelerine gerek kalmadan mesajlar gönderebilirler.

 

- Pencere Çerçeveleri (Window Border) -

 

            Win32 API’leri aşağıdaki çerçeve stillerini destekler.

 

Stil                                                      Tanım

WS_BORDER                                      İnce hatlı bir çerçeve gibi görünür

WS_DLGFRAME                                  Sıklıkla dialog box’lar da kullanılır ve çift çerçeveli gibi görünür. Bu stili kullanan bir pencere başlık çubuğuna (title bar) sahip olamaz.

WS_EX_DLGMODALFRAME                 Bu da çift çerçeveli bir pencere görünümüne sahiptir ancak yukarıdaki WS_DLGFRAME stiline benzemez. Bu stil ile bir pencerede WS_CAPTION stili ile başlık çubuğuda kullanılabilir.

WS_EX_STATICEDGE                          Kullanıcıdan herhangi bir giriş almayacak nesneler için tasarlanmıştır. Üç boyutlu bir görünüm kazandırır.

WS_THICKFRAME                               Boyutlandırılabilir pencereler de kullanılır.

WS_OVERLAPPED veya WS_POPUPWINDOW stiline sahip olan bir pencere varsayılan olarak

WS_BORDER stili ile gelir.

 

WS_POPUP veya WS_CHILD stilleri ile oluşturulan bir pencere için herhangi bir çerçeve (border) stili

uygulanmamış ise , sistem çerçevesiz (borderless) bir pencere oluşturacaktır.

 

Çalışma Alanına içerisinde yer almayan Komponentler (Nonclient-Area Components)

 

            Bir pencerenin çalışma alanı içerisinde olmayan (nonclient area) kısımları bir başlık çubuğuna (title bar), minimize ve maximize butonlarına, boyutlandırılabilir bir çerçeveye (sizing border), yatay ve dikey kaydırma çubuklarına (horizontal and vertical scroll bars) sahip olabilir. Bir uygulama CreateWindowEx fonksyionu ile aşağıdaki stilleri kullanarak bu komponentlerden bir veya daha fazlasını bir pencere ile oluşturabilir.

 

Style                                                   Description

WS_CAPTION                                      Başlık çubuğuna (title bar) sahip bir pencere oluşturur.

WS_HSCROLL                                     Yatay kaydırma çubuğuna sahip bir pencere oluşturur.

WS_VSCROLL                                     Dikey kaydırma çubuğuna sahip bir pencere oluşturur.

WS_MAXIMIZEBOX                              Maksimize tuşuna sahip bir pencere oluşturur. Ancak WS_EX_CONTEXTHELP stili ile oluşum esnasında kombine bir şekilde kullanılamaz.

WS_MINIMIZEBOX                               Minimize butonuna sahip bir pencere oluşturur. Ancak WS_EX_CONTEXTHELP stili ile oluşum esnasında kombine bir şekilde kullanılamaz.

WS_SYSMENU                                    Başlık çubuğunda (title bar) pencere menüsüne (window-menu) sahip bir pencere oluşturur. Bu özelliği kullanabilmek için WS_CAPTION stili ayrıca belirtilmelidir.

 

 

- Başlangıç Durumu (Initial State) -

 

            Aşağıda yer alan stilleri bir pencerenin aktif veya deaktif,  görünür veya gizli, maksimize veya minimize olup olmayacağına karar teşkil eder.

 

Stil                                                                 Tanımlama

WS_DISABLED                                                           Başlangıç durumu deaktif olan bir pencere oluşturur. Deaktif bir pencere kullanıcıdan alamaz.

WS_MAXIMIZE                                                            Başlangıç görünebilirlik durumu olarak tam boy bir boyuta sahip bir pencere oluşturur.

WS_MINIMIZE                                                             Başlangıç durumu olarak minimize durumda bir pencere oluşturur.

WS_VISIBLE                                                               Başlangıç durumu görünür olan bir pencere oluşturur.

 

- Üst ve Alt Pencereler’e ait Stiller (Parent and Child Styles) –

 

            Kardeş pencereler (sibling window) ile Child Pencerler arasında ve Parent pencereler ile Child pencereler arasında kesişim anındaki etkileşimden kaynaklanan ilişkileri aşağıdaki stiller ile sağlayabilirsiniz.

 

Stil                                                      Tanımlama

WS_CLIPCHILDREN                             Sahip (parent) pencere içerisinde bir çizim (drawing) olduğu zaman child pencereyi bu etkileşimden ayrı tutar. Bu stili pencere ilk oluşturulduğunda tanımlamak gerekir.

WS_CLIPSIBLINGS                              Bu stil ile oluşturlan child pencerelerin birinde bir drawing işlemi olduğunda diğer kardeş (sbiling) pencerelerde aynı koşuldan etkilenir.

 

-Genişletilmiş Stiller (Extenden Styles) –

 

            CreateWindowEx fonksiyonun dwExStyle parametresine aşağıdaki stiller tanımlanabilir.

 

 

Style                                                   Tanımlama

WS_EX_ACCEPTFILES                        Bu stil ile oluşturulan bir pencere üzerine sürükle-bırak (drag-drop) yöntemi ile gelen dosyalara duyarlı olurlar.

WS_EX_CONTEXTHELP                       Pencerenin başlık çubuğunda (title bar) bir soru işareti şeklinde düğme oluşturur. Kullanıcı bu düğmeye bastığında mouse ikonu « soru işareti » şeklini alır. Kullanıcı bununla child pencere üzerinde herhangi bir yere tıkladığında chil pencere bir WM_HELP mesajı alır. Child pencere bu mesajı HELP_WM_HELP komutunu kullanarak WinHelp fonksiyonunu çağırmalı ve parent pencereye bu mesajı iletmelidir.

WS_EX_CONTROLPARENT                  Bu özellikle oluşturulan child pencereler arasında kullanıcı « tab » tuşunu kullanarak gezebilir.

WS_EX_DLGMODALGFRAME              Çift çerçeveli (double border) bir pencere oluşturur. Daha önce anlatılan WS_DLGFRAME stilinden farklı olarak pencere için başlık çubuğunda (title bar) WS_CAPTION ile birlikte kullanılabilir.

                                                          

WS_EX_NOPARENTNOTIFY                 Bu stil ile oluşturulmuş pencerelere , parent pencere ilk oluşturulduğunda yada sonlandırıldığında WM_PARENTNOTIFY mesajı gönderilmeycektir.

WS_EX_TOPMOST                              Pencerenin diğer enüst (topmost) olmayan (non-topmost) pencerelerin üstünde görünmesini sağlar. Hata bu pencere aktif olmasa bile yinede ekranın en üstünde görünür.

WS_EX_TOOLWINDOW                       Bir pencerede hareket ettirilebilir araç çubuğu (floating toolbar) kullanabilmek için tasarlanmış bir pencere aracı oluşturur. Bu araç penceresi, normal bir başlık çubuğundan daha kısa bir başlık çubuğuna (title bar) sahiptir ve pencere başlığında (window title) daha küçük fontlar kullanılır. Bir araç penceresi görev çubuğunda (task bar) veya « alt+tab » kullanıldığında çıkan pencerede görünmeyecektir.

 

- Pencere İlişkileri (Window Relationships) -

 

            Bir pencere sahiplenilmiş, deaktif edilmiş, önplanda yer alan yada arkaplanda yer alacak bir  şekilde olabilir.

 

Sahipli Pencere (Owned Windows)

 

            Bir overlapped veya pop-up (bu pencereler daha önceden açıklanmıştı) başka bir overlapped veya pop-up pencere tarafından sahip alınabilir. Sahiplenilmiş bir pencere üzerinde farklı kısıtlamalar olabilir.

-          Sahipli bir pencere (owned window )herzaman Z-Order’da sahibinin (owner window) un üzerinde yer alır

-          Sahip pencere (owner window) sonlandırıldığında (destroyed) sahipli (owned) pencerede sonlandırılır.

-          Sahip pencere (owner window) minimize duruma geçirildiğinde sahipli (owned) pencerede gizlenecektir.

 

Sadece bir overlapped veya pop-up pencere sahip pencere (owner window) olabilir.  Bir uygulama CreateWindowEx ‘in hwndParent parametresine, pencere handle’i olarak sahip (owner) pencerenin handle’ini girerek, ve ayrıca stil olarakta WS_OVERLAPPED veya WS_POPUP belirtterek  sahipli (owned) bir pencere oluşturabilir. HwndParent parametresi mutlaka bir overlapped veya pop-up pencereyi betimlemelidir. Eğer hwndParent bir chil pencereyi tanımlıyorsa Windows child pencerenin en üst seviyedeki parent (top-level parent window)’ina sahipligi (ownership) atayacaktır. Bir sahiplenilmiş pencere (owned window) oluşturulduktan sonra, sahipliği (ownership) artık başka bir pencereye devr edilemez.

Dialog kutuları (Dialog boxes) ve Mesaj kutuları (Message Boxes) varsayılan olarak sahipli (owned) pencerelerdir. Bir uygulama dialog kutusu veya mesaj kutusu oluşturacak fonksiyonu çağırdığında sahip (owner) pencereyi belirtir.

 

Uygulama GetWindow fonksiyonunu GW_OWNER isaretcisi ile (flag) kullanarak bir pencerenin sahibini (owner) öğrenebilir.

 

Etkisiz Pencereler (Disabled Windows)

 

            Bir pencere etkisizleştirilebilir. Etkisiz kılınan pencere kullanıcıdan klavye ve mouse girişlerini almaz, ancak diğer pencerelerden,uygulamalardan ve Windows’dan mesajları normal seyrinde alacaktır. Bir pencere genelde, kullanıcıdan pencereyi veya penceredeki diğer kontrolleri korumak amacıyla etkisizleştirilir. Örneğin, bir uygulama dialog kutusundaki bir butonu kullanıcı müdahalesine karşı korumak için bu yolu seçebilir. Uygulama dilediği zaman bu pencereyi/kontrolü tekrar etkin (enabled) hale getirebilir.

 

            Varsayılan olarak Windows zaten bir pencereyi etkin (enabled) olarak oluşturacaktır. Bir uygulama WS_DISABLED stilini belirterek bu durumu değiştirebilir. Uygulamalar EnableWindow kullanarak var olan bir pencerenin durumunu etkin veya etkisiz (enable or disable) hale getirebilir. Örneğin bir pencerenin durumu enabled hale geçtiğinde, Windows pencereye bir WM_ENABLE mesajı gönderecektir. Programcı dilerse IsWindowEnabled fonskiyonu kullanarak bir pencerenin o anda aktif olup olmadığına bakabilir.

 

            Child bir pencere etkisiz durumdayken, Windows mouse mesajlarını parent pencereye gönderecektir. Parent olan pencere bu mesajlara bakarak ta child windowun aktif olup olmadığını anlayabilir. Daha fazla bilgi için bknz:Mouse Input.

 

            Bir pencere bir kerede tek bir klavye girişi alabilir; bu pencereye klavye odaklı (keyboard focus) denir. EnableWindow fonksiyonu ile etkisiz hale getirilen pencerenin klavye odağı da kaybolur.

 

           

Ön Plan ve Arka Plan Pencereler (Foreground and Background Windows)

 

            Her process bir çok thread’a sahip olabilir ve her thread bir pencere oluşturabilir. Güncel olarak bir pencere olusturup o pencere ile çalışan thread’a foreground thread,  ve olusmus o pencereyede foreground window denir. Bununla birlikte Processte’ki diğer geri kalan tüm threadlar background thread, pencereler ise background window olarak anılır.

 

            Her thread’in , CPU zamanını kullanacağı miktari karar vermeye yarayan öncelik seviyeleri (priority level) vardır. Foreground thread’lar background thread’lara göre daha yüksek öncelik seviyesinde çalıştıklarından (higher priority) daha fazla cpu zamanını kullanır. Foreground thread’lar normal alt öncelik (normal base priority) olarak 9’a , Background thread’lar ise “7” önceliğine sahiptirler.

           

             Kullanıcılar foreground window’lar arasında ALT+TAB veya ALT+ESC tuş kombinasyonları ile dolaşabilir. Bir uygulama SetForegroundwindow fonksiyonunu kullanarak bir pencereyi aktif pencere durumuna sokabilir. Eğer yeni foreground edilen pencere top-level bir pencere idiyse Windows sadece o pencereyi aktif hale getirir, şayet değil ise önce o pencereyi top-level yapar sonrada aktif pencere eder. Uygulamalar GetForegroundWindow fonksiyonunu kullanarak o anki aktif pencerenin handle’ini alabilir. Bu komutu kendi pencerenizin o an aktif foreground pencere olup olmadığını anlamak içinde kullanabilirsiniz. Bunu bu komuttan geri donen değer ile kendi pencere handle’inizi basitçe karşılaştırarak yapabilirsiniz.

 

- Gösterim Durumu (Show State) -

 

            Bir pencere herhangi bir anda aktif veya inaktif, gizli veya görünür, minimize veya maksimize olabilir.

 

Aktif Pencere (Active Window)

 

            Aktif pencere; o an güncel olarak kullanıcının çalıştığı uygulamanın en üst seviyesindeki (top-level) penceresidir. Windows bu pencereyi kullanıcı kolayca tanısın diye aktif-pencere renkleri ile donatır. Sadece bir anda tek bir üst-seviyeli pencere aktif pencere olabilir. Kullanıcı bir child pencere çalıştığında , parent pencerede top-level pencere durumuna girer.

 

            Bir uygulama SetActiveWindow fonksiyonu ile bir pencereyi top-level aktif pencere yapabilir. SetWindowPos, DeferWindowPos, SetWindowPlacement ve DestroyWindow gibi fonksiyonlarda aktif pencereler ile çalışmanın diğer yollarıdır. Ayrıca GetActiveWindow fonksiyonu kullanılarakta aktif pencerenin handle’I elde edilebilir.

 



Düzenleyen StreAmeR - 21/Ekim/2009 Saat 21:52
"Don't be in a hurry to condemn because he doesn't do what you do or think as you think or as fast. There was a time when you didn't know what you know today"
Yukarı Dön
StreAmeR Açılır Kutu Gör
Yönetici
Yönetici
Simge

Kayıt Tarihi: 01/Ocak/2006
Konum: İstanbul
Aktif Durum: Aktif Değil
Gönderilenler: 107
Mesajın Direkt Linki Gönderim Zamanı: 02/Nisan/2007 Saat 20:15

Görünüm (Visibility)

 

            Bir pencere gizli(hidden) veya görünür(visible) olabilir. Windows görünür pencereyi (visible window) ekranda gösterecektir ancak gizli pencereyi (hidden window) ekrana çizmeyecektir. Bir pencere görünür (visible) olduğunda kullanıcı ile etkileşime girebilir ancak bu gizli iken mümkün olmaz. Tabi gizli pencereler, diğer pencerelerden ve Windows’tan mesaj alışverişi yapabilir ancak yukarıda da bahsettiğimizi gibi kullanıcılar ile doğrudan bunu yapabilmesi mümkün değildir. Bir pencere ilk oluştuğunda görülebilir bir durumda olacaktır ve uygulama dilerse bu durumu değiştirebilecektir.

 

Bu döküman SnakeForce'a aittir

            Görülebilir bir pencere için WS_VISIBLE stili kullanılır. Varsayılan olarak, CreateWindowEx fonksiyonu ile WS_VISIBLE stili kullanılmadığında oluşan pencere gizli bir pencere olacaktır. Genellikle bir uygulama WS_VISIBLE stilini , kullanıcılardan dilediği zaman saklayabileceği / gösterebileceği  pencereler/kontroller oluşturmak için kullanır. CreateWindowEx fonksiyonu ile WS_VISIBLE stili kullanıp bir pencere oluşturulduğunda, Windows pencere oluştuktan hemen sonra bir WM_SHOWWINDOW mesajı gönderir.

 

            Uygulamalar IsWindowVisible fonksiyonunu kullanarak bir pencerenin o anda görünürmü yoksa gizlimi olduğuna bakabilirler. Uygulamalar ShowWindow, SetWindowPos, DeferWindowPos veya SetWindowPlacement gibi bir çok fonkisyonla bir pencerenin gizli veya görünür olmasını sağlayabilirler. Bu komutların hepside bu işi başarabilmek için WS_VISIBLE stilini kullanırlar.  Ayrıca yine hatırlatmak gerekirse bu gösterim ve gizlenim işlerinde pencereye her defasında WM_SHOWWINDOW mesajı gönderilecektir.

 

            Daha öncedende bahsettiğimiz gibi bir sahip (owner) pencere minimize edilidiğinde Windows sahiplenilmiş/sahipli (owned) pencereleride otomatik olarak minimize eder. Benzer bir şekilde sahip (owner) pencere eski durumuna döndüğünde (restored), Windows otomatik olarak sahipli pencereleride görünür kılar. Her iki durumdada, Windows sahipli pencerelere görünmeden ve gizlenmeden önce WM_SHOWWINDOW mesajı gönderir. Bir uygulama ara sıra sahip pencereyi(owner window) minimize veya gizli(hide) hale getirmeden de sahiplendiği (owned) pencerelerini gizlemek/minimize etmek isteyebilir. Uygulama bunun için ShowOwnedPopups fonksiyonunu kullanacaktır.  Bu fonksiyon tüm sahipli(owned) pencereler için WS_VISIBLE seçeneğini isteye göre ayarlar ve sahipli pencerelere (owned windows) istenilen duruma geçmeden önce WM_SHOWWINDOW mesajı gönderir. Sahipli pencerelerin görünüm (visible) durumları ile etkileşime girmenin (ör:show/hide) sahip (owner) pencere için bağlayıcı bir tarafı yoktur.

 

Pencereleri Minimize, Maksimize ve Eski durumlarına getirme (Minimized, Maximized and Restored Windows)

 

            WS_MAXIMIZE stiline sahip bir pencrere Maksimize boyuttaki bir pencere olarak anılır. Varsayılan olarak Windows maksimize bir pencereyi ekranı tam olarak kaplayacağı oranda büyütür. Bu pencere eğer child ise , parent penceresinin client alanı kadar büyüme olacaktır. Ayrıca WS_MAXIMIZE stilindeki bir tam ekran pencerede diğer pencerelerdeki gibi başlık çubuğundan (title bar) sürükleyip taşıma, çerçevelerden (borders) boyutlandırma gibi işlemler yapılamaz.

 

            WS_MINIMIZE stiline sahip bir pencerede Minimize Pencere (minimized window) olarak anılır. Windows , minimize edilmiş bir pencereyi ekrandan gizleyecek ve taskbarda onun için bir buton oluşturacaktır. Bir pencereyi eski durumuna getirme (restored) ise o pencerenin bir önceki durumuna geri getirilme işlemidir.

 

            Uygulamalar pencerelerini oluşturuken başlangıç anında  maximize veya minimize durumda açılmalarını sağlamak için CreateWindowEx fonksiyonda WS_MAXIMIZE veya WS_MINIMIZE stillerini kullanabilirler. Bir uygulama pencereyi oluşturduktan sonra CloseWindow fonksiyonunu kullanarak pencereyi minimize duruma sokabilir. ArrangeIconicWindows fonksiyonu genelde MDI formundaki pencerelerdeki veye masüstündeki minimize olmuş pencereleri düzenlemek için kullanılır. Ayrıca OpenIcon fonsiyonunu kullanarak minimize durumdaki pencereyi eski durum ve pozisyonuna geri getirebilirsiniz.

 

         

ShowWindow fonksiyonu ile pencereyi minimize, maximize , veya eski durumuna geri getirebilirsiniz. Ayrıca aktiflik durumu ve görünüm özelliklerinide ayaralayabilirsiniz. SetWindowPlacement fonksiyonuda tıpkı ShowWindow fonksiyonu gibi pencerelere müdahalede bulunabilir ancak ekstra bir özelliği vardır . O da pencerelere istenildiği anda, bir yapı içerisinde (WINDOWPLACEMENT) belirtilen nitelikleri uygulamasıdır. Bu yapı sayesinde pencerelerin gösterim durumları ile etkileşim kurmak daha basit olmaktadır.

 

            IsZoomed fonksiyonu ile bir pencerenin anlık durumunun maximize olup olmadığını ve yine aynı şeklde IsIconic fonksiyonu ile minimize durumda olup olmadığına bakılabilir. GetWindowPlacement fonskiyonuda yukarıda açıklanan SetWindowPlacement fonksiyonun tersine bir pencerenin o anki maximize, minimize veya bir önceki duruma döndürülme gibi durumlarının yanı sıra ekran üzerindeki gösterim durumu ve koordinat bilgilerinide WINDOWPLACEMENT adlı yapıya aktararak uygulamaya bildirir.

 

            Bir pencere minimize durumda iken maximize veya eski durumuna dönme (restored) komutu aldığı zaman Windows o pencereye bir WM_QUERYOPEN mesajı gönderir. Eğer pencere işleyicisi (window procedure) FALSE cevabı döner ise Windows maximize veya Restore işlemini yoksayar.

 

            Windows otomatik olarak tam ekran bir pencerenin boyutlarını sistem taraflı varsayılan maximize pencere boyutları ile oluşturur. Eğer bu değeler ile değişiklik yapmak istenilirse daha önce yukarıda açıklanan SetWindowFunction fonksiyonunu kullanarak veya bir pencerenin boyutu değiştirlmeye çalışıldığı zaman pencereye gönderilen  WM_GETMINMAXINFO mesajı ile yapabilir. WM_GETMINMAXINFO yapısı Windows’un pencerenin maximize boyuttaki ölçüleri ve pozisyonu hakkında ki gerekli bilgileri öğrenmesi veya ataması için MINMAXINFO yapısını kullanır.

 

- Pencere Ölçüleri ve Pozisyonları (Window Size and Position)-

 

            Bir pencerenin ölçüsü ve pozisyonu , diktörgensel bir sınır ve ana (parent) pencereye veya ekrana olan göreceli koordinatları ile ifade edilir. Üst-seviye (top-level) bir pencerenin koordinatları ekranın en sol üst köşesine bağlıdır ve aynı şekilde child bir pencerenin koordinatlarıda ana (parent) pencerenin en sol üst köşesine bağlıdır. Ölçümler ve boyutlandırmalar bu orgin’ler baz alınarak yapılır. Bir uygulama pencerenin başlangıçtaki ölçü ve pozisyonunu pencere ilk oluşturulduğu zaman belirtebilir ve istediği bir zamanda da değiştirebilir.

           

Pencere Ölçüsü (Window Size)

 

            Bir pencerenin boyu (genişlik ve yükseklik) pixel olarak verilir. Bir Pencere genişlik ve yükseklik olarak sıfır değerine sahip olabilir. Bir uygulama pencerelerinin genişlik ve yükseklik boyutlarını sıfır olarak verdiğinde Windows bu ölçüleri minimum pencere ölçüsü değerlerine çekecektir. Varsayılan bu minimum pencere ölçüsünü elde edebilmek için GetSystemMetrics fonksiyonu ile SM_CXMIN ve SM_CYMIN bayraklarını kullanabilirsiniz.

 

            Bir uygulama tamamen özel boyutlandırılmış bir client alanına sahip bir pencereyi olustumak isteyebilir. AdjustWindowRect ve AdjustWindowRectEx fonksiyonları pencerenin gereken taban boyutu ile client alanın istenen boyutunu yeniden hesaplayabilir ve bu boyutu CreateWindowEx fonksiyonuna ileterek istenilen boyutlardaki pencere ve client alanını oluşturabilir.

 

            Bir uygulama bir pencereyi aşırı fazla boyutlarda büyütkmek isteyebilir ancak bu ekran boyut sınırlarını aşacağından engellenecektir . Bu yüzden bir pencereyi oluşturmadan önce SM_CXSCREEN ve SM_CSYSCREEN bayraklarınıda kullanarak GetSystemMetrics fonksiyonu ile ekranın genişlik ve yükseklik ölçülerini ayarlayıp kendi penceremizin boyutları ile bir karşışaltırma yapabiliriz.

 

Pencere Pozisyonu (Window Position)

 

            Pencere pozisyonları sol üst köşeler baz alınarak koordinatlandırılırlar. Koordinatlar bazı zamanlar Pencere Koordinatları (window coordinates) olarakta anılırlar ve her zaman ekranın en sol üst köşesi ve child pencereler içinde ana pencerenin (parent window) client alanın en sol üst köşesi baz alınırarak ölçümlendirilir. Örneğin (10,10) bir şekilde koordinatlandırılmış bir üst-seviyeli pencere (top-level window) de ekranın en sol üst köşesinden sağa doğru 10 pixel ve aşağı doğruda 10 pixel olarak hizalandırılacaktır. Child pencereler ise bu senaryo tamamı ile parent pencerenin client alanın en sol üst köşesi olacaktır.

 

            WindowFromPoint fonksiyonu ekranın programcı tarafından belirtilmiş olan koordinatlarında yer alan bir pencerenin handle’ini dönderir. Benzer bir şekilde ChildWindowFromPoint ve ChildWindowFromPointEx fonksiyonları ise Parent pencerelerin client alanındaki yine programcı tarafından belirtilmiş bir koordinattaki var olan child pencerenin handle’ni dönderir. ChildWindowFromPointEx fonksiyonu görünmez (invisible), etkisiz (disabled) ve şeffaf (transparent) olan child pencereleri yoksayabilmesine rağmen ChildWindowFromPoint bu şekilde hassiyetli değildir.

 

- Varsayılan Boyut ve Posizyon (Default Size or Position) -

 

            Bir uygulamada üst-seviyeli (top-level) pencereyi CreateWindowEx fonksiyonu ile oluştururken CW_USEDEFAULT atamasını yapar isek başlangıç aşamasında ölçümlendirme işlemini Windows bizim için yapacaktır. Bu özellikle farklı ekran çözünürlüklerinde pencereler oluşturanlar için kullanışlıdır. Bu kullanım biçimini örneğin bir üst pencereye sahip olmayan bir pencerede yapsaydık bu varsayılan ölçümlendirme işlemi ekranın en sol üst köşesini baz alınarak yapılcaktı. Ve yine aynı şekilde bu işlemi parent pencereye sahip bir child pencere de yapsa idik o zaman ölçümlendirme işlemi parent pencerenin client alanın en sol üst köşesi baz alınarak Windows tarafından yapılacaktı.

           

 - İz Boyu (Tracking Size) -

           

            Windows bir pencerenin minimum ve maximum Iz boyunu WS_THICKFRAME stilini kullanarak işler. Bir pencere bu stili boyutlandırılabilir çerçeveye (sizing border)  sahip olarak kullanır. Minimum iz ölçüsü (Minimum tracking size) , kullanıcının çerçeveyi boyutlandırırken pencereyi getirebileceği en küçük ölçüm alanıdır. Aynı durum maximum tracikin size içinde geçerlidir.

 

            Bir pencerenin minimum ve maximum iz boyları Windows tarafından pencere ilk oluşturulduğunda sistem öntanımlı değeler ile doldurulacaktır. Ancak bir uygulama diler ise istediği zaman WM_GETMINMAXINFO mesajı ile bu değerler ile değişiklik yapabilir. Daha fazla bilgi için bknz:Ölçeklendirme ve Konumlandırma Mesajları (Size and Position Messages)

 

- Sistem Komutları (System Commands) -

 

            Bir pencere menüsüne (window menu) sahip bir uygulama sistem komutları göndererek bu pencerenin boyutunu ve pozisyonunu değiştirebilir. Sistem komutları, kullanıcı pencere menüsünde yer alan komutları seçtiğinde üretilir. Bir uygulama WM_SYSCOMMAND mesajını pencereye göndererekte kullanıcının yaptığı bu eylemleri sanki kullanıcı yapmışcasına taklit edebilir. Aşağıda yer alan sistem komutları bir pencerenin ölçüm ve pozisyon durumunu etkileyen komutlardır.

 

Komut                                                 Tanımlama

SC_CLOSE                                          Pencereyi kapar. Bu komut pencereye bir WM_CLOSE mesajı gönderir. Pencerede bir dizi temizleme ve yıkım işlemini kendisi için tamamladıktan sonra bu işlemi gerçekleştirir.

SC_MAXIMIZE                                      Pencereyi maximize eder.

SC_MINIMIZE                                       Pencereyi minimize eder.

SC_RESTORE                                     Pencereyi bir önceki durumuna dönderir.

SC_SIZE                                              Bir boyutlandırma işlemi başlatır. Kullanıcı mouse veya klavye gibi işaretçi aygıtlarla artık pencerenin boyutunu değiştirebilir.

 

 

- Boyutlandırma ve Pozisyonlandırma Fonksiyonları (Size and Position Functions) -

 

            Bir uygulama bir pencere oluştuktan sonra ; SetWindowPlacement, MoveWindow, SetWindowPos ve DeferWindowPos gibi fonksiyonlarla ilgili pencerenin boyut ve pozisyonu ile değişimler yapabilir. SetWindowPlacement fonksiyonu bir pencerenin minimize,maximize, eski durumuna döndürme (restored) anıdaki boy ve pozisyonunu  ve gösterim durumunu değiştirir.

MoveWindow ve SetWindowPos fonksiyonları ise bu işlemleri adlarından da anlaşılacağı gibi tek bir iş için yaparlar. SetWindowPos fonksiyonu pozisyonlandırma işi dışında pencerenin gösterim durumunuda etkileyecek bayraklara sahip iken MoveWindow böyle bir yeteneğe sahip değildir.

Bu döküman SnakeForce'a aittir

BeginDeferWindowPos, DeferWindowPos ve EndDeferWindowPos fonksiyonları ile de bir den çok child pencerenin boyut,pozisyon,z-order sırasını ve gösterim durmunu belirleyebilirsiniz. DeferWindow ailesi fonksiyonların genel amacı bir pencere içerisindeki child pencerelerin yukarıda belirtilen durumlara geçmesi halinde her değişiklik için Windows birden çok çizim (paint/draw) yapacağına önce tüm değişiklik yapılacak child pencereler için tanımlar girilir ve tek bir çizimde tümü yenilenmiş olur. Kısaca mesaj işleme sayısında çok verimli bir azalma elde edilir.

 

            Bir uygulama GetWindowRect fonksiyonunu kullanarak bir pencerenin kapladığı dikdörtgensel alanın koordinatlarını alabilir. Bu fonksiyon bir RECT yapısının içini pencerenin üst-sol ve alt-sol köşesinin koordinat durum bilgisi ile doldurur. Bildiğiniz gibi bu koordinatlar ekran için de parent pencerenin client alanı içinde en sol üst köşedir.

 

Bazen client pencerelerin koordinatlarını bağlı oldukları parent pencerenin client alanına göre değilde ekran koordinatlarına göre almak isteyebilirsiniz. Yani Bir client pencereyide tıpkı bir parent pencereymiş gibi koordinat hesabını ekrana göre çıkarabilirsiniz. Bunun için ScreenToClient veya MapWindowPoints fonksiyonlarını kullanabilirsiniz.

 

            Bir pencerenin client alanın koordinatını GetClientRect fonskiyonu ile alabilirsiniz. GetClientRect kendisine parametre olarak verilen pencerenin client alanını en üst sol ve en sağ alt köşeden baz alarak hesaplar.

 

            Desktop üzerinde yer alan pencereleri ve parent pencerenin’de child pencerelerini CascadeWindow fonksiyonu ile sıralı ve düzenli bir şekilde ekran üzerinde dizebilirsiniz. TileWindows fonksiyonu ilede desktop pencerelerini ve yine child pencereleri ekran üzerine tam sığacak şekilde döşeyebilirsiniz.

 

- Boyutlandırma ve Pozisyonlandırma Mesajları (Size and Position Messages) -

 

            Bir pencerenin boyutlarında ve pozisyonunda değişiklik meydana geldiğinde Windows pencreye WM_GETMINMAXINFO mesajını gönderir. Bu mesaj hem kullanıcının doğrudan pencere ile temasınde (örneğin başlık çubuğundan sürüklemek veya çerçeveden boyutları ile oynamak gibi) hemde bunu yapan fonksiyonlarda (örneğin SetWindowPos) bile kullanıcıya gönderilir. Bu mesaj MINMAXINFO adlı bir yapıya point eder. Bu yapı içerisinde pencere için boyut ve pozisyon bilgisinin yanı sıra varsayılan minimum ve maximum iz (tracking) ölçüsünüde tutar. Programcı dilerse bu yapının elemanları ile oynayıp bu mesajı yine aynı mesajla pencere gönderip dilediği özelliği almasını sağlayabilir. Bir pencerenin bu mesajı alıp işlemesi için WS_THICKFRAME veya WS_CAPTION stillerine sahip olması gerekmektedir.

 

            Bir pencerenin boyutu, pozisyonu, Z-Order’daki öncelik sırası veya gösterim durumu gibi nitelikleri değiştiğinde WM_WINDOWPOSCHANGING mesajı o pencereye gönderilir. Bu mesajda WINDOWPOS adlı bir yapıyı içerir ve bu yapının içerisinde yukarıda saydığımız değişikliklerle alakalı bilgileri barındırır. Pencere bu mesajı set etmek için aldığında WM_SIZE ve WM_MOVE gibi mesajları işlemek durumundadır. Bu mesajları varsayılan olarak işlemeyen pencere için bu mesaj doğrudan DefWindowProc fonksiyonu tarafından işlencektir.

 

            Windows bir pencere olustugunda ve de boyutlandırıldığında  (sized) pencereye WM_NCCALSIZE mesajı gönderir. Windows bu mesajı pencerenin çalışma alanının (client area) boyutunu hesaplamada ve pencerenin sol üst köşesini baz alarak client alanın pozisyonunu bulmada kullanır. Bu mesaj çoğunlukla varsayılan pencere işleyicisi (default window procedure) tarafından işlenir.

 

- Pencere Yoketme (Window Destruction) -

 

            Genelde bir uygulama olusturulmus olan bütün pencereleri yok edebilir. Bunu DestroyWindow fonksiyonu vasıtası ile yapar. Bir pencerenin yok edilme süreci başladığında pencere önce hide edilir peşinden pencere ile bağıntılı tüm dahili data’lar kaldırlır ve uygulama tarafından bu pencere için kullanılan pencere handle’I artık geçersiz kılınır.

 

Bir pencere yok edildiğinde bu o pencernin olusutulmasında kullanılmıs olan window class’inda yok olacagi anlamina gelmez. Yok edilen tek sey pencerenin o an sistemde kullanmakta oldugu kaynaklardır. Dilenirse bu sinif yeniden kullanılarak pencere olusturulabilir.

           

            DestroyWindow fonksiyonu önce pencereye, peşinden tüm child ve bu pencereden türemiş diğer pencerelere WM_DESTROY mesajı gönderir. Böylece tüm bağımlı pencereler ve pencerenin kendisi yok edilmiş olur. Yine bir pencerenin pencere menüsünde yer alan Close komutunu seçerek yapılan kapatılma girişimlerinde pencereye WM_CLOSE mesajı gönderilir. Uygulama bu mesajı yakalayarak kullanıcının gerçekten bu pencereyi yok edip etmek istemediğini sormasına fırsat sağlayabilir. Şayet kullanıcı pencerenin yok olmasından yana bir giriş verirse o zaman pencereye DestroyWindow fonksiyonu ile yok etme mesajını göndermek zorundadır.

 

            Eğer yok edilen pencere o an aktif ve odaklı olan pencere ise yok edildikten sonra bu durum başka bir pencereye geçer. Dilerse kullanıcı bunu manuel olarak ta « ALT+ESC « tuş kombinasyonunu kullanarak yapabilir.

 

- Pencereler ile Çalışma (Using Windows) –

 

      Bu bölümde aşağıdaki görevleri nasıl yapacağımızı öğreneceğiz:

 

-          Bir ana pencere oluşturma

-          Child pencere olusturma, var olan child pencereleri elde etme, ve boyutlandırma

-          Bir pencereyi yoketme

 

Ilk Ana Pencere’mizi olusturalim

 

            Bir uygulamanin sahip oldugu ilk pencereye ana pencere (main window) adı verilir. Ana pencerenizi CreateWindowEx fonksiyonuna pencere sınıfınızı (window class), pencerede görünmesini istediğiniz ismi (window name), pencerenizin sahip olmasını istediğiniz stilleri (window styles) , boyutunu, pozisyonunu, menu handle’ini , tanımlayici handle’ini ve olusum data bilgilerini girerek olusturabilirsiniz. Ana pencere uygulama-tanımlı (application-defined) bir sınıfa aittir, bu yüzdendir ki ana pencere olusmadan once bu sınıf için bir pencere prosedürü (window procedure) sağlanır ve yine bu pencere sınıfı (window class) sisteme kayıt (register) ettirilmelidir.

 

Çoğu uygulama genelde ana pencerelerini (main window) olustururken WS_OVERLAPPEDWINDOW stilini kullanırlar. Bu stil bir pencerenin bir başlık çubuğuna (title bar), bir pencere menüsüne (window menu), boyutlandırılabilir bir çerçeveye (sizing border), minimize ve maximize düğmelerine sahip olmasını sağlar. CreateWindowEx fonksiyonu pencereyi sistemde olusturup geriye pencereyi tanımlayan tekil bir kimlik (unique identifier) dönderir.

 

 

 Aşağıdaki örneğimizde uygulama-tanımlı pencere sınıfına ait olan bir ana pencere olusturacagiz. Pencere ismi (window name) başlık çubuğunda görünecek. Ayrıca WS_OVERLAPPEDWINDOW stili ile birlikte pencere olusturulurken de WS_VSCROLL ve WS_HSCROLL stilleri birlikte kullanılarak penceremiz için yatay ve dikey kaydırma çubukları (scroll bars) olusturacagiz. Dört adet olan CW_USEDEFAULT sabitleri ise penceremizin başlangıc boyut ve pozisyon bilgilerini sistem ön tanımlı değerlerle dolduracaktır. NULL geçilen alanlar ise o tip’te özellik istemediğimizi belirtiyoruz.

 

 

Masm32 için örnek kod:

 

 

.386

.model flat,stdcall

option casemap:none

include \masm32\include\windows.inc

include \masm32\include\user32.inc

include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib

includelib \masm32\lib\kernel32.lib

 

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

 

.data

ClassName db "BenimPencereSinifim",0

AppName  db "Yasasin ilk pencerem ",0

 

.data?

hInstance HINSTANCE ?

CommandLine LPSTR ?

.code

start:

                invoke GetModuleHandle, NULL

                mov    hInstance,eax

                invoke GetCommandLine

                mov    CommandLine,eax

                invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT

                invoke ExitProcess,eax

 

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD

                LOCAL wc:WNDCLASSEX

                LOCAL msg:MSG

                LOCAL hwnd:HWND

                mov   wc.cbSize,SIZEOF WNDCLASSEX

                mov   wc.style, CS_HREDRAW or CS_VREDRAW

                mov   wc.lpfnWndProc, OFFSET WndProc

                mov   wc.cbClsExtra,NULL

                mov   wc.cbWndExtra,NULL

                push  hInstance

                pop   wc.hInstance

                mov   wc.hbrBackground,COLOR_WINDOW+1

                mov   wc.lpszMenuName,NULL

                mov   wc.lpszClassName,OFFSET ClassName

                invoke LoadIcon,NULL,IDI_APPLICATION

                mov   wc.hIcon,eax

                mov   wc.hIconSm,eax

                invoke LoadCursor,NULL,IDC_ARROW

                mov   wc.hCursor,eax

                invoke RegisterClassEx, addr wc

                INVOKE CreateWindowEx,

NULL,\

ADDR ClassName,\

ADDR AppName,\

                                WS_OVERLAPPEDWINDOW,\

CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,\

NULL,\

NULL,\

              hInst,\

NULL

                mov   hwnd,eax

                invoke ShowWindow, hwnd,SW_SHOWNORMAL

                invoke UpdateWindow, hwnd

                .WHILE TRUE

                                invoke GetMessage, ADDR msg,NULL,0,0

                                .BREAK .IF (!eax)

                                invoke TranslateMessage, ADDR msg

                                invoke DispatchMessage, ADDR msg

                .ENDW

                mov     eax,msg.wParam

                ret

WinMain endp

 

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

                .IF uMsg==WM_DESTROY

                                invoke PostQuitMessage,NULL

                .ELSE

                                invoke DefWindowProc,hWnd,uMsg,wParam,lParam                           

                                ret

                .ENDIF

                xor eax,eax

                ret

WndProc endp

end start

 

 

Not: Yukarıdaki assembly ifadelerinden anlamıyor veya assembly ile pencere olusumu hakkında daha ayrıntılı bir makale okumak istiyorsanız lütfen bu adresi ziyaret ediniz.

http://www.snakeforce.com/forum/forum_posts.asp?TID=11

 

C++ için örnek kod:

 

 

HINSTANCE hinst; 

HWND hwndMain;

 

// Ana Pencerimizi olusturuyoruz.

 

hwndMain = CreateWindowEx(

                                    0,                      // genisletilmis stil istemiyoruz          

                                    "BenimIlkPencerem",           // sinifimizin adi

"Ana Pencere",          // pencere ismi                 

    WS_OVERLAPPEDWINDOW |   // overlapped pencere           

    WS_HSCROLL |        // yatay kaydirma cubugu       

                  WS_VSCROLL,         // dikey kaydirma cubugu         

    CW_USEDEFAULT,          // varsayilan yatay pozisyon 

 

    CW_USEDEFAULT,          // varsayilan dikey pozisyon   

    CW_USEDEFAULT,          // varsayilan genislik               

    CW_USEDEFAULT,          // varsayilan yukseklik              

    (HWND) NULL,            // herhangi bir ust veya sahip pencere yok   

    (HMENU) NULL,           // sinif menusu olacak (bu varsayılandir)            

    hinstance,              // tanimlayici kimlik (bu uygulamanin modul’u olacaktir)             

    NULL);                  // pencere olusum bilgisi istemiyoruz     

 

if (!hwndMain)

    return FALSE;

 

 

ShowWindow(hwndMain, SW_SHOWDEFAULT); // Bu fonksiyon ile artik penceremizin ekranda //goruntulenme istegini sisteme bilidiroyoruz

UpdateWindow(hwndMain);                             //ve son işlem artık penceremiz ekranda

Yukarı Dön
 Yanıt Yaz Yanıt Yaz

Forum Atla Forum İzinleri Açılır Kutu Gör

Bulletin Board Software by Web Wiz Forums® version 9.06
Copyright ©2001-2007 Web Wiz

Bu Sayfa 0,234 Saniyede Yüklendi.