GtkWindow更改时更改GtkButton颜色 [英] Changing GtkButton color when GtkWindow is changed

查看:158
本文介绍了GtkWindow更改时更改GtkButton颜色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试一个简单的示例Gtk程序,并使用GtkTable来对齐我的小部件。



我的布局应该是:

窗口背景是黑色的。按钮应该是白色的,而按钮上的文本应该是黑色的。所有标签都应该是白色的,以便它们可以在黑色窗口背景中看到。



考虑到这一点。这是我迄今为止所做的。



代码:

  #include< gtk / gtk.h> 
#include< glib.h>
#include< stdlib.h> / * for atoi()和exit()* /
#include / *标准输入和输出* /


typedef struct cmd_widgets {
GtkWidget * button1;
GtkWidget *组合;
GtkWidget * label;

} my_cmd_widgets;

static gboolean close_application(GtkWidget * widget,GdkEvent * event,gpointer data)
{
gtk_main_quit();
返回FALSE;
}

static void UpdateChoice(GtkWidget * widget,gpointer data)
{
my_cmd_widgets * widgrp;
widgrp =(my_cmd_widgets *)data;
gchar * text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(widgrp-> combo));
GString * val = g_string_new(您已选择:);
g_string_append(val,text);
gtk_label_set_text(GTK_LABEL(widgrp-> label),val-> str);
g_free(text);


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

GtkWidget * window;
GtkWidget *表;

GtkWidget * label1;
GtkWidget * label2;
GtkStyle *风格;

GtkWidget * align;

my_cmd_widgets grp_widgets;
GtkWidget *图片;

gtk_init(& argc,& argv);
gtk_rc_parse(fonts.rc);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
gtk_window_set_title(GTK_WINDOW(窗口),Tour App);
gtk_container_set_border_width(GTK_CONTAINER(window),10);

table = gtk_table_new(7,1,FALSE);
gtk_container_add(GTK_CONTAINER(window),table);


label1 = gtk_label_new(我们的旅游套餐优惠);
align = gtk_alignment_new(0.0,0.5,0.0,0.0);
gtk_container_add(GTK_CONTAINER(align),label1);
gtk_table_attach(GTK_TABLE(table),align,0,1,1,2,GTK_FILL,GTK_FILL,0,10);


label2 = gtk_label_new(Select City:);
align = gtk_alignment_new(0.0,0.5,0.0,0.0);
gtk_container_add(GTK_CONTAINER(align),label2);
gtk_table_attach(GTK_TABLE(table),align,0,1,2,3,GTK_FILL,GTK_FILL,0,0);
gtk_widget_show(align);
grp_widgets.combo = gtk_combo_box_new_text();
gtk_combo_box_append_text(GTK_COMBO_BOX(grp_widgets.combo),Paris);
gtk_combo_box_append_text(GTK_COMBO_BOX(grp_widgets.combo),London);
gtk_combo_box_append_text(GTK_COMBO_BOX(grp_widgets.combo),Tokyo);
gtk_combo_box_append_text(GTK_COMBO_BOX(grp_widgets.combo),New York);

/ *创建一个新的按钮1。 * /

grp_widgets.button1 = gtk_button_new_with_label(See Itineine);

grp_widgets.label = gtk_label_new();
align = gtk_alignment_new(0.0,0.5,0.0,0.0);
gtk_container_add(GTK_CONTAINER(align),grp_widgets.label);
gtk_table_attach(GTK_TABLE(table),align,0,1,5,6,GTK_FILL,GTK_FILL,0,0);
gtk_widget_show(align);


image = gtk_image_new();
gtk_image_set_from_file(GTK_IMAGE(image),Images / olympics_logo.gif); (GTK_TABLE(table),image,0,1,0,1,
GTK_FILL | GTK_SHRINK,GTK_FILL | GTK_SHRINK,0,0);

//列1
gtk_table_attach
gtk_table_attach(GTK_TABLE(table),grp_widgets.combo,0,1,3,4,
GTK_FILL | GTK_SHRINK,GTK_FILL | GTK_SHRINK,0,15);
gtk_table_attach(GTK_TABLE(table),grp_widgets.button1,0,1,4,5,
GTK_FILL | GTK_SHRINK,GTK_FILL | GTK_SHRINK,5,15);



g_signal_connect(window,destroy,G_CALLBACK(gtk_main_quit),NULL);
g_signal_connect(window,delete-event,G_CALLBACK(close_application),NULL);
g_signal_connect_swapped(G_OBJECT(window),destroy,G_CALLBACK(gtk_main_quit),G_OBJECT(window));
g_signal_connect(G_OBJECT(grp_widgets.button1),clicked,G_CALLBACK(UpdateChoice),(gpointer)& grp_widgets);


gtk_widget_show(table);

gtk_widget_show_all(window);

gtk_main();

返回0;
}

这是带有TABLE和WINDOW属性的rc文件:

  stylewindow
{
font_name =fixed 12
bg [NORMAL] = {0.0 ,0.0,0.0}
}
styletable
{
bg [NORMAL] = {1.0,1.0,1.0}
fg [NORMAL] = {1.0 ,1.0,1.0}
}

stylecontainer{
font_name =bold 12
xthickness = 10
ythickness = 10
bg [正常] = {1.0,1.0,1.0}
fg [正常] = {1.0,1.0,1.0}
}

样式按钮{
font_name =bold 12
xthickness = 10
ythickness = 10
#bg [NORMAL] = {0.0,0.0,0.0}
fg [NORMAL] = {0.0, 0.0,0.0}
}

#widget_class* GtkButton *stylebutton
widget_classGtkWindowstylewindow
widget_class* GtkTable *样式表

上述代码中的问题是,B utton的文本(标签)在我将表格或窗口样式中的fg更改为白色时保持白色。即使在将fg更改为黑色(如下所示)后,我按钮上的标签文本仍为白色。另外,如何在窗口上展开图像和所有窗口小部件,以便每次调整窗口大小时,所有窗口小部件都将调整大小以适应屏幕?

解决方案



所有标签都应该是白色的,以便它们可以在黑色窗口背景中看到。 p>根据我在网上找到的内容:


GtkLabel Widget是少数GTK +小部件之一,它们不会创建它们的
自己的窗口来渲染自己。此菜单为了设置GtkLabel Widget的
bg颜色,您需要更改其
父项的bg颜色。


所以在这种情况下,举一个简单的例子,我只在GtkEventBox中打包了一个标签。

代码片段:


  GtkWidget * eventBox; 
...
eventBox = gtk_event_box_new();

label1 = gtk_label_new(我们的旅游套餐优惠);
gtk_container_add(GTK_CONTAINER(eventBox),label1);
align = gtk_alignment_new(0.0,0.5,0.0,0.0);
gtk_container_add(GTK_CONTAINER(align),eventBox);
...

简化的rc文件:

  stylewindow
{
font_name =fixed 12
bg [NORMAL] = {0.0,0.0,0.0}


stylelabel{
bg [NORMAL] = {1.0,1.0,1.0}
}

widget_classGtkWindow样式窗口
widget_class* GtkAlignment * GtkEventBox *stylelabel

和结果:


I am trying a simple sample Gtk program and using GtkTable to align my widgets.

My layout should be:

Window background is black. The buttons should be white while the text on the buttons should be black. All labels should be white so they can be seen against the black window background.

With this in mind. Here is what I have done so far.

Code:

#include <gtk/gtk.h>
#include <glib.h>
#include <stdlib.h>     /* for atoi() and exit() */
#include <stdio.h>      /* standard in and output*/


typedef struct cmd_widgets{
    GtkWidget *button1;
    GtkWidget *combo;
    GtkWidget *label;

}my_cmd_widgets;

static gboolean close_application( GtkWidget *widget, GdkEvent  *event, gpointer   data )
{
  gtk_main_quit ();
  return FALSE;
}

static void UpdateChoice( GtkWidget *widget, gpointer data)
{
    my_cmd_widgets *widgrp;
    widgrp = (my_cmd_widgets *)data;
    gchar *text =  gtk_combo_box_get_active_text(GTK_COMBO_BOX(widgrp->combo));
    GString *val = g_string_new("You have chosen :  ");
    g_string_append(val, text);
    gtk_label_set_text(GTK_LABEL(widgrp->label), val->str);
    g_free(text);
}


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

  GtkWidget *window;
  GtkWidget *table;

  GtkWidget *label1;
  GtkWidget *label2;
  GtkStyle  *style;

  GtkWidget *align;

  my_cmd_widgets grp_widgets;
  GtkWidget *image;

  gtk_init(&argc, &argv);
  gtk_rc_parse("fonts.rc");

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_title(GTK_WINDOW(window), "Tour App");
  gtk_container_set_border_width(GTK_CONTAINER(window), 10);

  table = gtk_table_new(7, 1, FALSE);
  gtk_container_add(GTK_CONTAINER(window), table);


  label1 = gtk_label_new("Our Tour Package Offers");
  align = gtk_alignment_new(0.0, 0.5, 0.0, 0.0);
  gtk_container_add(GTK_CONTAINER(align), label1);
  gtk_table_attach(GTK_TABLE(table), align, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 10);


  label2 = gtk_label_new("Select City: ");
  align = gtk_alignment_new(0.0, 0.5, 0.0, 0.0);
  gtk_container_add(GTK_CONTAINER(align), label2);
  gtk_table_attach(GTK_TABLE(table), align,0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0);
  gtk_widget_show(align);
  grp_widgets.combo = gtk_combo_box_new_text();
  gtk_combo_box_append_text(GTK_COMBO_BOX(grp_widgets.combo), "Paris");
  gtk_combo_box_append_text(GTK_COMBO_BOX(grp_widgets.combo), "London");
  gtk_combo_box_append_text(GTK_COMBO_BOX(grp_widgets.combo), "Tokyo");
  gtk_combo_box_append_text(GTK_COMBO_BOX(grp_widgets.combo), "New York");

  /* Creates a new button1. */

   grp_widgets.button1 = gtk_button_new_with_label ("See Itinerary");

   grp_widgets.label = gtk_label_new("");
   align = gtk_alignment_new(0.0, 0.5, 0.0, 0.0);
   gtk_container_add(GTK_CONTAINER(align), grp_widgets.label);
   gtk_table_attach(GTK_TABLE(table), align,0, 1, 5, 6, GTK_FILL, GTK_FILL, 0, 0);
   gtk_widget_show(align);


  image = gtk_image_new ();
  gtk_image_set_from_file (GTK_IMAGE(image), "Images/olympics_logo.gif");

  //column 1
  gtk_table_attach(GTK_TABLE(table), image, 0, 1, 0, 1,
      GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 0, 0);
  gtk_table_attach(GTK_TABLE(table), grp_widgets.combo, 0, 1, 3, 4,
      GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 0, 15);
  gtk_table_attach(GTK_TABLE(table), grp_widgets.button1, 0, 1, 4, 5,
      GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 5, 15);



  g_signal_connect(window, "destroy",G_CALLBACK(gtk_main_quit), NULL);
  g_signal_connect (window,"delete-event",G_CALLBACK (close_application), NULL);
  g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), G_OBJECT(window));
  g_signal_connect (G_OBJECT(grp_widgets.button1), "clicked", G_CALLBACK (UpdateChoice), (gpointer)&grp_widgets);


  gtk_widget_show(table);

  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}

Here is the rc file with properties for TABLE AND WINDOW:

style "window"
{
  font_name = "fixed 12"
  bg[NORMAL] = { 0.0, 0.0, 0.0 }
}
style "table"
{
  bg[NORMAL] = { 1.0, 1.0, 1.0 }
  fg[NORMAL] = { 1.0, 1.0, 1.0 }
}

style "container" {
        font_name = "bold 12"
        xthickness = 10
        ythickness = 10
        bg[NORMAL] = { 1.0, 1.0, 1.0 }
        fg[NORMAL] = { 1.0, 1.0,1.0 }          
}

style "button" {
        font_name = "bold 12"
        xthickness = 10
        ythickness = 10 
        #bg[NORMAL] = { 0.0, 0.0, 0.0 }   
        fg[NORMAL] = { 0.0, 0.0, 0.0 }  
}

#widget_class "*GtkButton*" style "button"
widget_class "GtkWindow" style "window"
widget_class "*GtkTable*" style "table"

The problem in the above code is, the Button's text(label) remains white when I change the fg to white on either table or window styles. Even after changing the fg to black(as below), the label text on my button remains white. Also how can I stretch the image and all the widgets on the window so that whenever I resize my window all widgets are resized to fit screen as well?

解决方案

All labels should be white so they can be seen against the black window background.

According to what I've found online:

GtkLabel Widget is one of a few GTK+ widgets that don't create their own window to render themselves into. This menas in order to set the bg color for a GtkLabel Widget,you need to change the bg color of its parent.

So in that case, for a simple example, I packed only one of the labels in a GtkEventBox.
Code Piece:

GtkWidget *eventBox;
...
eventBox = gtk_event_box_new();

label1 = gtk_label_new("Our Tour Package Offers");
gtk_container_add(GTK_CONTAINER(eventBox), label1);
align = gtk_alignment_new(0.0, 0.5, 0.0, 0.0);
gtk_container_add(GTK_CONTAINER(align), eventBox);
...

simplified rc file:

style "window"
{
  font_name = "fixed 12"
  bg[NORMAL] = { 0.0, 0.0, 0.0 }
}

style "label"{
  bg[NORMAL] = { 1.0, 1.0, 1.0 }
}

widget_class "GtkWindow" style "window"
widget_class "*GtkAlignment*GtkEventBox*" style "label"

and result:

这篇关于GtkWindow更改时更改GtkButton颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆