http://hi.baidu.com/superprolog/item/43ac81615b102f1dad3e831a
GtkStyle结构
每个GtkWidget有5个公共成员,它们在下面的程序片段中显示。它们分别是关于风格信息、需要的大小、实际大小,一个GdkWindow用于把构件画到屏幕上,还有一个父构件的指针。
typedef struct
{
GtkStyle *style;
GtkRequisition requisition;
GtkAllocation allocation;
GdkWindow *window;
GtkWidget *parent;
} GtkWidget;
GtkStyle存储了构件绘制风格的信息。下面列出了结构:
typedef struct
{
GdkColor fg[5]/* 对于大部分构件来说是前景色 */
GdkColor bg[5] /* 对于大部分构件来说是背景色 */
GdkColor light[5] /* 创建构件影子时,较浅的颜色 */
GdkColor dark[5] /* 创建构件影子时,较深的颜色 */
GdkColor mid[5] /* 较浅颜色和较深颜色之间的中间色 */
GdkColor text[5] /* 对于大部分文字构件来说是文字颜色*/
GdkColor base[5] /* 背景色,用于文本编辑构件 */
GdkColor text_aa[5]; /* 用于文本颜色反锯齿 */
GdkColor black, white; /* 代表黑和白的颜色 */
PangoFontDescription *font_desc; /* 默认的字体 */
gint xthickness, ythickness; /* 线宽度 */
GdkPixmap *bg_pixmap[5]; /* 构件的背景图片*/
/* 图形上下文,包括每个颜色和状态的绘制属性 */
GdkGC *fg_gc [5], *bg_gc [5], *light_gc[5], *dark_gc[5], *mid_gc[5], *text_gc[5],
*base_gc[5], *text_aa_gc[5];
GdkGC *black_gc, *white_gc;
} GtkStyle;
GtkStyle结构中有许多对象。用户风格主题为每个都设置了一个默认值,因此改变它们不总是一个明智的做法。然而,如果需要,编辑构件的GtkStyle是一个修改显示的简单方式。
您会注意到许多风格属性是元素队列。这是因为每个元素都要为下列5个可能的构件状态设置一个值:
. GTK_STATE_NORMAL:构件处于正常状态
. GTK_STATE_ACTIVE:构件处于激活状态,比如当一个开关按钮被按下。
. GTK_STATE_PRELIGHT:当鼠标指针在构件上方的构件;它可以处理用户点击。
. GTK_STATE_SELECTED:当构件或者它包含的文字被选中
. GTK_STATE_INSENSITIVE:构件的未激活状态,它不想用用户的输入
资源文件
GTK+为应用程序提供了一种使用预定义风格的方式,叫做资源文件(RC文件)。RC文件允许用户为一类构件或者单个构件定义风格,会变得适应用户的偏好。和其他程序数据一样,它们通常被保存在home目录下,因此用户有权限改变设置。
为了加载资源文件,当加载您的程序时,您应该调用gtk_rc_parse()。所有相关的构件会自动应用这些风格。
void gtk_rc_parse (const gchar *filename);
而且,如果您想从一个RC文件中直接引用一个构件,您需要使用gtk_widget_set_name()来给构件设置一个唯一的名字。这个名字会在RC文件中被用到,用于设置构建的风格以及它衍生构件的风格。
在Listing 4-8中,显示了一个简单的RC文件的例子。在这个例子中,
创建了多个构件风格,每个风格都有一组属性。
Listing 4-8定义构件风格(.gtkrc)
style "widgets"
{
xthickness = 2
ythickness = 2
fg[ACTIVE] = "#FFFFFF"
fg[SELECTED] = "#003366"
fg[NORMAL] = "#CCCCCC"
fg[PRELIGHT] = "#FFFFFF"
fg[INSENSITIVE] = "#999999"
bg[ACTIVE] = "#003366"
bg[SELECTED] = "#FFFFFF"
bg[NORMAL] = "#666666"
bg[PRELIGHT] = "#003366"
bg[INSENSITIVE] = "#666666"
}
style "labels" = "widgets" {
font_name = "Sans Bold 14"
}
style "buttons" = "widgets" {
GtkButton::inner-border = { 10, 10, 10, 10 }
}
style "checks" = "buttons" {
GtkCheckButton::indicator-size = 25
}
class "GtkWindow" style "widgets"
class "GtkLabel" style "labels"
class "GtkCheckButton" style "checks"
class "Gtk*Button" style "buttons"
Figure 4-8展示了一个应用程序,它利用了Listing 4-8 RC文件的优势。颜色和字体和过去几章展示的例子不一样了。
![4.6 构件风格 - 郭映辉 - 郭映辉](https://i-blog.csdnimg.cn/blog_migrate/24e27c122bcd53594320db329d0332f6.jpeg)
构件可以应用风格,这点可以在前面的例子中找到启发。在这个例子中,button风格被应用于所有的Gtk*Button*widgets中,星号的意思是通配符。在程序中,这个风格应用于所有的对象,只要它的类名满足条件。
widget "widgetname.*.GtkButton" style "stylename"
第二个构件使用风格的方法,是基于构件的继承关系。这个例子中,stylename风格被应用到直接和间接继承于widgetname,它有点类似GtkButton。
widget "widgetname.*.GtkButton" style "stylename"
星号通配符可以匹配零到任意多的字符,除此之外,您还可以使用问号通配符,它可以匹配一个或多个任意字符。同时,通过英文句号表示构件继承关系,句号右边的构件是句号左边的构件的衍生构件。
使用widget指令会碰到问题,如果已经为一个构件指定了构件名,必须使用构件名,而不是使用类名。如果您想使用构件类名,您可以直接使用widget_class。这允许您忽略所有的构件名,并且应用一个风格到所有的构件,只要它符合我们指定的样式。
widget_class "GtkWindow.*.GtkLabel" style "stylename"
除了基本的风格指令,下述列表显示了其它重要RC文件支持的指令。
. include:包含其它资源文件。您可以指定绝对或者相对文件名。
. module_path:一个路径的列表,中间用冒号分隔,可以被风格引擎搜寻引用的RC文件。
. *pixmap_path:同上。
如果您计划在一个应用程序中使用RC文件,您应该确保提供给用户一个例子文件。您可以使用井号(#)来给RC文件添加注释,这给用户编辑文本时提供了帮助。
本节只给RC文件提供了基本的介绍。如果需要更多信息,您应该参阅附录C。还有很多关于RC文件和主题风格的学习资源,您可以在 http://art.gnome.org找到它们。