LINUX.ORG.RU

GTK+ и работа с цветами


0

0

Кто-нибудь может ткнуть в какой-нибудь внятные экзампл работы с цветовыми контекстами? В официальном туториале тема опущена, библиотека конечно хорошо документирована на языке С, но ковыряться только начал, разгрести тяжеловато... Т.е. хотя бы чтобы просто нарисовать точку сначала одним цветом, а потом другим. Ну или вообще какой-нибудь ресурс с хорошим набором примеров.


Ответ на: комментарий от anonymous

Ну не суть грубо говоря. Можно повыше, можно пониже. Мне все равно, лишь бы цвет изменился %) Вот например gtk_widget_modify_bg() для скроллируемого текстового поля не хочет работать блин и все 8=(

ach
() автор топика
Ответ на: комментарий от ach

Что значит, что не хочет работать? Это смотря что написать.

Вот например, если запустить программу gtk-demo и посмотреть исходный код примера 'Color Selector', то можно обнаружить, как меняется цвет фона как раз с помощью gtk_widget_modify_bg.

#include <gtk/gtk.h>

static GtkWidget *window = NULL;
static GtkWidget *da;
static GdkColor color;
static GtkWidget *frame;

/* Expose callback for the drawing area
 */
static gboolean
expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
  if (widget->window)
    {
      GtkStyle *style;

      style = gtk_widget_get_style (widget);

      gdk_draw_rectangle (widget->window,
                          style->bg_gc[GTK_STATE_NORMAL],
                          TRUE,
                          event->area.x, event->area.y,
                          event->area.width, event->area.height);
    }

  return TRUE;
}

static void
change_color_callback (GtkWidget *button,
		       gpointer	  data)
{
  GtkWidget *dialog;
  GtkColorSelection *colorsel;
  gint response;
  
  dialog = gtk_color_selection_dialog_new ("Changing color");

  gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (window));
  
  colorsel = GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (dialog)->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);
  
  response = gtk_dialog_run (GTK_DIALOG (dialog));

  if (response == GTK_RESPONSE_OK)
    {
      gtk_color_selection_get_current_color (colorsel,
					     &color);
      
      gtk_widget_modify_bg (da, GTK_STATE_NORMAL, &color);
    }
  
  gtk_widget_destroy (dialog);
}

GtkWidget *
do_colorsel (void)
{
  GtkWidget *vbox;
  GtkWidget *button;
  GtkWidget *alignment;
  
  if (!window)
    {
      color.red = 0;
      color.blue = 65535;
      color.green = 0;
      
      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_window_set_title (GTK_WINDOW (window), "Color Selection");

      g_signal_connect (window, "destroy",
			G_CALLBACK (gtk_widget_destroyed), &window);

      gtk_container_set_border_width (GTK_CONTAINER (window), 8);

      vbox = gtk_vbox_new (FALSE, 8);
      gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
      gtk_container_add (GTK_CONTAINER (window), vbox);

      /*
       * Create the color swatch area
       */
      
      
      frame = gtk_frame_new (NULL);
      gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
      gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);

      da = gtk_drawing_area_new ();

      g_signal_connect (da, "expose_event",
			G_CALLBACK (expose_event_callback), NULL);

      /* set a minimum size */
      gtk_widget_set_size_request (da, 200, 200);
      /* set the color */
      gtk_widget_modify_bg (da, GTK_STATE_NORMAL, &color);
      
      gtk_container_add (GTK_CONTAINER (frame), da);

      alignment = gtk_alignment_new (1.0, 0.5, 0.0, 0.0);
      
      button = gtk_button_new_with_mnemonic ("_Change the above color");
      gtk_container_add (GTK_CONTAINER (alignment), button);
      
      gtk_box_pack_start (GTK_BOX (vbox), alignment, FALSE, FALSE, 0);
      
      g_signal_connect (button, "clicked",
			G_CALLBACK (change_color_callback), NULL);
    }

  if (!GTK_WIDGET_VISIBLE (window))
    {
      gtk_widget_show_all (window);
    }
  else
    {
      gtk_widget_destroy (window);
      window = NULL;
    }

  return window;
}

anonymous
()
Ответ на: комментарий от anonymous

Я смотрел этот пример, все примеры смотрел. Да, с drawing_area все работает. А вот для текста со скроллом (объект из примера с письмами от космического корабля 8-)) работать не хочет. Причем не получилось что-то менять ни для результирующего объекта, ни для тех, которые в него инкапсулированы. Ориентируюсь в этом еще не очень сильно, но копался долго прежде чем задать вопрос.

ach
() автор топика
Ответ на: комментарий от ach

Еще раз вопрос, что конкретно нужно сделать? Что не работает - нужен пример.

Например, текстовое окно и скроллбары - это _разные_ окна, поэтому цвета в них нужно менять отдельно друг от друга.

Что нужно менять - цвет фона? цвет текста? Для текста это делается с помощью тэгов, навешиваемых на текст.

anonymous
()
Ответ на: комментарий от anonymous

Привет!

Нужно поменять цвет для создаваемого текстового поля. Фон черный, буквы белые. Скроллы тоже хорошо было бы зачернить.
В общем, основной фон окна - черный...

/////////////////////////////////////////////////////////////////////

GtkWidget *create_text( void )
{
   GtkWidget *scrolled_window;
   GtkWidget *view;

   view = gtk_text_view_new ();
   gtk_text_view_set_editable(view, FALSE);
   gtk_text_view_set_wrap_mode(view, GTK_WRAP_WORD);
   buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
   
   
   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
		   	           GTK_POLICY_AUTOMATIC,
				   GTK_POLICY_AUTOMATIC);

   gtk_container_add (GTK_CONTAINER (scrolled_window), view);
   
   gtk_widget_show_all (scrolled_window);

   return scrolled_window;
}

/////////////////////////////////////////////////////////////////////

int main( int   argc, 
          char *argv[] )
{

..................
..................
..................
    text = create_text ();
    gtk_box_pack_end (GTK_BOX (hbox), text, TRUE, TRUE, 0);
    gtk_widget_set_size_request (GTK_WIDGET (text), 200, WIN_HEIGHT);
    gtk_widget_show (text);

..................
..................
..................

    return 0;
}

ach
() автор топика
Ответ на: комментарий от ach

Ну вот я написал маленький примерчик. Но вообще, конечно, хочешь не
хочешь, а придется самому разбираться. 

#include <gtk/gtk.h>


/*
    This is simple exampe of the main code - style modification

    From gtk sources one can see that gtk use base color and text color to
    draw GtkTextView
    
*/

#if 0
GdkColor black;
GdkColor white;

gdk_color_parse ("black", &black);
gdk_color_parse ("white", &white);

gtk_widget_modify_base (GTK_WIDGET (view), GTK_STATE_NORMAL, &black);
gtk_widget_modify_text (GTK_WIDGET (view), GTK_STATE_NORMAL, &white);

#endif


/* Here is more advanced example, this is optimal way to change colors */


static const char *style = "style \"clean-black\" { "
  "	fg[NORMAL]        = \"#CACAC6\""
  "	fg[ACTIVE]        = \"#CACAC6\""
  "	fg[INSENSITIVE]   = \"#000000\""
  "	fg[PRELIGHT]      = \"#E2E2E2\""
  "	fg[SELECTED]      = \"#E2E2E2\""
  "	bg[ACTIVE]        = \"#484949\""
  "	bg[NORMAL]        = \"#5A5C5F\""
  "	bg[INSENSITIVE]   = \"#505050\""
  "	bg[PRELIGHT]      = \"#6A6C6F\""
  "	bg[SELECTED]      = \"#424446\""
  "	base[NORMAL]      = \"#000000\""
  "	base[ACTIVE]      = \"#5A5C5F\""
  "	base[INSENSITIVE] = \"#5A5C5F\""
  "	base[PRELIGHT]    = \"#646668\""
  "	base[SELECTED]    = \"#5A5C5F\""
  "	text[NORMAL]      = \"#E2E2E2\""
  "	text[ACTIVE]      = \"#000000\""
  "	text[PRELIGHT]    = \"#000000\""
  "	text[SELECTED]    = \"#E0D6AD\""
  "	text[INSENSITIVE] = \"#777777\""
  "  engine \"thinice\" { }\n"
  "}\n" "widget \"*.black-widget*\" style \"clean-black\"\n";


GtkWidget *
create_text (void)
{
  GtkWidget *scrolled_window;
  GtkWidget *view;
  GtkWidget *event_box;

  /*
     Note that event_box is required because ScrolledWindow has no background 
     itself, so it need to be placed in some widget with background, for
     example, GtkEventBox. You can read about this in gtk FAQ. 
   */

  GtkTextBuffer *buffer;
  GtkTextIter iter;
  gint i;

  view = gtk_text_view_new ();
  event_box = gtk_event_box_new ();
  scrolled_window = gtk_scrolled_window_new (NULL, NULL);

  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));

  for (i = 0; i < 100; i++)
    {
      gtk_text_buffer_get_end_iter (buffer, &iter);
      gtk_text_buffer_insert (buffer, &iter, "Hello World Hello World\n", -1);
    }

  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
                                  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);

  gtk_container_add (GTK_CONTAINER (scrolled_window), view);
  gtk_container_add (GTK_CONTAINER (event_box), scrolled_window);

  return event_box;
}


int
main (int argc, char *argv[])
{

  GtkWidget *window;
  GtkWidget *text;
  GtkWidget *vbox;
  GtkWidget *button;

  gtk_init (&argc, &argv);

  /* Parse style string */
  gtk_rc_parse_string (style);

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  text = create_text ();
  vbox = gtk_vbox_new (0, FALSE);
  button = gtk_button_new_with_label ("This is simple button");

  /* Now the style modification */
  gtk_widget_set_name (GTK_WIDGET (text), "black-widget");

  gtk_widget_set_size_request (GTK_WIDGET (text), 100, 100);
  gtk_container_add (GTK_CONTAINER (vbox), text);
  gtk_container_add (GTK_CONTAINER (vbox), button);
  gtk_container_add (GTK_CONTAINER (window), vbox);
  gtk_widget_show_all (window);


  gtk_main ();
  return 0;

}

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.