2012-05-23 71 views
1

我正在嘗試一個簡單的示例Gtk程序並使用GtkTable來對齊我的小部件。更改GtkWindow時更改GtkButton顏色

我的佈局應該是:

窗口背景是黑色的。按鈕應該是白色的,而按鈕上的文本應該是黑色的。所有標籤都應該是白色的,以便可以在黑色窗口背景中看到它們。

考慮到這一點。這是我迄今爲止所做的。

代碼:

#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; 
} 

這裏是表和窗口屬性的RC文件:

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" 

在上面的代碼的問題是,按鈕的文本(標籤)仍然是白當我將表格或窗口樣式中的fg更改爲白色。即使在將fg更改爲黑色(如下所示)後,我按鈕上的標籤文本仍爲白色。另外,如何在窗口上展開圖像和所有窗口小部件,以便每當我調整窗口大小時,所有窗口小部件都將調整大小以適應屏幕?

+1

而你得到什麼結果,換言之,*什麼是你的問題*? – unwind

+0

哎呀!將編輯! OMG :)謝謝放鬆 – user907810

回答

1

所有標籤都應該是白色的,以便它們可以在黑色窗口背景中看到。

據我已經在網上找到:

GtkLabel的Widget是不創造他們自己的 窗口,使自己變成幾個GTK +窗口小部件之一。這個menas爲了設置一個GtkLabel Widget的 bg顏色,你需要改變其父 的bg顏色。

所以在這種情況下,對於一個簡單的例子,我只在GtkEventBox中打包了一個標籤。
一段代碼:

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); 
... 

簡化RC文件:

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" 

和結果:
enter image description here

+0

感謝fabregaszy。我實際上希望標籤上的文字是白色的。只有前臺顏色在桌子樣式上設置爲白色,標籤上的文字纔會顯示爲白色。不過,按鈕上帶有文本「See itinerary」的標籤也會變成白色。我編輯了我的帖子。你可以嘗試上面的代碼。 – user907810

+1

在您的rc文件中,您應該儘可能精確地匹配您希望rc文件影響的標籤。有時'*'可能會很棘手,因爲它可能會影響GtkLabel,它是GtkButton的子節點(由gtk_button_new_with_label創建)。我也是GTK的新手,希望它能幫助你:D – fabregaszy

+0

用widget_class「GtkButton.GtkLabel」風格的「標籤」我解決了這個問題。謝謝您的幫助。 – user907810