Üst seviye pencere ise kullanıcıya sunulacak en önemli kontrolleri ve verileri içerir. Örneğin bir kelime işlemci programında üst seviye pencere hem dökümanı gösterirken aynı zamanda dökümanla ilgili birçok veriyi de barındırır. Aynı şekilde bir web tarayıcının üst seviye penceresi hem sayfayı gösterir hem sayfa hakkında bilgiler barındırır. Aşağıdaki şekil bu iki temel nesnenin birbirleri ve uygulamanın geri kalanıyla bağlantılarını gösterir.
Bu diyagramda da göründüğü gibi uygulama nesnesi ana olay çevrimi ve üst seviye pencereyi içerir. Üst seviye pencere üzerindeki kontrolleri ve iliştirdiğiniz diğer veri nesnelerini içerir. Bu pencere ve içindeki kontroller kullanıcının hareketlerinden olayları tetikler.
Her WxRuby programı bir adet uygulama nesnesi bulundurmalıdır. Uygulama nesnesi Wx::App sınıfının bir oluşumu veya altsınıfıdır. Uygulama nesnesinin esas amacı ana olay çevrimini yönetmektir. Bu olay çevrimi pencere sisteminden gelen olay isteklerini işler ve ilgili olay işleyici rutinlere yönlendirir. Ayrıca bu uygulama nesnesi uygulama geneli nesneler de barındırabilir (veritabanı bağlantıları gibi).
Wx:App alt sınıfını üretmek
Bu altsınıfı üretmek kolay olduğundan ek bir özellik gerekmese bile bu altsınıfı üretmek yapısal olarak doğru olacaktır. Bu altsınıfı üretmek için dört adım yapılır :
Altsınıf tanımlamasını yaparız.
“on_init” metodunu bu tanımlama içine koyarız.
Programımızın ana bölümünde bu sınıfın bir oluşumunu üretiriz.
Bu oluşumun “main_loop” metodunu çağırırız ve kontrol WxRuby'ye geçer.
“on_init” metodu uygulama başlayınca ana çevrime girmeden önce çalışır. Bu metod parametre almaz ve bir bool değer döner. Eğer bu metod false dönerse uygulama hemen sona erer. Tipik olarak on_init metodu içinde enazından bir frame tanımlaması yapılır. Ayrıca bu frame'in show metoduda burda olur. Ayrıca bu frame'in uygulamanın üst seviye penceresi olduğunu da set_top_window ile tanıtabiliriz. Üst seviye pencere sahibi tanıtılmamış diyalog pencereleri için default “sahip” tir.
Wx::Frame nesnesi ile çalışmak
WxRuby'de frame kullanıcıların pencere diye isimlendirdiği GUI elemanıdır. WxRuby'de tüm pencerelerin üst sınıfı Wx::Frame dir. Frame altsınıfını üretirken initialize metodu içinde üst sınıf parametreleriyle çağırılır. Bu parametrele şöyledir :
Wx::Frame.new( parent , id , title , pos=DEFAULT_POSITION ,
size=DEFAULT_SIZE , style=DEFAULT_FRAME_STYLE , name=”frame”)
Bir çok kontrol de benzer parametreler alır.
Parametre | Açıklaması |
parent | Frame'in içine yerleşeceği yer. Üst seviye pencereler için bu parametre nil değeri alır. Eğer frame bir pencere içine yerleşecekse parent o penceredir. Bu durumda frame parent'in içinde beraber büyüyecek ve hareket edecektir. Parent kapanırsa bu frame de kapanır. |
id | Frame kontrolü id numarası. Buraya özel bir sayı girebilirsiniz ya da -1 girerek WxRuby'nin otomatik id üretmesini sağlayabilirsiniz. |
title | Frame etiketi. Bir çok stilde frame üst kısmındaki barda gösterilir. |
pos | Bir Wx::Point nesnesi boş bırakılırsa işletim sistemi bir yer belirler. Ekranın sol üst köşesi (0, 0) olarak düşünülerek frame'in ekrandaki yerini belirleyebilirsiniz. |
size | Bir Wx::Size nesnesi frame'in ilk açılıştaki boyutunu tayin eder. Boş bırakılırsa default bir boyutla açılır. |
style | Sabitlerden oluşan bir bitmask. Frame stilini belirler. Stil Sabitleri arasına | (bitwise or) işareti koyarak birçok stil sabiti kullanılabilir. |
name | Frame'e verilen dahili isimdir. Daha sonra frame'i bulmak için kullanılabilir. |
Frame stilleri sabitlerin birleşmesinden oluşmuştur. Örneğin DEFAULT_FRAME_STYLE şunlardan oluşur :
MAXIMIZE_BOX | MINIMIZE_BOX | RESIZE_BORDER |
SYSTEM_MENU | CAPTION | CLOSE_BOX
Bu birleşik stil içinden bir ya da birkaçını istemezsek özel veya ile çıkarabiliriz :
DEFAULT_FRAME_STYLE ^ ( RESIZE_BORDER | MINIMIZE_BOX | MAXIMIZE_BOX )
Tavsiye edilen üst seviye pencerede default stili kullanmaktır. Böyle olunca kullanıcı hangi pencerenin asıl olduğunu daha rahat anlar.
Stil | Açıklaması |
CAPTION | Frame üzerine bir bar ekler buraya frame'in title parametresindeki string yazılır. |
CLOSE_BOX | Frame etiket barına bir kapatma düğmesi ekler işletim sisteminden aynı şekliyle pencere kapatma düğmesi eklenir. |
DEFAULT_FRAME_STYLE | Yukarda açıklamıştık. |
FRAME_SHAPED | Bu stilde olan frame'ler set_shape metoduyla dikdörtgenden başka şekillerde olabilirler. |
FRAME_TOOL_WINDOW | Frame'in toolbox penceresi olarak görünmesini sağlar. Daha küçük bir etiket barı olur sadece kapatma düğmesi olur ve görev yöneticide bu pencere görünmez. |
MAXIMIZE_BOX | Pencereye tam ekran düğmesi ekler. |
MINIMIZE_BOX | Pencereye aşağı küçültme düğmesi ekler. |
RESIZE_BORDER | Pencerenin boyutu değiştirilebilir olmasını sağlar. |
SIMPLE_BORDER | Gölgelendirmesiz düz ekran her işletim sisteminde çalışmaz. |
SYSTEM_MENU | Pencereye system menüsü ekler. İlgili düğmelerin seçilmediği işlemler bu menüden de yaplamaz. (Tam ekran, minimize gibi) |
|
|
Frame'e Widget Eklemek
Aşağıdaki programda frame ortasında bir buton konmuş ve butona tıklanınca uygulama sona eriyor.
1 #!/usr/bin/env ruby
2 # Widget.rb Frame'e Buton Eklemek
3
4 require 'rubygems'
5 require 'wx'
6 include Wx
7
8 class InsertFrame < style="color: rgb(0, 0, 255);">
9 def initialize
10 super nil, -1, "Butonlu Frame", :size=>Size.new(300, 100)
11 panel = Panel.new self #1 Panel eklenmesi
12 button = Button.new panel, -1, "Close",
Point.new(125, 25), Size.new(60, 50) #2 Panele buton eklenmesi
13 evt_button(button) {on_close_me} #3 Butona tıklanınca
14 evt_close {on_close_window} #4 pencere kapanınca
15 end
16
17 def on_close_me
18 close
19 end
20
21 def on_close_window
22 destroy
23 end
24 end
25
26 class MyApp < style="color: rgb(0, 0, 255);">
27 def on_init
28 insert_frame = InsertFrame.new
29 insert_frame.show
30 end
31 end
32
33 if __FILE__ == $0
34 my_app = MyApp.new
35 my_app.main_loop
36 end
37
InsertFrame sınıfının iki alt window'u var. İlki panel, bu panel diğer windowları içine yerleştirmek için kullanılır. İkincisi de sıradan bir buton. Bunlar 1 ve 2 işaretli satırlarda gösterilmiştir. Daha sonra 3 nolu işaretli satırda butona tıklanınca çağırılacak kod bloğu tanıtılıyor. 4 nolu işaretli satırda pencere kapatma işlemi çağırılınca uygulmanın kapatılması için gerekli kod bloğu çağırılıyor.
Çoğu durumda frame içinde aynı boyutu kaplayacak bir panel koyarız ve diğer kontrolleri bu panel üzerine yerleştiririz. Ayrıca windows işletim sisteminde frame nesnesinin arkaplan rengi standart dışıdır ve gridir. Rengi beyaz olan bir panel ile daha güzel görüntü olacaktır. Ayrıca panel nesnesi içinde kontroller arasında tab butonu ile ezilebilir ama frame'de bu olmaz. Birçok diğer UI sistemlerde kontrol üretildikten sonra bir insert komutuyla ana taşıyıcıya eklenir. WxRuby de ise sadece kontrol üretilirken parent parmetresine taşıyıcı adı yazılır.
Ayrıca dikkat edersek buton için bir boyut girdik ve konacağı pozisyonu belirttik ama panel için böyle bir tanımlama yapmadık. WxRuby'de bir frame içine tek bir window yerleştirirsek (burada panel yerleştirilmiş, buton panelin içinde) bu window frame içinin tamamına otomatik olarak yayılır ve beraber boyut değiştirir. Panele boyut versek de bir şey değişmeyecekti. Ekrana konan her kontrole bir boyut vermek ve pencere boyutu değiştirilince olacaklara hükmetmek için rutinler yazmak oldukça zordur. Bunun için Sizer adı verilen nesneler kullanırız ama daha sonra açıklarız nasipse.
Hiç yorum yok:
Yorum Gönder