The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Каталог документации / Раздел "Программирование, языки" / Оглавление документа

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






Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру