GTK+ Reference Manual |
||||
---|---|---|---|---|
Top | Description | Object Hierarchy | Implemented Interfaces |
GtkDrawingAreaGtkDrawingArea Виджет для настраиваемых элементов пользовательского интерфейса |
#include <gtk/gtk.h>
GtkDrawingArea;
GtkWidget* gtk_drawing_area_new (void);
void gtk_drawing_area_size (GtkDrawingArea *darea,
gint width,
gint height);
GObject
+----GInitiallyUnowned
+----GtkObject
+----GtkWidget
+----GtkDrawingArea
+----GtkCurve
GtkDrawingArea реализует AtkImplementorIface.
GtkDrawingArea
используется для создания настраиваемых
элементов пользовательского интерфейса.
Это по существу пустой виджет; вы можете
отобразить widget->window
. После
создания области для рисования, приложение
может подключать:
Сигналы нажатия кнопок мышью, для
реакции на действия пользователя.
(Используйте gtk_widget_add_events()
для включения событий на которые вы
хотите реагировать.)
Сигнал "realize" для любых необходимых действий, когда виджет проиллюстрирован на определённом экране. (Создаются ресурсы GDK в ответ на этот сигнал.)
Сигнал "configure_event" для получения конкретных действий когда виджет изменяет размер.
Сигнал "expose_event" для обработки перерисовки содержимого виджета.
Следующая часть кода демонстрирует использование области рисования для отображения круга в обычном цвете символов виджета. Помните, GDK автоматически очищает просматриваемую область до цвета фона перед ответом на событие экспонирования, а рисунок не явно прикреплён к области просмотра.
Пример 1. Простое использование GtkDrawingArea.
gboolean
expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
gdk_draw_arc (widget->window,
widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
TRUE,
0, 0, widget->allocation.width, widget->allocation.height,
0, 64 * 360);
return TRUE;
}
[...]
GtkWidget *drawing_area = gtk_drawing_area_new ();
gtk_widget_set_size_request (drawing_area, 100, 100);
g_signal_connect (G_OBJECT (drawing_area), "expose_event",
G_CALLBACK (expose_event_callback), NULL);
Событие экспонирования обычно происходит,
когда область рисования в первый раз
появляется на экране, или когда она
закрыта другим окном а затем снова
открывается (exposed). Вы так же можете
принудительно добавить событие
экспонирования к "повреждённому
участку" области рисования окна; для
этого используйте gtk_widget_queue_draw_area()
и gdk_window_invalidate_rect()
являющиеся эквивалентными. Так вы
получите событие экспонирования для
несуществующего участка.
Доступные подпрограммы для рисования
доступны на страницах GDK
Drawing Primitives. Смотрите также
gdk_pixbuf_render_to_drawable()
для рисования GdkPixbuf.
Для реакции на события мышки в области
рисования, вы должны включить их с
помощью gtk_widget_add_events()
.
Для реакции на события клавиатуры, вы
должны установить флаг GTK_CAN_FOCUS
в области рисования и вероятно должны
нарисовать некоторую индикацию видимую
пользователем которая находится в
фокусе области рисования. Используйте
GTK_HAS_FOCUS()
макрос в вашем обработчике экспонирующего
события для решения, изображать ли
указатель фокуса. Смотрите gtk_paint_focus()
как один из способов для изображения
фокуса.
typedef struct _GtkDrawingArea GtkDrawingArea;Структура GtkDrawingArea содержит только закрытые данные, доступ к которым разрешён только функциям описанным ниже.
gtk_drawing_area_new ()
GtkWidget* gtk_drawing_area_new (void);Создаёт новую область рисования.
Возвращает : |
новый GtkDrawingArea |
void gtk_drawing_area_size (GtkDrawingArea *darea,
gint width,
gint height);
gtk_drawing_area_size
устарела и не должна использоваться во
вновь создаваемом коде.
(Вместо неё используйте
gtk_widget_set_size_request()
.)
Устанавливает размер области рисования
в ответ на сигнал "size_request". Область
рисования в действительности может
занимать больший размер чем распределено,
это зависит от того как она упакована
в контейнер.
|
|
|
Запрашиваемая ширина. |
|
Запрашиваемая высота. |
Иногда GtkImage полезен
как альтернатива области рисования. Вы
можете поместить GdkPixmap
в GtkImage и рисовать в
GdkPixmap,
вызывая gtk_widget_queue_draw()
для GtkImage когда вам нужно
обновить экран.