[LinuxFocus-icon]
<--  | Домой  | Карта  | Индекс  | Поиск

Новости | Архивы | Ссылки | Про LF
эта страница доступна на следующих языках: English  Castellano  ChineseGB  Deutsch  Francais  Italiano  Nederlands  Russian  Turkce  Polish  

Ozcan Gungor
автор Özcan Güngör
<ozcangungor(at)netscape.net>

Об авторе:
Использую Linux с 1997.Свобода,гибкость и открытость кода. Это те качества, которые мне нравятся.

Перевод на Русский:
Юрий Дешко <deshko_deshko(at)mail.ru>

Содержание:

 

Программирование Графического Пользовательского Интерфейса с использованием GTK.

GTK

Резюме:

В этой серии статей мы узнаем, как создавать программы ГПИ с помощью GTK.Я не знаю, насколько затянется эта серия.Чтобы понять эти статьи вам необходимы следующие знания о языке программирования C:

  • Переменные
  • Функции
  • Указатели


_________________ _________________ _________________

 

Что такое GTK?

GTK(GIMP Toolkit) -- это библиотека для создания ГПИ.Библиотека доступна под GPL лицензией.Пользуясь этой библиотекой, вы можете создавать программы как открытого исходного кода, так коммерческие и свободные.

Библиотека называется GIMP toolkit (инструментарий), так как изначально была создана для разработки GIMP(General Image Manipulation Program - Основная Программа для Манипулирования Изображениями).Авторы GTK, вот они:

GTK предоставляет объектно-ориентированный интерфейс для пользовательских приложений.Написанная на C , она использует идею классов и функций обратного вызова.

 

Компиляция

Для того чтобы скомпилировать GTK программу , вам нужно сообщить gcc об использовании GTK библиотек и об их расположении.Все это "знает" команда gtk-config

# gtk-config --cflags --libs

Вывод этой команды похож на следующее(зависит от системы):

-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

Объяснения этим параметрам:

-l библиотека: Поиск библиотеки в виде libбиблиотека.a в предопределенных каталогах(path-путях).
-L путь: Добавить путь для поиска библиотек.
-I путь:Добавить путь для поиска заголовочных файлов используемых программой.

Для компиляции GTK программы называемой hello.c можно использовать следующие команды:

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

Данные после параметра -o --это имя компилируемой программы.

 

Первая программа

Предполагается, что в вашей системе установлен GTK.Последняя версия GTK может быть найдена на ftp.gtk.org.

Давайте напишем нашу первую программу.Она создает пустое окно размером 200 на 200 пикселей.

#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 - тип переменной для определения различных компонентов таких как окно,кнопки,метки...В этом примере окно определено следующим образом:

GtkWidget *window;

void gtk_init(int *argc,char ***argv) инициализирует инструментарий и принимает параметры командной строки.Эта функция должна быть использована после определения компонент.

GtkWidget *gtk_window_new(GtkWindowType windowtype) создает новое окно.Окно может быть:

void gtk_widget_show(GtkWidget *widget) используется для того ,чтобы заставить компонент появиться в окне.Функия должна использоваться после определения компонента и изменения его аттрибутов.

void gtk_main(void) подготавливает окна и все компоненты к появлению на экране.Функция должна использоваться в конце GTK программы.

Давайте используем некоторые свойства окна такие как заголовки,размер,позиция...

void gtk_window_set_title(GtkWindow *window,const gchar *title) используется для установки или изменения заголовка окна window.Первый параметр этой функции имеет тип GtkWindow.Но переменнаяwindow имеет тип GtkWidget . При компиляции мы будем предупреждены об этом.Хотя скомпилированная программа и работает , лучше ее подкорректировать. Для этого используется GTK_WINDOW(GtkWidget *widget). Второй параметр title имеет тип gchar. Тип gchar определен в библиотеке glib и является таким же самым как и тип char.

void gtk_window_set_default_size(GtkWindow *window, gint width, gint height) устанавливает размер window. .Как и gchar , gint определен в glib} и эквивалентен int.

Функция

void gtk_window_set_position(GtkWindow *window, GtkWindowPosition position)

устанавливает положение window.position может быть:

Вот пример:

#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);
}
 

Сигналы и события

В ГПИ, вам нужно использовать мышь и клавиатуру, например вы можете нажимать на кнопку приложения.Для этого используюся GTK функции:

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

object - это компонет, который испускает сигнал.Например, если вы хотите узнать была ли нажата кнопка, то object будет кнопкой. name-это имя события и может быть следующим:

func - это имя функции , которая будет вызвана когда произойдет событие.Например:

#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);
}

Функциия

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

следит за событием destroy, происходящим с окном.Когда окно пытаются закрыть , то вызывается функция close.Функция close вызывает gtk_main_quit() и программа прекращает выполнение.

Детали о сигналах и событиях будут объяснены позже...

 

Обычная кнопка

Обычные кнопки как правило используются для выполнения чего нибудь при их нажатии.В GTK библиотеке существуют два пути создания кнопок:

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

Первая функция создает кнопку без метки (на ней ничего не написано ).Второй создает кнопку с меткой(на ней написана строка label .

Тут мы используем новую функцию:

void gtk_container_add(GtkContainer *container,GtkWidget *widget)

Используя эту функцию,можно создать кнопку (в общем то любой компонент ) в окне ( или любом контейнере). В следующем примере контейнером является окно а добавляемым компонентом - кнопка.О других контейнерах мы узнаем немного позже.

Главное , что нужно знать о кнопке это была ли она нажата .Для этой цели опять же была использована функция gtk_signal_connect.С помощью этой функции будет вызвана другая и таким образом реализована функциональность кнопки.Например:

#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);
}

 

Страница отзывов

У каждой заметки есть страница отзывов. На этой странице вы можете оставить свой комментарий или просмотреть комментарии других читателей.
 talkback page 

<--, перейти к начальной странице выпуска

Webpages maintained by the LinuxFocus Editor team
© Özcan Güngör, FDL
LinuxFocus.org
Translation information:
tr --> -- : Özcan Güngör <ozcangungor(at)netscape.net>
tr --> en: ÖzcanGüngör <ozcangungor(at)netscape.net>
en --> ru: Юрий Дешко <deshko_deshko(at)mail.ru>

2003-08-06, generated by lfparser version 2.42