GTK ile GUI Programlama - 2

ArticleCategory:

SoftwareDevelopment

AuthorImage:

Ozcan Gungor

TranslationInfo:

original in tr Özcan Güngör

AboutTheAuthor

1997'den beri Linux kullanıyorum.Özgürlük, esneklik ve açık-kod Linux'ta en sevdiğim özelliklerdir.

Abstract

Makale dizisinin bu ikinci bölümünde, kutulardan ve tablolardan bahsedeceğiz.Bunlarla bileşenlerin penceredeki yerlerini belirleyeceğiz.Bu makaleyi anlamak için C'de aşağıdaki konuların bilinmesi gerekmektedir: Ve ayrıca dizinin ilk sayısının okunması, bu makalenin anlaşılması açısından faydalı olacaktır.

ArticleIllustration:

GTK

ArticleBody:

Bileşenlerin Kutular ile Paketlenmesi

Bileşenlerin paketlenmesi, bileşenlerin pencerenin neresinde hangi sırada bulunacağının belirlenmesi demektir. GTK ile bunu yapmanın yollarından biri kutuları kullanmaktır. Kutuların temel prensibi, bileşenlerin yatay veya dikey olarak istenen sırada bulunmalarını sağlamaktır. İki çeşit kutu vardır: Yatay kutular ve dikey kutular. Şimdi bunları açıklayalım.

Yatay Kutular

Bu kutularda bileşenler, yatay olarak dizilir ve gösterilir. Yatay bir kutuyu şu şekilde oluştururuz:

gtk_widget *kutu;
kutu=gtk_hbox_new(gboolean homojen, gint bosluk);

Burada homojen parametresi, bileşenlerin yatay kutu içerisinde homojen şekilde dağılıp dağılmayacağını belirler.Eğer bu değer TRUE ise bileşenler homojen olarak dağılır; FALSE ise bileşenler yan yana durur. bosluk parametresi ise iki bileşen arasındaki boşluğun uzunluğunu göstermektedir.

Dikey Kutular

Bu tür kutularda bileşenler, dikey olarak dizilirler ve gösterilir. Dikey bir kutuyu şu şekilde oluştururuz:

gtk_widget *kutu;
kutu=gtk_vbox_new(gboolean homojen, gint bosluk);

Parametrelerin anlamları yatay kutudakilerle aynıdır.

Kutuların Ortak Özellikleri

Kutulara bileşen eklemenin iki yolu vardır: Birincisi

gtk_box_pack_start(GtkBox *kutu,GtkWidget *cocuk, 
            gboolean genislet, gboolean doldur, guint dolgu);
fonksiyonunu kullanmaktadır. Bu fonskiyon ile bileşenleri, yatay kutunun hep solundan, dikey kutunun hep üstünden ekleriz.kutu parametresi, bileşenin ekleneceği kutunun adıdır. cocuk, eklenecek olan bileşendir. genişlet, bileşeninin kendisine kalan boşluğun ortasına yerleştirilmesini; doldur, bileşenin kendisine ait boşluğun tamamını doldurmasını sağlar.dolgu ise bileşenin sağında ve solundan belirtilen değer kadar boşluk bırakılmasını sağlar.

Diğer yol ise

gtk_box_pack_end(GtkBox *kutu,GtkWidget *cocuk, 
          gboolean genislet, gboolean doldur, guint dolgu);
fonksiyonudur. Bu fonksiyon ile bileşenleri kutuların hep sonuna ekleriz. Parametreler, önceki fonksiyonunkiler ile aynıdır. Kutular, başka kutularla paketlenebilir.

Bir kutuyu penceye eklemek için

gtk_container_add (GtkContainer	*container,GtkWidget *bilesen);
fonksiyonu kullanılır. container, kutunun ekleneceği pencere ve bilesen, kutunun adıdır.Örneğin yukarıda oluşturduğumuz bir kutuyu pencere'ye eklemek için
gtk_container_add(GTK_CONTAINER(pencere),kutu);
satırı yeterlidir.
gtk_box_set_homogeneous (GtkBox *kutu, gboolean homojen);
gtk_box_set_spacing(GtkBox *kutu, gint boşluk);
fonksiyonlarıdan birincisi kutunun homojen özelliğini, ikincisi ise boşluk özelliğini değiştirmektedir. Parametrelerin anlamları, kutuları oluşturan fonksiyondakilerle aynıdır. kutu parametresi ise özelliğini değiştirmek istediğimiz kutunun ismidir.
gtk_box_set_child_packing(GkBox *kutu,GtkWidget *cocuk, 
    gboolean genislet, gboolean  doldur, guint dolgu, 
    GtkPackType paketleme_tipi);
fonksiyonu ise bir bileşenin paketlenme özelliklerini değiştirir. Parametlerin anlamları, bileşenleri ekleyen fonksiyonlardakilerle aynıdır. paketleme_tipi, GTK_PACK_START, GTK_PACK_END değerlerini alabilir. GTK_PACK_START, eğer bileşen gtk_pack_start ile paketlenmiş ise değişiklik olmaz. Ancak bileşen gtk_pack_end ile paketlenmiş ise bileşen en başa geçer. GTK_PACK_END, bileşen gtk_pack_end ile paketlenmiş ise bir değişiklik yapmaz. Ancak gtk_pack_start ile paketlenmiş ise bileşeni kutudaki son bileşen yapar.

Burada anlatılanları daha iyi anlamak için kutular.c programını çalıştırıp denebilirsiniz.

Tablolar

Tablolar, HTML tablolarında olduğu gibi, bileşeni istenilen bölgeye yerleştirmemize yardımcı olur. Bunun için istenilen sayıda satır ve sütunu olan bir tablo oluşturur ve istediğimiz hücreye veya hücrelere (sadece yanyana veya altalta olan hücreler için geçerli) bileşeni yerleştiririz. Bir tablo oluşturmak için şu satırlar yeterli:

GtkWidget *tablo;
tablo=gtk_table_new(guint satır, guint sutun, gboolean homojen);
satır, tablonun satır sayısı; sutun, sütun sayısıdır. homojen, hücrelerin ölçülerinin korunup korunmayacağını belirler. Bu değer TRUE ise değerler korunur, FALSE ise korunmaz.

Bileşenlerin eklenmesi için

void gtk_table_attach (GtkTable *tablo, GtkWidget *cocuk, 
         guint sol_hucre, guint sag_hucre, guint ust_hucre,

guint alt_hucre, GtkAttachOptions xsecenegi, GtkAttachOptions ysecenegi, guint xdolgusu, guint ydolgusu);
tablo, bileşenin ekleneceği tablo; cocuk, eklenecek bileşendir. sol_hucre, bileşenin kaplayacağı en soldaki hücre numarası; sag_hücre, bileşenin kaplayacağı en sağdaki hücre numarasıdır. Yukarıda da belirttiğim gibi, bileşen yanyana birden fazla hücreyi kaplayabilir. ust_hucre, bileşenin kaplayacağı en üstteki hücre numarası; alt_hucre, bileşenin kaplayacağı en alttaki hücre numarasıdır.Bileşenler altalta olan birden fazla hücreyi kaplayabilirler.

xsecenegi ve ysecenegi, üç farklı değer alabilir: GTK_FILL, GTK_EXPAND, GTK_SHRINK. GTK_FILL, bileşenin butun hücreyi doldurmasını sağlar. Örneğin bir normal düğme, hücrenin tamamını kaplar. GTK_EXPAND, bileşenin hücrenin ortasında durmasını sağlar. GTK_SHRINK, bileşen hücrenin boyundan büyük ise bileşeni hücrenin boyutlarına küçültür. xsecenegi, bu değişikleri sadece x ekseni boyunca; ysecenegi, y ekseni boyunca değişiklikleri yapar.

xdolgusu, x ekseni boyunca bileşenin çevresine bu değer kadar boşluk konulmasını sağlar.Aynı şekilde, ysecenegi, y ekseni boyunca boşluk bırakır.

Aşağıda örnek bir program vardır:

#include <gtk/gtk.h>

void delete_event( GtkWidget *widget,GdkEvent  *event,gpointer data )
{
    gtk_main_quit ();
}

int main( int   argc,char *argv[] )
{
    GtkWidget *window;
    GtkWidget *button;
    GtkWidget *table;

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    gtk_signal_connect (GTK_OBJECT (window), "delete_event",GTK_SIGNAL_FUNC (delete_event), NULL);

    table = gtk_table_new (2, 2, TRUE);

    gtk_container_add (GTK_CONTAINER (window), table);

    button = gtk_button_new_with_label ("button 1");
    gtk_table_attach(GTK_TABLE(table), button, 0, 1, 0, 2,GTK_SHRINK,GTK_SHRINK,0,0);
    gtk_widget_show (button);

    button = gtk_button_new_with_label ("button 2");
    gtk_table_attach (GTK_TABLE(table), button, 1, 2, 1, 2,GTK_SHRINK,GTK_SHRINK,0,0);
    gtk_widget_show (button);
    
    button = gtk_button_new_with_label ("button 3");
    gtk_table_attach (GTK_TABLE(table), button, 1, 2, 0, 1,GTK_SHRINK,GTK_SHRINK,0,0);
    gtk_widget_show (button);

    gtk_widget_show (table);
    gtk_widget_show (window);

    gtk_main ();

    return 0;
}

Bu fonksiyondaki bu kadar çok parametre olması, yeni bir fonksiyon oluşmasına neden olmuş.Bu fonksiyon da bileşeni tabloya ekler ama daha az parametre kullanır.

void gtk_table_attach_defaults (GtkTable *tablo,GtkWidget *bilesen, 
         guint sol_hucre, guint sag_hucre, guint ust_hucre, guint alt_hucre); 
İstenen parametreler, gtk_table_attach fonksiyonundakilerle aynıdır. Eksik olan parametereler yerine varsayılan değerler kullanılır. xseceneği'nin ve ysecenegi'nin varsayılan değeri GTK_FILL|GTK_EXPAND 'dir. xdolgusu ve ydolgusu'nun varsayılan değeri ise 0'dır.

Aşağıdaki fonksiyon ile var olan bir tablonun satır ve sütun sayısını değiştirebilirsiniz:

void gtk_table_resize(GtkTable *tablo, guint satır, guint sutun);

Aşağıdaki fonksiyonlarda üstteki, belirtilen bir satırın, ikincisi belirtilen bir sütunun boşluk değerini değiştirir:

void gtk_table_set_row_spacing (GtkTable *tablo, guint satır, guint bosluk);
void gtk_table_set_col_spacing (GtkTable *tablo, guint sutun, guint bosluk);

Aşağıdaki fonksiyonlardan üstteki tablodaki bütün satırların, alttaki ise bütün sütunların boşluk değerini değiştirir:

void gtk_table_set_row_spacings (GtkTable *tablo, guint bosluk);
void gtk_table_set_col_spacings (GtkTable *tablo, guint	bosluk);

Aşağıdaki fonksiyon bir tablonun homojenlik özelliğini değiştirir:

void gtk_table_set_homogeneous (GtkTable *tablo, gboolean homojen);

Özet

Bu makalede, GTK'da bileşenlerin paketlenme çeşitleri olan kutuları ve tabloyu öğrendik. Çeşitli özelliklerini değiştiren fonksiyonları gördük. Herhangi bir sorunuz veya öneriniz olursa bana iletebilirsiniz. Kolay gelsin...