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

来源:互联网 发布:苹果手机mac在哪里设置 编辑:程序博客网 时间:2024/06/05 00:09

一、简介

        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 0
原创粉丝点击