118 lines
3.8 KiB
C++
118 lines
3.8 KiB
C++
/* Example1.cpp */
|
||
#include <cairo.h>
|
||
#include <gtk/gtk.h>
|
||
|
||
#define UI_FILE "mainForm.glade"
|
||
|
||
// описание виджетов
|
||
GtkBuilder *builder;
|
||
GtkWidget *topWindow;
|
||
GtkRadioButton *rbutRectangle, *rbutEllipse, *rbutTriangle;
|
||
GtkDrawingArea *drawingarea;
|
||
|
||
// описание обработчиков сигналов
|
||
extern "C" void topWindow_destroy_cb (GtkWidget *object, gpointer user_data);
|
||
extern "C" gboolean drawingarea_draw_event_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data);
|
||
extern "C" void rbutton_toggled_cb (GtkWidget *object);
|
||
|
||
int main( int argc, char **argv )
|
||
{
|
||
GError *error = NULL;
|
||
|
||
// инициализация GTK+
|
||
gtk_init( &argc, &argv );
|
||
|
||
// создание нового GtkBuilder объекта
|
||
builder = gtk_builder_new();
|
||
|
||
// загрузка пользовательского интерфеса из файла, который мы создали в Glade
|
||
if( ! gtk_builder_add_from_file( builder, UI_FILE, &error ) )
|
||
{
|
||
g_warning( "%s", error->message );
|
||
g_free( error );
|
||
return( 1 );
|
||
}
|
||
|
||
// связывание наших виджетов с описаннимем виджетов в GladeXML
|
||
topWindow = GTK_WIDGET(gtk_builder_get_object(builder, "topWindow"));
|
||
rbutRectangle = GTK_RADIO_BUTTON(gtk_builder_get_object(builder, "rbutRectangle"));
|
||
rbutEllipse = GTK_RADIO_BUTTON(gtk_builder_get_object(builder, "rbutEllipse"));
|
||
rbutTriangle = GTK_RADIO_BUTTON(gtk_builder_get_object(builder, "rbutTriangle"));
|
||
drawingarea = GTK_DRAWING_AREA(gtk_builder_get_object(builder, "drawingarea"));
|
||
|
||
// связываем сигналы с объектами графического интерфейса
|
||
gtk_builder_connect_signals (builder, NULL);
|
||
|
||
// освобождение памяти
|
||
g_object_unref( G_OBJECT( builder ) );
|
||
|
||
// Показываем форму и виджеты на ней
|
||
gtk_widget_show( topWindow );
|
||
|
||
// запуск главного цикла приложения
|
||
gtk_main();
|
||
|
||
return( 0 );
|
||
}
|
||
|
||
// закрытие приложения
|
||
void topWindow_destroy_cb (GtkWidget *object, gpointer user_data)
|
||
{
|
||
// завершаем главный цикл приложения
|
||
gtk_main_quit();
|
||
}
|
||
|
||
// перерисовка холста
|
||
gboolean drawingarea_draw_event_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data)
|
||
{
|
||
cairo_t *cr;
|
||
|
||
cr = gdk_cairo_create (gtk_widget_get_window (widget));
|
||
cairo_set_line_width (cr, 7);
|
||
cairo_set_source_rgb (cr, 0, 0, 0);
|
||
|
||
// переключатель установлен на прямоугольник
|
||
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rbutRectangle)))
|
||
{
|
||
// рисуем прямоугольник
|
||
cairo_rectangle (cr, 20, 20, 200, 100);
|
||
cairo_stroke_preserve(cr);
|
||
cairo_set_source_rgb(cr, 0, 0.8, 0);
|
||
}
|
||
|
||
// переключатель установлен на эллипс
|
||
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rbutEllipse)))
|
||
{
|
||
// рисуем эллипс
|
||
cairo_arc(cr, 150, 100, 90, 0, 2 * 3.14);
|
||
cairo_stroke_preserve(cr);
|
||
cairo_set_source_rgb(cr, 0.8, 0, 0);
|
||
}
|
||
|
||
// переключатель установлен на треугольник
|
||
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rbutTriangle)))
|
||
{
|
||
// рисуем треугольник
|
||
cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND);
|
||
cairo_move_to (cr, 40, 40);
|
||
cairo_line_to (cr, 200, 40);
|
||
cairo_line_to (cr, 120, 160);
|
||
cairo_line_to (cr, 40, 40);
|
||
cairo_set_line_join(cr, CAIRO_LINE_JOIN_ROUND);
|
||
cairo_stroke_preserve(cr);
|
||
cairo_set_source_rgb(cr, 0.8, 0, 0.8);
|
||
}
|
||
|
||
cairo_fill(cr);
|
||
|
||
cairo_destroy(cr);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
void rbutton_toggled_cb (GtkWidget *object)
|
||
{
|
||
// перерисовка drawingarea
|
||
gtk_widget_queue_draw (GTK_WIDGET(drawingarea));
|
||
}
|