鱼C论坛

 找回密码
 立即注册
查看: 2507|回复: 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风格的背景色。

示例代码:

  1. #include <gtk/gtk.h>

  2. static gboolean theme = FALSE;

  3. void change_theme_clicked(GtkButton *button,gpointer user_data)
  4. {
  5.     theme = !theme;
  6.     GtkSettings *setting = GTK_SETTINGS(user_data);
  7.     if(theme)
  8.     {
  9.         gtk_settings_set_string_property(setting,"gtk-theme-name","theme_win7","");
  10.     }
  11.     else
  12.     {
  13.         gtk_settings_set_string_property(setting,"gtk-theme-name","theme_xp","");
  14.     }
  15. }
  16. int main(int argc,char *argv[ ])
  17. {
  18.     GtkWidget *window,*fixed;
  19.     GtkWidget *label1,*label2;
  20.     GtkWidget *button;
  21.     GtkCssProvider *provider;
  22.     GError  *err = NULL;
  23.     GtkSettings *setting;

  24.     gtk_init(&argc,&argv);
  25.     window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
  26.     gtk_window_set_title(GTK_WINDOW(window),"hello fishc - css theme");
  27.     gtk_widget_set_size_request(GTK_WIDGET(window),300,200);

  28.     fixed = gtk_fixed_new();
  29.     gtk_container_add(GTK_CONTAINER(window), fixed);

  30.     label1 = gtk_label_new("this is a simple");
  31.     label2 = gtk_label_new("window!");
  32.     button = gtk_button_new_with_label("change theme");
  33.     gtk_widget_set_size_request(button, 114,26);

  34.     gtk_fixed_put(GTK_FIXED(fixed), label1, 110,10);
  35.     gtk_fixed_put(GTK_FIXED(fixed), label2, 125,40);
  36.     gtk_fixed_put(GTK_FIXED(fixed), button, 125,80);

  37.     provider = gtk_css_provider_new();

  38.     setting = gtk_settings_get_default();

  39.     g_signal_connect(button, "clicked", G_CALLBACK(change_theme_clicked), setting);

  40.     gtk_css_provider_load_from_file(provider, g_file_new_for_path("theme.css"), &err);

  41.     gtk_style_context_add_provider_for_screen(gtk_widget_get_screen(window),
  42.                                             GTK_STYLE_PROVIDER(provider),
  43.                                               GTK_STYLE_PROVIDER_PRIORITY_THEME);
  44.     gtk_widget_show_all(window);
  45.     gtk_main();
  46.     return 0;
  47. }
复制代码

用到的主题文件:
theme.css

  1. GtkLabel {
  2.     color:#00A000;
  3.     background-color:gray;
  4. }
  5. GtkButton>GtkLabel
  6. {
  7.     color:black;
  8.     background-color:white;
  9. }
  10. GtkButton>GtkLabel:hover {
  11.     color:red;
  12.     background-color:white;
  13. }
复制代码

win7\gtk.css

  1. GtkWidget {
  2.     background-color:#A9C3DD;
  3. }
复制代码


xp\gtk.css

  1. GtkWidget {
  2.     background-color:#ECE9D8;
  3. }
复制代码

这个例子程序初始化是加载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 支持楼主!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-12-28 18:53:45 | 显示全部楼层
沙发 支持了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-28 19:01:46 | 显示全部楼层
支持个~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-29 10:56:40 | 显示全部楼层
支持楼主
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-29 12:31:59 | 显示全部楼层
不错 加油
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-18 16:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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