GTK+浅谈之九控件的外观样式

一、简介

        Gtk+2.0控件的外观主要包括控件的背景颜色、控件的前景颜色、控件的字体等因素。控件的状态包括正常状态(GTK_STATE_NORMAL)、控件获得焦点时的状态(GTK_STATE_ACTIVE)、鼠标移动到控件上方时的状态(GTK_STATE_PRELIGHT)、控件失去功能时的状态(GTK_STATE_INSENSITIVE)、控件被选中时的状态(GTK_STATE_SELECTED)等等,不同的状态可以设定不同的外观。
        其中函数gtk_widget_modify_bg来设定控件的背景颜色, gtk_widget_modify_fg设置前景颜色,  gtk_widget_modify_font设定字体,gtk_widget_modify_text来改变文字录入控件录入的文字颜色,gtk_widget_modify_base来改变文字录入控件的背景颜色,其他的可以参考GTK+2.0的API参考手册。

二、详解

1、程序API

(1)代码

#include <gtk/gtk.h>

int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *vbox;
    GtkWidget *button;
    GtkWidget *label;
    GtkWidget *entry;
    PangoFontDescription *desc;
    static GdkColor red = {0, 0xffff, 0, 0};
    static GdkColor green = {0, 0, 0xffff, 0};
    static GdkColor blue = {0, 0, 0, 0xffff};
    static GdkColor yellow = {0, 0xffff, 0xffff, 0};
    static GdkColor cyan = {0, 0, 0xffff, 0xffff};
    gtk_init(&argc, &argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);
    gtk_window_set_title(GTK_WINDOW(window), "设定控件的样式");
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_container_set_border_width(GTK_CONTAINER(window), 15);

    desc = pango_font_description_from_string("Simhei 24");
    vbox = gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(window), vbox);
    button = gtk_button_new_with_label("绿色的按钮");
    gtk_widget_modify_bg(button, GTK_STATE_NORMAL, &green);
    gtk_widget_modify_bg(button, GTK_STATE_ACTIVE, &cyan);
    gtk_widget_modify_bg(button, GTK_STATE_PRELIGHT, &red);
    gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 8);

    button = gtk_button_new_with_label("红色字的按钮");
    gtk_widget_modify_fg(GTK_BIN(button)->child, GTK_STATE_NORMAL, &red);
    gtk_widget_modify_fg(GTK_BIN(button)->child, GTK_STATE_ACTIVE, &blue);
    gtk_widget_modify_fg(GTK_BIN(button)->child, GTK_STATE_PRELIGHT, &green);
    gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 8);
    label = gtk_label_new("蓝色的标签文字\n主要是改变了前景颜色");
    gtk_widget_modify_fg(label, GTK_STATE_NORMAL, &blue);
    gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 8);

    desc = pango_font_description_from_string("Simsun 24");
    entry = gtk_entry_new();
    gtk_entry_set_text(GTK_ENTRY(entry), "红色的输入文字");
    gtk_widget_modify_font(entry, desc);
    gtk_widget_modify_text(entry, GTK_STATE_NORMAL, &red);
    gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, FALSE, 8);
    entry = gtk_entry_new();
    gtk_widget_modify_font(entry, desc);
    gtk_entry_set_text(GTK_ENTRY(entry), "绿色的背景");
    gtk_widget_modify_base(entry, GTK_STATE_NORMAL, &green);
    //gtk_widget_modify_text(entry, GTK_STATE_NORMAL, &red);
    gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, FALSE, 8);

    gtk_widget_show_all(window);
    gtk_main();
    return TRUE;
}
(2)编译及运行
gcc -o style style.c `pkg-config --libs --cflags gtk+-2.0`

  

2、外观启动配置文件

        更改控件样式还可以编写一个外观启动文件,让单个或多个程序配置为同一风格的显示外观。在/etc/gtk目录下有系统自带的外观启动文件,文件说明了GTK+2.0程序运行时控件的前景颜色、背景颜色、背景图像、字体名称大小等。
(1)编写外观启动文件gtkrc,保存在当前程序目录下
style "default"
{
    fg[INSENSITIVE] = {0, 0, 0}
    bg[NORMAL] = {0.26, 0.73, 0.30}
    bg[PRELIGHT] = {0.05, 0.39, 0.01}
    bg[ACTIVE] = {0.24, 0.67, 0.28}
    bg[INSENSITIVE] = {0.26, 0.73, 0.30}
    base[NORMAL] = {0.83, 0.95, 0.83}
    bg_pixmap[NORMAL] = "back.png"
    bg_pixmap[ACTIVE] = "back.png"
    bg_pixmap[PRELIGHT] = "back.png"
    font_name = "simsun 16"
}
class "GtkWidget" style "default"
(2)编写程序rc.c
#include <gtk/gtk.h>

int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *swin, *hbox;
    GtkWidget *button, *label;
    gtk_init(&argc, &argv);
    gtk_rc_parse("gtkrc");
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_widget_set_usize (window, 500, 120);
    g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);
    gtk_window_set_title(GTK_WINDOW(window), "外观启动文件");
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_container_set_border_width(GTK_CONTAINER(window), 10);
    swin = gtk_scrolled_window_new(NULL, NULL);
    gtk_container_add(GTK_CONTAINER(window), swin);
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);

    hbox = gtk_hbox_new(FALSE, 0);
    gtk_container_set_border_width(GTK_CONTAINER(hbox), 15);
    gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(swin), hbox);
    button = gtk_button_new_with_label("普通按钮");
    gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 5);
    button = gtk_toggle_button_new_with_label("状态按钮");
    gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 5);
    button = gtk_radio_button_new_with_label(NULL, "单选按钮");
    gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 5);
    button = gtk_check_button_new_with_label("多选按钮");
    gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 5);
    label = gtk_entry_new();
    gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
    gtk_entry_set_text(GTK_ENTRY(label), "单行录入");

    gtk_widget_show_all(window);
    gtk_main();
    return TRUE;
}
(3)编译并运行比较
gcc -o rc rc.c `pkg-config --libs --cflags gtk+-2.0`
设置样式:

未设置样式:


三、总结

(1)Gtk的样式可以调用API函数,也可以使用标记语言形式。外观启动文件可以参考手册中Rcfile中的内容。
(2)若有建议,请留言,在此先感谢!

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌托邦2号

博文不易,支持的请给予小小打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值