Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Извините за тупой вопрос. У меня при сборке Вашего примера выходит ошибка: "undefined reference to gluLookAt". Не могу найти в какой библиотеке находится эта функция. У меня задано: -lGL -lglut ... Искал в /usr/lib таким образом: nm lib*so* | grep...
Здравствуйте. Спасибо за проект. У меня вопрос, по какой причине определение принадлежности точки многоугольнику работает некорректно, если координаты из больших чисел состоят, например: int[] vertex = new int[] {...
Сейчас проверила нашла причину не запускания // Создание контекста воспроизведения OpenGL и привязка его к панели на форме OpenGLControl1:=TOpenGLControl.Create(Self); with OpenGLControl1 do begin Name:='OpenGLControl1'; //вот тут...
Ну..кажется что то пошло не так http://pp.usera...

Счетчики и рейтинг

Рейтинг@Mail.ru
Среда программирования: 
Code Blocks + MinGW

Чтобы приступить к процессу рисования в окне, желательно создать приложение-шаблон, имеющее область для рисования и кнопку, по нажатию на которую будет выполняться алгоритм прорисовки изображения.

Виджет, определяющий область рисования, называется 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;
}