关于GTK RC文件 使用……转载

转载 2011年11月15日 13:25:18

原文地址:

 http://hi.baidu.com/lammy/blog/item/8adf8ad6a8bbc72606088b46.html#lastcmt

GTK的RC----让动态的换皮肤立竿见影【原】
2009年07月15日 星期三 21:00

       《Apress.Foundations.of.GTK.plus.Development》作为一本入门级的书很好,但是要深入,这本书就有点力不从心了。最近在学习RC文件的编写时,我脑子里有这么一个概念:从GTK的设计上来看,它应该支持GTK程序换皮肤,那么在目前带有显示屏的电子设备中,它的前途真不能小看,特别是正在发展中的STB。
       学习完书中关于RC的内容后,感觉很简单,就一个gtk_rc_parse()函数就能搞定它,哪想我在实际实践中却是一波三折,从上周5开始,一有空便研究这个功能,始终抱着一个信念:既然GTK采用RC文档来管理它的style。那么这么强大的GTK不会连换皮肤都不能实现。一开始我是这么做的:
Fun1()
{
...
gchar *pRcFilePath;

pRcFilePath = RC文件//动态获取其中一个RC文件中
gtk_rc_parse(pRcFilePath );
...
}

以上只有当触发某个事件时才执行。当时我很激动的去触发那个事件,希望能看到我想要的结果,可是无论我怎么弄它都不动。一下找不到北,只有求助于GG,不知是国人太过于保守还是国人不屑这个问题,网上有人也碰到此问题,可是给出的回复没几个,且多半都是废话。后来求救于QQ群,也希望能给出点思路,因为我认为这个换皮肤这个功能在项目中肯定要用到的,在群里,有人很热心的跟我讨论了下,但还是没有得到解决。看来在国内还真是这句话中:求人不如求己。
       从上周5到今天,我白天在公司由于事情不是太多,我一有时间便去研究源码,可那个源码啊,我的个乖乖哟,好几十M呢!不好啃,但自生下来就没有服输过的我,决定啃。开始的几天我拿着那个源码东看看西看看,实在看不清楚个思路,但还是坚持了下来。现在回想起来开始那几天真的很有意义,尽管没有看懂,但是很多不明白的词已经印在我脑海里,为我今天质的变化提供了必要条件,今天真是一个五味瓶的日子,终于通过源码解决此问题;但今天也挨了老大一顿批,哎,认了。
先贴上可以实现换皮肤的源码:
Fun2()
{
...
gchar *pRcFilePath;
GtkSettings *pRootSettings;

pRcFilePath = RC文件//动态获取其中一个RC文件中
gtk_rc_parse(pRcFilePath );
gtk_rc_reparse_all();

pRootSettings = gtk_settings_get_default();
gtk_rc_reset_styles(pRootSettings);
...
}

好,闲话不说了,先说说我比较简单理解吧,首先我们要知道函数gtk_rc_parse()到底干了啥,一下是它的函数内容:
void gtk_rc_parse (const gchar *filename)
{
GSList *tmp_list;

g_return_if_fail (filename != NULL);//判断filename 是否存在

add_to_rc_file_list (&global_rc_files, filename, TRUE);//因为GTK是支持多个RC文件的,也就是支持换皮肤,所以它内核里面是通过链表来管理RC文件的。自然要先把RC文件添加到链表中。但不解析

for (tmp_list = rc_contexts; tmp_list; tmp_list = tmp_list->next)
    gtk_rc_context_parse_file (tmp_list->data, filename, GTK_PATH_PRIO_RC, TRUE);//上一个函数把RC文件添加到链表中时,它是还没有解析,这就是模块化的好处,这个函数就是解析filename,并把链表的一个reload置为TRUE,表示需要重新加载。
}

从上面的注释可以明白该函数只是添加RC并解析RC文件,但是没有加载在应用软件中去,所以我刚开始写的Fun1()自然就不能实现。
函数gtk_rc_reparse_all从函数名可以明白它是用来重新解析所有RC文件的。但是它只能加载在你创建新的对话框或控件中,而原窗体却纹丝不动。那么怎么要让原窗体也发生变化呢,而此时为什么不变化呢,我是这么理解的,因为每一个控件都有一块内存池管理它,但是它的属性应该在内存池里面。尽管你加载了RC,但是这块内存池里面的RC属性却还是原来的属性。
函数gtk_rc_reset_styles从GTK对它注释如下:
/**
* gtk_rc_reset_styles:
* @settings: a #GtkSettings
*
* This function recomputes the styles for all widgets that use a
* particular #GtkSettings object. (There is one #GtkSettings object
* per #GdkScreen, see gtk_settings_get_for_screen()); It is useful
* when some global parameter has changed that affects the appearance
* of all widgets,
because when a widget gets a new style, it will
* both redraw and recompute any cached information about its
* appearance. As an example, it is used when the default font size
* set by the operating system changes. Note that this function
* doesn't affect widgets that have a style set explicitely on them
* with gtk_widget_set_style().
*
* Since: 2.4
**/

这个函数是对所有空间的styles重新设置并重绘。
       哈哈,终于解决换皮肤功能,好开心哦,哦耶!

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

一、简介         Gtk+2.0控件的外观主要包括控件的背景颜色、控件的前景颜色、控件的字体等因素。控件的状态包括正常状态(GTK_STATE_NORMAL)、控件获得焦点时的状态(GTK_...
  • taiyang1987912
  • taiyang1987912
  • 2015年09月21日 16:24
  • 2074

GTK 主题指南 RC文件使用(二) 转载

原文地址: http://seasonkky.blog.163.com/blog/static/972917152010612114537602/     GTK开发之RC文件使用   20...
  • saintwinona
  • saintwinona
  • 2011年11月15日 13:43
  • 1309

GTK开发之RC文件使用

(1)、GTK 主题指南     1.Widgets         GTK拥有一套大量的widget集合,如按钮,滚动条,编辑框等,每一种组件的属性都可以单独进行配置。 所有的widget...
  • cock333
  • cock333
  • 2013年04月19日 15:30
  • 750

Unicode以及.rc的一点问题

一、宽字符函数对照 二、1.fwscanf(fp, L”%s”, mapname);得到的mapname按宽字符输出为乱码 原因为: fgetws内部调用了mbtowc,而mbtowc属于Loc...
  • D20152107
  • D20152107
  • 2017年09月06日 23:04
  • 103

glade使用与GTK+学习初步

1.使用glade进行绘制UI 2.将形成的文件另存为,chongmingming
  • hellobeifeng
  • hellobeifeng
  • 2014年08月21日 09:52
  • 2269

RC文件与makefile文件的作用及语法

        RC文件与makefile文件在非IDE的开发环境中十分重要。在基于MASM32软件包所构造的环境中,如用罗云彬所推荐的方法,则必须了解RC与MAKEFILE。      本文将介绍R...
  • Simbao
  • Simbao
  • 2006年07月04日 14:57
  • 4599

各种资源的利用(如何使用RC文件)

----在编写程序的过程中,经常要用到各种资源。比如说,想给自己的程序换个自己的图标,使用一些活泼的光标来增加趣味性,播放一些声音和动画文件,或者使用别人写好的程序来实现某个功能。我们往往希望将这些资...
  • nodeman
  • nodeman
  • 2015年01月27日 15:52
  • 334

巧用VC工程下的rc文件

一 利用rc文件进行界面的布局    打开一个资源文件,如FHRDemo.rc,右键选择查看代码,可以看到文本描述的资源文件,这里截取其中的一段。 // Dialog // IDD...
  • zhu2695
  • zhu2695
  • 2013年12月19日 09:10
  • 967

GTK实现打开文件操作

/******************************************************************************* * Author ...
  • juagle
  • juagle
  • 2011年04月21日 22:47
  • 2904

rc资源文件的宏定义

遇到一个问题,我希望在 DEBUG模式下包含资源A, 在RELEASE模式下包含B 于是我在 rc文件中写道: #ifdef _DEBUG .................A #else ........
  • norsd
  • norsd
  • 2008年06月11日 16:13
  • 3257
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于GTK RC文件 使用……转载
举报原因:
原因补充:

(最多只允许输入30个字)