一、简介
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)若有建议,请留言,在此先感谢!