鱼C论坛

 找回密码
 立即注册
查看: 2205|回复: 4

[技术交流] C语言GUI程序设计-GTK图文系列-主题设置

[复制链接]
发表于 2014-12-28 16:49:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这一讲来讲解GTK中的CSS主题设置。

效果图:

gtk_theme_normal.png gtk_theme_win7.png gtk_theme_xp.png

第一张图是只设置了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.css
GtkLabel {
    color:#00A000;
    background-color:gray;
}
GtkButton>GtkLabel
{
    color:black;
    background-color:white;
}
GtkButton>GtkLabel:hover {
    color:red;
    background-color:white;
}
win7\gtk.css
GtkWidget {
    background-color:#A9C3DD;
}

xp\gtk.css
GtkWidget {
    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中的资源使用。


评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
小甲鱼的二师兄 + 3 + 3 + 3 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-12-28 18:53:45 | 显示全部楼层
沙发 支持了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-28 19:01:46 | 显示全部楼层
支持个~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-29 10:56:40 | 显示全部楼层
支持楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-29 12:31:59 | 显示全部楼层
不错 加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 11:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表