выбор цвета
виджет
выбора цвета является достаточно
сложным и позволяет выбирать цвет
манипулируя треугольником в цветовой
схеме 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;
}
|
|