马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
这一讲来讲解GTK中的CSS主题设置。
效果图:
第一张图是只设置了GtkLabel的样式,第二张图是设置了Win7风格的背景色,第三张图设置了XP风格的背景色。
示例代码:
#include <gtk/gtk.h>
static gboolean theme = FALSE;
void change_theme_clicked(GtkButton *button,gpointer user_data)
{
theme = !theme;
GtkSettings *setting = GTK_SETTINGS(user_data);
if(theme)
{
gtk_settings_set_string_property(setting,"gtk-theme-name","theme_win7","");
}
else
{
gtk_settings_set_string_property(setting,"gtk-theme-name","theme_xp","");
}
}
int main(int argc,char *argv[ ])
{
GtkWidget *window,*fixed;
GtkWidget *label1,*label2;
GtkWidget *button;
GtkCssProvider *provider;
GError *err = NULL;
GtkSettings *setting;
gtk_init(&argc,&argv);
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),"hello fishc - css theme");
gtk_widget_set_size_request(GTK_WIDGET(window),300,200);
fixed = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window), fixed);
label1 = gtk_label_new("this is a simple");
label2 = gtk_label_new("window!");
button = gtk_button_new_with_label("change theme");
gtk_widget_set_size_request(button, 114,26);
gtk_fixed_put(GTK_FIXED(fixed), label1, 110,10);
gtk_fixed_put(GTK_FIXED(fixed), label2, 125,40);
gtk_fixed_put(GTK_FIXED(fixed), button, 125,80);
provider = gtk_css_provider_new();
setting = gtk_settings_get_default();
g_signal_connect(button, "clicked", G_CALLBACK(change_theme_clicked), setting);
gtk_css_provider_load_from_file(provider, g_file_new_for_path("theme.css"), &err);
gtk_style_context_add_provider_for_screen(gtk_widget_get_screen(window),
GTK_STYLE_PROVIDER(provider),
GTK_STYLE_PROVIDER_PRIORITY_THEME);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
用到的主题文件:
theme.cssGtkLabel {
color:#00A000;
background-color:gray;
}
GtkButton>GtkLabel
{
color:black;
background-color:white;
}
GtkButton>GtkLabel:hover {
color:red;
background-color:white;
}
win7\gtk.cssGtkWidget {
background-color:#A9C3DD;
}
xp\gtk.cssGtkWidget {
background-color:#ECE9D8;
}
这个例子程序初始化是加载theme.css中的样式,点击界面的changetheme按钮实现xp和win7风格样式的切换。
css作为网页中广泛使用的层叠样式表在GTK的主题中同样发挥作用,不懂CSS的朋友可以看下:
http://www.w3school.com.cn/css/css_syntax_pro.asp
GTK中的主题主要用到了 GtkStyleContext“类”和 GtkStyleProvider “接口”。
GtkStyleContext作为主题的呈现引擎,GtkStyleProvider作为主题的提供器,将提供器添加到呈现引擎中就可以使用所选的主题了。
这里为了使用CSS样式主题,使用了实现GtkStyleProvider接口的GtkCssProvider“类”,这是一个多态的设计思路,方便扩展,可以自行添加其它的主题提供器,比如GtkXmlProvider使用xml作为样式数据用,不过需要自行解析了。
gtk_css_provider_load_from_file 函数用为提供器加载主题文件。这个函数有三个参数,
第一个为要加载主题文件的提供器,
第二个为要加载的文件是个GFile类型,这里使用g_file_new_from_path函数来创建GFile类型,
第三个参数为GError。
主题提供器设置完成后,设置GtkStyleContext,这里为了设置界面所有元素的样式,使用了gtk_style_context_add_provider_for_screen函数。
这个函数用来为GdkScreen中的所有元素设置主题,它有三个参数,
第一个为GdkScreen类型,通过函数gtk_widget_get_screen()函数获取,
第二个参数为要设置的提供器,
第三个参数为优先级,暂时不用考虑。
设置完成后运行程序就可以加载theme.css中的主题了,出现图一中的效果。
要动态设置主题文件,把主题文件放入指定的路径( $HOME/.themes/theme-name/gtk-3.0/gtk.css),然后设置主题名称即可。
$HOME变量在windowx系统中对应C:\users\username文件夹。
gtk_settings_set_string_property 函数用来设置程序的字符串环境变量,
这里指定了变量名称gtk-theme-name 以及其取值theme_win7/theme_xp设置完成后,指定的主题就会被应用加载。
下一节讲解GTK中的资源使用。
|