[LinuxFocus-icon]
<--  | Strona G��wna  | Mapa Serwisu  | Indeks  | Szukaj

Nowo�ci | Archiwum | Linki | O Nas
Ten dokument jest dost�pny w nast�puj�cych j�zykach: English  Castellano  ChineseGB  Deutsch  Francais  Italiano  Nederlands  Russian  Turkce  Polish  

Ozcan Gungor
Özcan Güngör
<ozcangungor(at)netscape.net>

O Autorze:
U�ywam Linux'a od 1997. Swoboda, elastyczno�� oraz otwarty kod. To s� w�a�ciwo�ci kt�re lubi�.

Tlumaczenie na j�zyk polski: :
Daniel Maciejewski <danielma(at)go2.pl>

Zawarto��:

 

Programowanie Graficznego Interfejsu U�ytkownika GUI za pomoc� GTK

GTK

Notka:

W tej serii artyku��w nauczymy si� jak pisa� aplikacje z graficznym interfejsem u�ytkownika (GUI) u�ywaj�c GTK. Nie mam poj�cia jak d�uga b�dzie ta seria. �eby zrozumie� te artyku�y, musisz zna� kilka podstaw j�zyka programowania C, mianowicie:

  • Zmienne
  • Funkcje
  • Wska�niki


_________________ _________________ _________________

 

Czym jest GTK?

GTK (GIMP Toolkit) jest bibliotek� pozwalaj�c� tworzy� interfejsy graficzne. Ta biblioteka jest dost�pna na licencji GPL. U�ywaj�c wi�c tej biblioteki mo�esz tworzy� darmowe lub komercyjne programy typu open-source.

Biblioteka ta ma nazw� GIMP toolkit (GTK) poniewa� by�a oryginalnie zaprojektowana dla rozwoju programu GIMP (General Image Manipulation Program). Autorami GTK s�:

GTK jest zorientowan� obiektowo aplikacj� interfejsu u�ytkownika. Chocia� napisana jest w C, u�ywa idei klas oraz funkcji po��czenia zwrotnego (callback functions).

 

Kompilacja

�eby skompilowa� programy korzystaj�ce z GTK, musisz powiedzie� kompilatorowi gcc jakie biblioteki s� potrzebne i gdzie si� znajduj�. Te informacje mo�emy uzyska� stosuj�c komend� gtk-config.

# gtk-config --cflags --libs

Wyniki zwr�cone przez wykonanie tej komendy mog� by� (zale�nie od systemu) podobne do poni�szych:

-I/opt/gnome/include/gtk-1.2 -I/opt/gnome/include/glib-1.2 -I/opt/gnome/lib/glib /include -I/usr/X11R6/include -L/opt/gnome/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -l Xext -lX11 -lm

Oto wyja�nienia powy�szych parametr�w:

-l biblioteka: Szuka biblioteki w postaci libbiblioteka.a w zdefiniowanych �cie�kach.
-L �cie�ka : Dodaje �cie�k� poszukiwa� dla bibliotek.
-I �cie�ka : Dodaje �cie�k� poszukiwa� dla plik�w nag��wkowych, u�ywanych w programie.

Aby skompilowa� program GTK o nazwie hello.c, musi by� u�yta nast�puj�ca komenda:

gcc -o hello hello.c `gtk-config --cflags --libs`

Parametr u�yty po opcji -o decyduje o nazwie, jak� b�dzie mia� skompilowany program.

 

Pierwszy program

Zak�adam, �e masz zainstalowane GTK w swoim systemie. Naj�wie�sz� wersj� GTK mo�esz znale�� na serwerze ftp.gtk.org.

Napiszmy nasz pierwszy program. Tworzy on puste okno o rozmiarze 200x200 pikseli.

#include <gtk/gtk.h>

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

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_widget_show  (window);

    gtk_main ();

    return(0);
}

GtkWidget jest typem zmiennej, s�u��cym do definiowania r�nych komponent�w takich jak okno (window), przycisk (button), etykieta (label) ... W tym przyk�adzie, okno jest zdefiniowane w nast�puj�cy spos�b:

GtkWidget *window;

void gtk_init(int *argc,char ***argv) s�u�y do inicjalizacji oraz pobiera parametry wpisane w linii komend. Funkcja ta musi by� u�yta po zdefiniowaniu komponent�w.

GtkWidget *gtk_window_new(GtkWindowType windowtype) tworzy nowe okno. Typem okna mo�e by�:

void gtk_widget_show(GtkWidget *widget) u�ywa si� aby komponent sta� si� widoczny w oknie.Po zdefiniowaniu komponentu oraz ustawieniu atrybut�w ta funkcja musi zosta� u�yta.

void gtk_main(void) przygotowuje okna oraz wszystkie komponenty do pojawienia si� na ekranie. Tej funkcji nale�y u�ywa� na ko�cu program�w GTK.

U�yjemy teraz pewnych w�a�ciwo�ci okna takich jak tytu�, rozmiar, pozycja ...

void gtk_window_set_title(GtkWindow *window,const gchar *title) jest u�ywana do ustawienia b�d� zmiany tytu�u okna. Pierwszy parametrem tej funkcji jest typu GtkWindow. Ale zmienna window jest typu GtkWidget. Podczas kompilacji dostaniemy ostrze�enie informuj�ce nas o tym fakcie. Chocia� skompilowany program zadzia�a, to jednak lepiej jest to poprawi�. U�ywa si� do tego GTK_WINDOW(GtkWidget *widget). Drugi parametr title (tytu�) jest typu gchar. gchar zosta� zdefiniowany w bibliotece glib tak samo jak typ char.

void gtk_window_set_default_size(GtkWindow *window, gint width, gint height) ustawia rozmiar okna window (width oznacza szeroko��, height - wysoko��). Podobnie jak gchar, r�wnie� gint jest zdefiniowane w bibliotece glib tak samo jak int.

Funkcja

void gtk_window_set_position(GtkWindow *window, GtkWindowPosition position)

ustawia pozycj� okna window. Warto�ci� position mo�e by�:

Poni�ej przedstawiony jest przyk�ad programu:

#include <gtk/gtk.h>

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

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),"Ýlk Program");
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window),300,300);
    gtk_widget_show  (window);

    gtk_main ();

    return(0);
}
 

Sygna�y i zdarzenia.

U�ywaj�c intefejsu graficznego GUI, potrzebujesz u�ywa� myszki i klawiatury np. aby klikn�� przycisk. Dlatego u�ywa si� nast�pujacej funkcji GTK:

guint gtk_signal_connect_object(GtkObject *object,const gchar *name,GtkSignalFu nc func,GtkObject *slot_object);

object jest komponentem, od kt�rego pochodzi sygna�. Np. je�li chcesz wiedzie� czy zosta� klikni�ty button (czyli przycisk) , nasz object to w�a�nie b�dzie ten button. name jest nazw� zdarzenia i mo�e to by�:

func jest nazw� funkcji, kt�ra zostanie wywo�ana gdy wyst�pi okre�lone zdarzenie. Oto przyk�ad:

#include <gtk/gtk.h>

void close( GtkWidget *widget,gpointer *data)
{
    gtk_main_quit();
}

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

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_signal_connect (GTK_OBJECT (window), "destroy",
                        GTK_SIGNAL_FUNC (close), NULL);
    gtk_widget_show  (window);

    gtk_main ();

    return(0);
}

Funkcja

gtk_signal_connect (GTK_OBJECT (window), "destroy",GTK_SIGNAL_FUNC (close), NULL)

nas�uchuje czy dla okna wyst�pi�o zdarzenie destroy (zniszcz). Gdy nast�pi wi�c pr�ba zamkni�cia okna zostanie wywo�ana funkcja close. Funkcja close wywo�uje funkcj� gtk_main_quit() i program ko�czy dzia�anie.

Szczeg�y na temat sygna��w i zdarze� zostan� wyja�nione p�niej...

 

Zwyk�y przycisk

Normalne przyciski s� zwykle u�ywane do robienia pewnych rzeczy, gdy zostan� klikni�te. W bibliotece GTK s� dwa sposoby tworzenia przycisk�w:

  1. GtkWidget* gtk_button_new (void);
  2. GtkWidget* gtk_button_new_with_label (const gchar *label);

Pierwsza funkcja tworzy przycisk bez etykiety (tzn.nic nie jest napisane na przycisku). Druga natomiast tworzy przycisk z etykiet� (label), kt�ra jest napisana na przycisku.

Teraz u�yjemy nowej funkcji:

void gtk_container_add(GtkContainer *container,GtkWidget *widget)

U�ycie tej funkcji umo�liwia stworzenie przycisku (og�lnie rzecz bior�c ka�dego komponentu) kt�ry pojawi si� w oknie (generalnie w kontenerze). W kolejnym przyk�adzie kontenerem jest okno (window), a komponentem, kt�ry zostanie dodany jest przycisk (button). O innych kontenerach dowiesz si� p�niej.

Najwa�niejsz� rzecz� jak� trzeba wiedzie� o przycisku jest to czy zosta� on klikni�ty czy nie. Znowu do tego celu u�ywa si� funkcji gtk_signal_connect. Dzi�ki tej funkcji inna funkcja zostanie wywo�ana i w ten spos�b "za przyciskiem" zostanie ukryta pewna funkcjonalno��. Oto przyk�ad:

#include <gtk/gtk.h>

void close( GtkWidget *widget,gpointer *data)
{
    gtk_main_quit();
}

void clicked(GtkWidget *widget,gpointer *data)
{
        g_print("Button Clicked\n");
}
int main( int   argc,char *argv[] )
{
    GtkWidget *window,*button;

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_signal_connect (GTK_OBJECT (window), "destroy",
                        GTK_SIGNAL_FUNC (close), NULL);

    button=gtk_button_new_with_label("Button");
    gtk_container_add(GTK_CONTAINER(window),button);
    gtk_signal_connect(GTK_OBJECT(button),"clicked",
                       GTK_SIGNAL_FUNC(clicked),NULL);
    gtk_widget_show(button);

    gtk_widget_show(window);

    gtk_main ();

    return(0);
}

 

Dyskusja dotycz�ca tego artyku�u

Komentarze do dyskusji:
 Strona talkback 

<--, back to the index of this issue

Strona prowadzona przez redakcj� LinuxFocus
© Özcan Güngör, FDL
LinuxFocus.org
t�umaczenie:
tr --> -- : Özcan Güngör <ozcangungor(at)netscape.net>
tr --> en: Özcan Güngör <ozcangungor(at)netscape.net>
en --> pl: Daniel Maciejewski <danielma(at)go2.pl>

2004-01-21, generated by lfparser version 2.45