tr to en ÖzcanGüngör
en to ru Юрий Дешко
В этой серии статей мы узнаем, как создавать программы ГПИ с помощью GTK.Я не знаю, насколько затянется эта серия.Чтобы понять эти статьи вам необходимы следующие знания о языке программирования C:
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-путях).Для компиляции 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 библиотеке существуют два пути создания кнопок:
Первая функция создает кнопку без метки (на ней ничего не написано ).Второй создает кнопку с меткой(на ней написана строка 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); }