Чтобы приступить к процессу рисования в окне, желательно создать приложение-шаблон, имеющее область для рисования и кнопку, по нажатию на которую будет выполняться алгоритм прорисовки изображения.
Виджет, определяющий область рисования, называется drawing_area и создается функцией gtk_drawing_area_new()
GtkWidget* gtk_drawing_area_new(void);
Размер виджета по умолчанию может быть определён вызовом:
void gtk_drawing_area_size (GtkDrawingArea *darea, gint width, gint height);
Этот размер может быть изменён вызовом функции gtk_widget_set_size_request(), а размер определённый с помощью этой функции может быть изменен пользователем с помощью простого увеличения или уменьшения окна содержащего область рисования.
Второй виджет, который будем использовать в приложении, - это кнопка. Создать
его можно с помощью функции gtk_button_new_with_label();
GtkWidget* gtk_button_new_with_label (const gchar *label);
За расположение элементов на форме отвечает специальный виджет - упаковочный контейнер. Существует два вида упаковочных невидимых контейнеров для размещения виджетов, горизонтальный и вертикальный. Когда используется горизонтальный контейнер, объекты внутри него могут располагаться с права налево, или наоборот в зависимости от использованных вызовов. В вертикальном контейнере виджеты располагаются сверху вниз или снизу вверх. Создать его можно функцией
GtkWidget* gtk_box_new (GtkOrientation orientation, gint spacing);
За порядок отвечают функции gtk_box_pack_start() и gtk_box_pack_end(). Функция gtk_box_pack_start() размещает объекты сверху вниз в вертикальных контейнерах и слева направо в горизонтальных, а функция gtk_box_pack_end() соответственно снизу вверх и справа налево.
Таким образом полный код создания приложения-шаблона будет выглядеть так:
#include <gtk/gtk.h> // подключаем GTK+ /* Функция, вызываемая на событие нажатия кнопки */ void button_click (GtkButton *button, gpointer data) { /* Действия, выполняемые на нажатие кнопки */ } /* Основная функция с которой стартует выполнение программы */ int main( int argc, char *argv[]) { /* запустить GTK+ */ gtk_init(&argc, &argv); /* создать новый виджет - окно и установить свойства*/ GtkWidget *window; window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 800, 500); gtk_window_set_title(GTK_WINDOW(window), "Template"); gtk_container_set_border_width (GTK_CONTAINER (window), 10); /* Событие, которое отрабатывает на закрытие окна */ g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); /* создать виджет - вертикального расположения элементов */ GtkWidget *vbox; vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1); gtk_container_add(GTK_CONTAINER (window), vbox); /* создать виджет - область для рисования */ GtkWidget *drawing_area; drawing_area = gtk_drawing_area_new(); /* разместить область в верхней части окна*/ gtk_box_pack_start (GTK_BOX(vbox), drawing_area, TRUE, TRUE, 5); /* создать виджет - кнопка */ GtkWidget *button; button = gtk_button_new_with_label("Draw"); gtk_container_set_border_width (GTK_CONTAINER (button), 10); /* разместить кнопку в нижней части окна*/ gtk_box_pack_end (GTK_BOX(vbox), button, FALSE, FALSE, 10); /* Событие, которое отрабатывает на нажатие кнопки */ g_signal_connect(GTK_BUTTON(button), "clicked", G_CALLBACK(button_click), NULL); /* отобразить окно и все его виджеты */ gtk_widget_show_all(window); /* передаём управление GTK+ */ gtk_main(); return 0; }