|
Csharp İle Windows Programlama (3) - Pencreler - C# Webmaster bilgi bankası, knowledge base Webmaster Araçları
AnaSayfa > C# > Csharp İle Windows Programlama (3) - Pencreler |
| Kategori | : C# | Gönderen | : Admin | Tarih | : 2008-11-11 | Puan | : 6 | Katılımcı : 4 | Okunma | : 6071 | | | |
| | PENCERELER (WINDOWS)
Sistem içersinde pencere sınıfları üç çeşit olarak belirlenmiştir. Masaüstü (desktop), program pencereleri ve kontrol pencereleri ve diyalog kutuları. Belirlenen her pencere aslında özel görev alan pencere sınıflarından türetilen formlardır. Yalnızca masaüstü penceresi diğerlerine göre büyük farklılık gösterir. Şimdi bu pencere sınıflarını ayrı ayrı inceleyelim.
Masaüstü (Desktop):
Masaüstü, işletim sistemi açıldığında sistem tarafından yaratılan ve diğer bütün formlar için ana konteynır olarak belirlenen penceredir. Masaüstü penceresi de diğer bütün formlar gibi temel özelliklere sahiptir. Elbette ki diğer bütün formların üzerinde bir form olduğu için ekstra özelliklere de sahiptir. Varsayılan olarak sistem masaüstü arka planını boyamak için “duvar kâğıdı” denilen Bitmap dosyalarını kullanabilir.
GetDesktopWindow() fonksiyonu ile masaüstüne atanmış olan handle numarası alınabilir. SystemParametersInfo() fonksiyonu ile masaüstüne ait duvar kâğıdı ve fontları değiştirilebilir.
Program Pencereleri (Application Windows) :
Program pencereleri, Windows işletim sistemi için hazırlanmış, görsel bir alana sahip, kullanıcı girişlerine izin veren ve bu girişlere göre tepkiler yaratan, kullanıcı ve program arasındaki bağlantıyı sağlayan pencerelerdir. Her windows programı en azından bir pencere yaratmak zorundadır. Bu pencereye ana pencere (main window) denir. Aynı zamanda bu ana pencereye ek olarak, diğer işlemleri gerçekleştirmek için hazırlanan pencereler de program içerisinde bulunabilir. Sonuçta program pencerelerinin temel amacı, kullanıcı girişi almak ve bu kullanıcı girişlerine uygun yanıtlar vermektir. Kullanıcı girişlerinin işlenmesi sistemin görevi iken, yapılan kullanıcı girişlerine uygun sonuçlar üretmek ve bu sonuçları kullanıcıya göstermek programın görevidir.
Bir program çalıştırıldığında sistem, programa ait pencereyi boyayarak (OnPaint()) ekranda görüntüler. Aynı zamanda sistem, masaüstüne ait görev çubuğunda açılan programın ikon ve başlık çubuğunu görüntüler. Açık formla sisteme ait bu görev çubuğundan takip edilebilir.
Minimum bir penceresi olan windows programları birçok özelliği beraberinde getirir. Bu özellikler pencere açılmadan önce tanımlanan pencere sınıfında belirtilen özelliklerdir; program ikonu başlık çubuğu, başlık, simge durumuna küçült, ekranı kapla, kapat, varsa menü bar ve bağlam menüleri gibi özellikleri barındırır.
Şekil 1.1
Yukarıda genel manada bir pencere görüntülenmek istenmiştir. Yazılan programa göre pencere farklılık gösterebilir. Ancak sistem içerisinde açılan pencereleri sistem iki kısma ayırır. İstemci alanı (Client Area) ve istemci olmayan alan (Non-client Area).
İstemci Alanı:
İstemci alanı genelde kullanıcı ile ilişki içinde olan ve kullanıcın giriş yapmasına ve yapmış olduğu girişlere tepkiler üreten ve bunları görüntüleyen alan olarak değerlendirilir. Program tarafından yaratılan bu sınıfa ait bir Pencere Fonksiyonu ile yapılan kullanıcı girişlerine yanıtlar üretilmesi sağlanır.
İstemci Olmayan Alan:
Bu alan genelde istemci alanı dışında kalan başlık çubuğu, başlık, ikon, simge durumuna küçült, ekranı kapla kapat butonları, menü bar, bağlam menüsü, kaydırma çubukları gibi alanları kapsar. Bu alan ve bu alanla ilgili özellikler ve üretilen yanıtlar sistem tarafından sağlanır. Bu alan üyelerinin tamamı sistem tarafından sağlanan sınıflardır. Bir menü oluşturduğunuzda bunu genelde sistem tarafından sağlanmış olan menü sınıfından türeterek kullanırsınız.
; Bunların dışında Şekil 2.1 de görüntülenmeyen program başlık çubuğuna tıklanarak ya da Alt-Boşluk tuş kombinasyonu kullanılarak açılan sistem menüsü yine sistemin kendisi tarafından işletilir. Gerekli API’ler kullanılarak bu menüye ekstra menüler de eklenebilir.
Kontroller ve Diyalog Kutuları:
Bir windows programı kendi ana penceresi dışında birçok pencere açabilir. Aynı zamanda bu pencereler üzerinde Windows’un kendisine ait kontroller ve/veya kullanıcı-tanımlı kontrollerde olabilir. Bunlara ek olarak program, kullanıcı ile iletişim kurmak için diyalog kutuları da belirleyebilir. Yaratılan her pencere, kontrol ve diyalog kutuları benzer nitelikler taşır. Bazı özellikler kimilerinde varken diğerlerinde olmayabilir. Bu kontrol ya da pencerenin yapısına ve davranışına göre değişiklik gösterebilir. Ancak bütün bunlara rağmen açılan pencereler için yaratılma esnasında sistemin ihtiyaç duyduğu nitelikler, pencere yaratacak fonksiyona (CreateWindow(), CreateWindowEx()) sağlanmalıdır. Şimdi bu nitelikleri inceleyelim.
Windows Nitelikleri:
Sınıf Adı; sistem içerisinde açılan her pencere bir sınıftan yaratılır. Bu sınıftan yaratılma işleminden önce program, yaratacağı sınıfları sisteme kayıt etmek zorundadır. Bu kayıt etme işlemi esnasında sınıf adı öncelikli eleman olarak kayıt eden fonksiyona (RegisterClass()) sağlanır.
Pencere Adı; genelde açılan pencerenin başlık çubuğunda görüntülenen isimdir. Gerekli bir nitelik değildir. İstenirse boş olarak da bırakılabilir. Ancak görüntülenen pencerenin amacını belirten bir isim kullanıcıya gösterilmek üzere bu başlık çubuğunda yazılır. Diyalog kutularında da aynı şekilde açılan pencerenin başlık çubuğunda görüntülenir. SaveDialog ve OpenDialog gibi. Kontrollerde ise durum biraz farklılık gösterebilir. Kimi kontroller üzerinde kontrollerin adları yazarken kimilerinde isim yazacak alan yoktur. Butonlar ve seçim kutuları örnek olarak gösterilebilir.
Pencere Stili; bir sınıf için temel görünüm özelliklerin belirleyen alandır. Bu temel özellikler sınıfın görünümünü sağladığı için yaratıcı fonksiyona iletilmelidir.
Posizyon; her pencere için masaüstünde görüntülenme alanı vardır. Pozisyon niteliği bir pencerenin sol üst köşesinin masaüstüne göre x ve y koordinatını verir. Örnek olarak açılacak bir pencere için x koordinatı için 10, y koordinatı için 20 değerleri verilirse pencerenin sol üst köşesi, masaüstünde sol üst köşeden hareketle yatay olarak 10 piksel sağdan, 20 piksel aşağıdan görüntülenmeye başlayacaktır.
; Boyut; açılan pencerenin x ve y olarak uzunluklarını belirten özelliktir. Bu özellikte piksel cinsinden değer alır. Genelde farklı bilgisayarlar farklı masaüstü çözünürlüğü (800x600 veya 1024x768 gibi) kullandıkları için verilen pencere boyutları masaüstlerine oranla farklı görünecektir. Bu nedenle herhangi bir pencereye ait boyut verilmeden önce masaüstü boyut değerini (SM_CXSCREEN, SM_CYSCREEN) almak (GetSystemMetrics()) en akılcı yöntem olacaktır.
Ana Form / Alt Form; yaratılan bir pencere ana form (Parent Form) olarak değerlendirilebilir. Ancak genelde MDI projelerinde kullanılan özellik olarak açılan bir form ana formun alt formu (Child Form) olarak da değerlendirilebilir. Herhangi bir pencere alt form olarak değerlendirilirse ve bu şekilde yaratılacaksa mutlaka bu pencereye ait ana formda belirtilmelidir. Ayrıca ana form üzerinde yapılan herhangi bir kapatılma işlemi bağlı olan alt formları da kapatacaktır.
Alt Form Tanımları; bir ana form içerisinde birden fazla alt form yaratılabileceği için program bu alt formları birbirinden ayıracak özel bir kimlik bilgisi sunabilir. Bu ayırıcı özellik SetWindowLong() fonksiyonu ile belirlenebilir. Aynı şekilde GetWindowLong() fonksiyonu kullanarak ta alınabilir.
Program Handle Numarası; sistem çalıştırılan bir program için otomatik bir handle numarası atar. Bu handle numarası programı diğer programlardan ve aynı programın birden fazla çalışan kopyasından ayırmak için kullanılır.
Pencere Handle Numarası; bu değerde sistem tarafından otomatik olarak yaratıcı fonksiyonun geri dönüş değeri olarak verilir. Bu değer pencereyi diğer pencerelerden ayıran bir özelliktir. FindWindow() fonksiyonu kullanılarak da herhangi bir pencerenin handle numarası alınabilir. Yalnız bu fonksiyon alt formlar için arama yapmaz.
Bir Pencerenin Yaratılması:
Sistem içerisinde bir pencere yaratmak için kullanılan fonksiyonlar CreateWindow() ve CreateWindowEx() fonksiyonlarıdır. CreateWindowEx() fonksiyonu bir pencereye normal stili dışında ekstra stil vermek için dwExStlye isimli bir parametre daha alır. Bunun dışından iki fonksiyon birebir aynıdır. Aslında CreateWindow() fonksiyonu CreateWindowEx() fonksiyonu dwExStyle değerini sıfır (0) olarak belirleyerek çağırır.
Her Windows programı kendi içersinde giriş noktası olarak WinMain() fonksiyonu tanımlar. Bu fonksiyon programın temel giriş noktası olarak belirlendiği için birçok görevi üstlenir. Sınıfların kayıt edilmesi (RegisterClass()) ve sınıfların yaratılması (CreateWindowEx()) bu fonksiyon içersinde gerçeklenir.
Programın giriş noktası olan WinMain() fonksiyonu kayıt edildikten sonra yaratılan ana pencereyi görüntülemez. Bu nedenle bu fonksiyon içerisinden ShowWindow() fonksiyonu çağrılarak yaratılan pencerenin görüntülenmesi sağlanır. Belirtilen fonksiyon iki adet parametre alır. İlk parametre yaratılan pencerenin handle numarasıdır – ki bu numara CreateWindowEx() fonksiyonundan dönen değere olarak alınabilir. İkinci parametre ise açılan formun SW_ öneki ile anılan MINIMIZED veya MAXIMIZED flag değerleridir. Ancak programın ana formu açılıyor ise bu değer SW_SHOWDEFAULT olarak belirlenmek zorundadır. Bu flag değeri sisteme, açılan pencerenin programın ana penceresi olduğunu belirtir.
Pencerenin yaratılması esnasından sistem pencere sınıfına ait pencere fonksiyonuna (WndProc()) sırasıyla iki adet mesaj yollar. İlk mesaj WM_NCCREATE mesajıdır ki bu mesaj formun istemci olmayan alanının yaratılmasını sağlar. İkinci mesaj WM_CREATE mesajıdır. Bu mesaj da pencerenin istemci alanının yaratılmasını sağlar. Ayrıca her iki mesaj da CREATESTRUCT yapısına bir işaretçi bulundurur. Bu yapı pencere ile ilgili gerekli tüm bilgiyi barındırır. WndProc() fonksiyonu her iki mesajı da sistem pencereyi görüntülemeden alıp işler.
Eğer yaratılan pencere bir alt form ise sistem ana forma WM_PARENTNOTIFY mesajı yollar. Bu sayede yaratılan pencere için ana form gerekli hazırlıkları yapar.
Bütün bunlara ek olarak yazılan program çok kanallı bir program olabilir ve açılan her kanal kendi içerisinde pencereler yaratabilir. Bu yaratılma işlemleri de aynı yukarıda anlatıldığı şekilde gerçekleşir.
|
Yorumlar | Henüz Kimse Yorum Yapmamış, ilk yorumu siz ekleyin! | Yorum Ekleme Aparatı | Yorum Eklemek için lütfen sol menuden giris yapınız.. | Toplam 0 yorum listelendi. |
|