【问题标题】:GTK Modifying Background Color of GtkButtonGTK修改GtkButton的背景颜色
【发布时间】:2009-11-10 09:08:52
【问题描述】:

尝试改变背景/前景色....使用 Gtk+ 和 C.

  GdkColor color;
  gdk_color_parse( "#0080FF", &color );
  gtk_widget_modify_fg( GTK_WIDGET(button), GTK_STATE_SELECTED, &color );
  gtk_widget_modify_fg( GTK_WIDGET(button), GTK_STATE_NORMAL, &color );

我正在使用上述功能,但没有给出任何结果。

我正在寻找在这个问题中提出的问题(但在 C 中):
GTK: create a colored regular button

如何使用按钮样式更改按钮样式? 有人可以提供一些例子吗?

【问题讨论】:

    标签: c gtk gtk2


    【解决方案1】:

    GTK3 中,您使用CSS 进行操作

    像这样:

    #include <gtk/gtk.h>
    #include <string.h>
    
    void btn_clicked(GtkWidget *widget, GtkEntry *entry);
    void myCSS(void);
    void createWind(GtkWidget **window, gint width, gint height);
    void createGrid(GtkWidget **grid, GtkWidget **window, const gchar *name);
    
    int main(int argc, char *argv[]){
        GtkWidget *window, *grid;
        GtkWidget *button1, *button2, *button3, *button4;
    
        gtk_init(&argc, &argv);
        myCSS();
    
        /*     Create the Window     */
        createWind(&window, 390, 290);
    
        /*     Create a Grid     */
        createGrid(&grid, &window, "myGrid");
    
    
        /*     Create a red Button    */
        button1 = gtk_button_new_with_label("Red");
        gtk_widget_set_name(button1, "myButton_red");
        gtk_widget_set_size_request(button1, 160, 130);
        g_object_set (button1, "margin", 5, NULL);
    
        /*     Create a yellow Button    */
        button2 = gtk_button_new_with_label("Yellow");
        gtk_widget_set_name(button2, "myButton_yellow");
        gtk_widget_set_size_request(button2, 160, 130);
        g_object_set (button2, "margin", 5, NULL);
    
        /*     Create a green Button    */
        button3 = gtk_button_new_with_label("Green");
        gtk_widget_set_name(button3, "myButton_green");
        gtk_widget_set_size_request(button3, 160, 130);
        g_object_set (button3, "margin", 5, NULL);
    
        /*     Create a blue Button    */
        button4 = gtk_button_new_with_label("Blue");
        gtk_widget_set_name(button4, "myButton_blue");
        gtk_widget_set_size_request(button4, 160, 130);
        g_object_set (button4, "margin", 5, NULL);
    
    
        /*     Putting all together      */
        gtk_grid_attach(GTK_GRID(grid), button1, 0, 0, 1, 1);
        gtk_grid_attach(GTK_GRID(grid), button2, 1, 0, 1, 1);
        gtk_grid_attach(GTK_GRID(grid), button3, 0, 1, 1, 1);
        gtk_grid_attach(GTK_GRID(grid), button4, 1, 1, 1, 1);
    
    
    
        gtk_widget_show_all(window);
        gtk_main();
        return 0;
    }
    
    void myCSS(void){
        GtkCssProvider *provider;
        GdkDisplay *display;
        GdkScreen *screen;
    
        provider = gtk_css_provider_new ();
        display = gdk_display_get_default ();
        screen = gdk_display_get_default_screen (display);
        gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
    
        const gchar *myCssFile = "mystyle.css";
        GError *error = 0;
    
        gtk_css_provider_load_from_file(provider, g_file_new_for_path(myCssFile), &error);
        g_object_unref (provider);
    }
    
    void createWind(GtkWidget **window, gint width, gint height){
        *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(*window), "MyApp");
        gtk_window_set_default_size(GTK_WINDOW(*window), width, height);
        gtk_window_set_resizable (GTK_WINDOW(*window), TRUE);
        gtk_container_set_border_width(GTK_CONTAINER(*window), 5);
        g_signal_connect(*window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    }
    
    void createGrid(GtkWidget **grid, GtkWidget **window, const gchar *name){
        *grid = gtk_grid_new ();
        gtk_grid_set_row_homogeneous(GTK_GRID(*grid), FALSE);
        gtk_grid_set_column_homogeneous(GTK_GRID(*grid), FALSE);
        gtk_container_set_border_width(GTK_CONTAINER (*grid), 15);
        gtk_grid_set_column_spacing(GTK_GRID(*grid), 5);
        gtk_grid_set_row_spacing(GTK_GRID(*grid), 5);
        gtk_widget_set_name(*grid, name);
        g_object_set (*grid, "margin", 22, NULL);
        gtk_container_add (GTK_CONTAINER (*window), *grid);
    }
    
    void btn_clicked(GtkWidget *widget, GtkEntry *entry){
        (void)widget;
        const gchar *gstrTexto;
    
        gstrTexto = gtk_entry_get_text(entry);
        g_print("%s\n", gstrTexto);
        gtk_editable_select_region(GTK_EDITABLE(entry) , 0, 3);
    }
    

    mystyle.css:

    GtkWindow {
        background-color: magenta;
    }
    
    GtkButton {
        background-image: none;
    }
    
    #myGrid {
        background-color: cyan;
        border-style: solid;
        border-color: black;
        border-width: 1px;
    }
    
    #myChildTop {
        background-color: white;
    }
    
    #myButton_red{
        background-color: red;
        color: white;
        font-family: DejaVu Sans;
        font-style: normal;
        font-weight: bold;
        font-size: 20px;
        border-radius: 15px;
    }
    
    #myButton_yellow{
        background-color: yellow;
        color: white;
        font-family: DejaVu Sans;
        font-style: normal;
        font-weight: bold;
        font-size: 20px;
        border-radius: 15px;
    }
    
    #myButton_green{
        background-color: green;
        color: white;
        font-family: DejaVu Sans;
        font-style: normal;
        font-weight: bold;
        font-size: 20px;
        border-radius: 15px;
    }
    
    #myButton_blue{
        background-color: blue;
        color: white;
        font-family: DejaVu Sans;
        font-style: normal;
        font-weight: bold;
        font-size: 20px;
        border-radius: 15px;
    }
    
    #myButton_red:hover,
    #myButton_yellow:hover,
    #myButton_green:hover,
    #myButton_blue:hover{
       background-color: black;
    }
    

    如果您将鼠标聚焦在一个 Button 上,该 Button 将变为黑色:

    更多关于使用GTK3 - CSS- C Language you find Here的信息。

    【讨论】:

    • 天哪,感谢这个示例代码,帮了大忙
    • 这就是 SO 存在的原因。
    • 由于某种原因background-color 不起作用,但background 起作用。
    【解决方案2】:

    Picture of Red GtkButton http://www.ubuntu-pics.de/bild/30465/screenshot_001_1Jt60q.png

    GdkColor color;
    
    gdk_color_parse ("red", &color);
    
    gtk_widget_modify_bg ( GTK_WIDGET(button), GTK_STATE_NORMAL, &color);
    

    请注意,我们正在修改 bg 而不是 fg

    【讨论】:

    • 我已将border Relief 设置为NONE...所以它不显示BG/FG 颜色...当Border Relief 为None 时设置BG/FG 颜色很热??
    • 我认为这是不可能的。当按钮的边框浮雕设置为无时,它就像一个标签,因为它是“透明的”,它的背景颜色与其父容器相同。
    • gtk_widget_modify_bg 现在已被弃用。请用 gtk_widget_override_background_color 替换它
    • 有没有办法改变字体颜色?
    猜你喜欢
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2021-09-22
    • 2022-01-03
    相关资源
    最近更新 更多