GTK+ 2.0 Tutorial

<<< Previous

Miscellaneous Widgets

Next >>>


Выбор цвета

Виджет выбора цвета является достаточно сложным и позволяет выбирать цвет манипулируя треугольником в цветовой схеме RGB (Red(красный), Green(зелёный), Blue(синий)) и HSV (Hue(оттенок), Saturation(насыщенность), Value(значение)). Цвет можно выбирать используя простые слайдеры или вращая треугольную область насыщенности и оттенка вокруг цветовой шкалы. Опционально может быть установлена прозрачность.

Виджет выбор цвета создаёт только один сигнал, "color_changed", он производится когда происходит изменение цвета пользователем, или через функцию gtk_color_selection_set_color().

Виджет имеет две особенности: GtkColorSelection и GtkColorSelectionDialog.

GtkWidget *gtk_color_selection_new( void );

Вам не прийдется использовать этот конструктор непосредственно. Это создаёт шаблонный виджет ColorSelection который вы сделаете основным самостоятельно. Виджет  ColorSelection наследует от виджета VBox.

GtkWidget *gtk_color_selection_dialog_new( const gchar *title );

Самый основной конструктор color selection. Это создаёт диалог ColorSelectionDialog. Он состоит из рамки содержащей виджет ColorSelection, HSeparator и HBox с тремя кнопками, "Ok", "Cancel" и "Help". Вы можете получить доступ к этим кнопкам через виджеты "ok_button", "cancel_button" и "help_button" в структуре ColorSelectionDialog, (т,е, GTK_COLOR_SELECTION_DIALOG (colorseldialog)->ok_button)).

void gtk_color_selection_set_has_opacity_control( GtkColorSelection *colorsel, gboolean has_opacity );

Виджет выбор цвета поддерживает регулировку полупрозрачности (известную также как alpha channel), которая отключена по умолчанию. Вызов этой функции со значением аргумента has_opacity установленным в TRUE включает полупрозрачность. Соответственно значение FALSE отключает полупрозрачность.

void gtk_color_selection_set_current_color( GtkColorSelection *colorsel, GdkColor *color ); void gtk_color_selection_set_current_alpha( GtkColorSelection *colorsel, guint16 alpha );

Вы можете установить текущий цвет явно, вызвав gtk_color_selection_set_current_color() с указателем на GdkColor. Установка полупрозрачности (alpha channel) делается с помощью gtk_color_selection_set_current_alpha(). Значение alpha должно быть между 0 (полностью прозрачно) и 65636 (полностью непрозрачно).

void gtk_color_selection_get_current_color( GtkColorSelection *colorsel, GdkColor *color ); void gtk_color_selection_get_current_alpha( GtkColorSelection *colorsel, guint16 *alpha );

Эти функции используются когда вам нужно получить текущее значение цвета при получении сигнала "color_changed".

Вот - простой пример, демонстрирующий использование ColorSelectionDialog.  Программа отображает окно, содержащее область рисунка.  Нажатие на кнопку открывает диалог выбора цвета и изменение цвета в диалоге выбора цвета, изменяет цвет фона самой программы.

#include <glib.h> #include <gdk/gdk.h> #include <gtk/gtk.h> GtkWidget *colorseldlg = NULL; GtkWidget *drawingarea = NULL; GdkColor color; /* Обработчик изменения цвета (Color changed handler) */ void color_changed_cb( GtkWidget *widget, GtkColorSelection *colorsel ) { GdkColor ncolor; gtk_color_selection_get_current_color (colorsel, &ncolor); gtk_widget_modify_bg (drawingarea, GTK_STATE_NORMAL, &ncolor); } /* Обработчик событий полотна (Drawingarea event handler) */ gint area_event( GtkWidget *widget, GdkEvent *event, gpointer client_data ) { gint handled = FALSE; gint response; GtkColorSelection *colorsel; /* Проверка события нажатой кнопки */ if (event->type == GDK_BUTTON_PRESS) { handled = TRUE; /* Создаём диалог выбора цвета */ if (colorseldlg == NULL) colorseldlg = gtk_color_selection_dialog_new ("Select background color"); /* Получаем ColorSelection виджет */ colorsel = GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (colorseldlg)->colorsel); gtk_color_selection_set_previous_color (colorsel, &color); gtk_color_selection_set_current_color (colorsel, &color); gtk_color_selection_set_has_palette (colorsel, TRUE); /* Подключаем сигнал "color_changed", устанавливаем client-data * в виджет colorsel */ g_signal_connect (G_OBJECT (colorsel), "color_changed", G_CALLBACK (color_changed_cb), (gpointer) colorsel); /* Отображаем диалог */ response = gtk_dialog_run (GTK_DIALOG (colorseldlg)); if (response == GTK_RESPONSE_OK) gtk_color_selection_get_current_color (colorsel, &color); else gtk_widget_modify_bg (drawingarea, GTK_STATE_NORMAL, &color); gtk_widget_hide (colorseldlg); } return handled; } /* Выходим из обработчика */ gint destroy_window( GtkWidget *widget, GdkEvent *event, gpointer client_data ) { gtk_main_quit (); return TRUE; } /* Основная функция */ gint main( gint argc, gchar *argv[] ) { GtkWidget *window; /* Инициализируем GTK, удаляем gtk-related commandline мусор */ gtk_init (&argc, &argv); /* Создаём главное окно, устанавливаем заголовок и политику поведения */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "Color selection test"); gtk_window_set_policy (GTK_WINDOW (window), TRUE, TRUE, TRUE); /* Подключаем "delete" и "destroy" события для выхода */ g_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (destroy_window), (gpointer) window); /* Создаём полотно, устанавливаем размер и перехват событий */ drawingarea = gtk_drawing_area_new (); color.red = 0; color.blue = 65535; color.green = 0; gtk_widget_modify_bg (drawingarea, GTK_STATE_NORMAL, &color); gtk_widget_set_size_request (GTK_WIDGET (drawingarea), 200, 200); gtk_widget_set_events (drawingarea, GDK_BUTTON_PRESS_MASK); g_signal_connect (GTK_OBJECT (drawingarea), "event", GTK_SIGNAL_FUNC (area_event), (gpointer) drawingarea); /* Добавляем полотно в окно, отображаем оба */ gtk_container_add (GTK_CONTAINER (window), drawingarea); gtk_widget_show (drawingarea); gtk_widget_show (window); /* Входим в gtk main цикл (никогда не возвращаемся) */ gtk_main (); /* Удовлетворите сварливые компиляторы :)*/ return 0; }

<<< Previous

Home

Next >>>

Calendar

Up

File Selections