16、GTK+ 样式定制全解析

GTK+ 样式定制全解析

1. GTK+ 样式定制概述

GTK+ 提供了多种定制小部件样式的方法,大多数小部件样式的定制是通过样式属性和资源(RC)文件来完成的。

1.1 小部件状态

在定制样式时,需要指定小部件的状态,主要有以下五种:
- NORMAL :小部件正常运行时的状态。
- ACTIVE :活动小部件的状态,例如切换开关被按下时。
- PRELIGHT :鼠标指针悬停在小部件上,小部件会响应按钮点击。
- SELECTED :小部件或小部件文本被选中。
- INSENSITIVE :小部件被禁用,不会响应用户操作。

1.2 颜色指定格式

颜色可以用多种格式指定:
- 十六进制格式,如 #RGB、#RRGGBB、#RRRGGGBBB 和 #RRRRGGGGBBBB,其中 R、G、B 分别代表红、绿、蓝的十六进制值。
- 以 { R, G, B } 的形式指定,值可以是 0 到 65,535 之间的整数,也可以是 0.0 到 1.0 之间的浮点数。

2. 默认 RC 文件样式

表 1 列出了截至 GTK+ 2.10 支持的默认 RC 文件样式:
| 样式 | 描述 | 示例 |
| ---- | ---- | ---- |
| base[state] | 设置允许编辑文本的小部件(如 GtkEntry)在五种状态之一的背景颜色。 | base[ACTIVE] = { 0.5, 0.3, 1.0 } |
| bg[state] | 设置大多数小部件在五种状态之一的背景颜色。 | bg[NORMAL] = “#036” |
| bg_pixmap[state] | 设置小部件在五种状态之一使用的背景图像。如果图像文件是相对路径,将在 pixmap_path 指定的路径中搜索。 | bg_pixmap[SELECTED] = “image.xpm” |
| class::property | 为特定小部件类设置样式属性。 | class::cursor-aspect-ratio = 0.1 |
| color[“color_name”] | 从 GTK+ 2.10 开始,可以定义自己的颜色,颜色用 @color_name 引用。 | |
| engine | 主题引擎允许从 RC 文件定义自己的小部件样式。 | |
| fg | 设置大多数小部件在五种状态之一的前景颜色。 | fg[PRELIGHT] = “#123456” |
| font_name | 从 GTK+ 2.10 开始,忽略字体和字体集样式,使用此样式指定字体名称,应按照 Pango 字体描述字符串的格式指定。 | font_name = “Sans Bold 12” |
| stock[“stockid”] | 定义应用程序可以使用的新库存项,接受图像文件名、文本方向、小部件状态和大小。 | stock[“myitem”] = { “myitem.png”, LTR, NORMAL, “gtk-menu” } |
| text[state] | 设置如 GtkEntry 等小部件的文本颜色。 | text[PRELIGHT] = { 0, 65535, 0 } |
| xthickness | 设置 GTK+ 中各种值的水平内边距,以整数指定。 | |
| ythickness | 设置 GTK+ 中各种值的垂直内边距,以整数指定。 | |

2.1 自定义颜色

从 GTK+ 2.10 开始,可以定义自己的颜色,并使用以下四个函数来改变现有颜色:
- shade (factor, color) :使指定颜色变亮或变暗。factor 是一个浮点数,1.0 表示颜色不变,小于 1.0 使颜色变暗,大于 1.0 使颜色变亮。
- darker (color) :相当于 shade (0.7, color)。
- lighter (color) :相当于 shade (1.3, color)。
- mix (factor, color1, color2) :通过混合两种颜色创建新颜色,factor 为 0.0 输出 color2,为 1.0 输出 color1。

以下是一些颜色创建表达式的示例:

color["blackwhite"] = mix (0.5, "#000000", "#FFFFFF")
color["darker"] = shade (0.5, @blackwhite)
color["multiple"] = shade (1.4, mix (0.1, "#369", { 0, 1.0, 0 }))

3. Pango 文本标记语言

Pango 文本标记语言允许在一些小部件(如 GtkLabel)中使用 XML 标签来改变文本样式。

3.1 标签属性

属性 描述
background 描述背景颜色的值,可以是十六进制 RGB 值(如 #RRGGBB)或支持的颜色名称(如 blue)。
face 字体族名称,如 Sans 或 Monospace,与 font_family 相同。
fallback 默认启用,系统会尝试找到最接近指定字体的字体。必要时可设为 false。
font_desc PangoFontDescription 支持的字体描述字符串,如 “Sans Bold 12”。
font_family 字体族名称,如 Sans 或 Monospace,与 face 相同。
foreground 描述前景颜色的值,可以是十六进制 RGB 值(如 #RRGGBB)或支持的颜色名称(如 blue)。
lang 指定文本字符串的语言代码。
rise 通过指定垂直位移(以 em 单位的万分之一为单位)来创建上标和下标。负值创建下标,正值创建上标。
size 字体大小,以点的 1/1024 为单位,也可以使用 xx-small、x-small 等。
stretch 文本的拉伸程度,可能的值包括 ultracondensed、extracondensed 等。
strikethrough 指定是否在文本上划一条线,true 表示划,false 表示不划。
strikethrough_color 描述删除线颜色的值,可以是十六进制 RGB 值(如 #RRGGBB)或支持的颜色名称(如 blue)。
style 文本的斜体样式,可能的值包括 normal、oblique 和 italic。
underline 描述文本下划线的方式,可能的值包括 single、double、low 和 none。
underline_color 描述下划线颜色的值,可以是十六进制 RGB 值(如 #RRGGBB)或支持的颜色名称(如 blue)。
variant 值为 normal 或 smallcaps,允许文本以全大写字母呈现。
weight 文本的粗细,可能的值包括 ultralight、light 等。

3.2 便捷标签

Pango 文本标记语言还提供了一些便捷标签,可替代各种 属性:
- :使字体加粗,相当于 。
- :使字体比当前字体大,相当于
- :使字体倾斜,相当于
- :在文本上划一条线,相当于 。
- :使文本成为下标,使用下标文本的默认值。
- :使文本成为上标,使用上标文本的默认值。
- :使字体比当前字体小,相当于
- :使字体成为等宽字体,可用于代码段或需要等宽字符的其他字符串。
- :给文本加下划线,相当于 。

4. GtkTextTag 样式

文本标签允许为 GtkTextBuffer 的特定部分定义样式。表 2 列出了 GtkTextTag 支持的样式属性:
| 属性 | 类型 | 描述 |
| ---- | ---- | ---- |
| background | gchararray | 背景颜色,以十六进制字符串指定,格式为 #RRGGBB。 |
| background-full-height | gboolean | 指示背景颜色是否填充整行高度或仅填充每个字符的高度。 |
| background-gdk | GdkColor | 背景颜色。 |
| background-stipple | GdkPixmap | 作为小部件背景绘制的位图。 |
| direction | GtkTextDirection | 默认文本方向,设置为 GTK_TEXT_DIR_NONE、GTK_TEXT_DIR_LTR 或 GTK_TEXT_DIR_RTL。 |
| editable | gboolean | 指示文本是否可修改。 |
| family | gchararray | 字体族的正式名称,如 Sans 或 Monospace。 |
| font | gchararray | 以 PangoFontDescription 接受的形式描述完整字体的字符串。 |
| font-desc | PangoFontDescription | 应用于小部件的字体,也可以使用 font 指定实际字体字符串。 |
| foreground | gchararray | 前景颜色,以十六进制字符串指定,格式为 #RRGGBB。 |
| foreground-gdk | GdkColor | 前景颜色。 |
| foreground-stipple | GdkPixmap | 用作前景掩码的位图。 |
| indent | gint | 设置段落缩进的像素数。 |
| invisible | gboolean | 指示文本是否隐藏。 |
| justification | GtkJustification | 对齐方式,设置为 GTK_JUSTIFY_LEFT、GTK_JUSTIFY_RIGHT 或 GTK_JUSTIFY_CENTER。 |
| language | gchararray | 默认语言的 ISO 代码,使用 NULL 移除先前的设置。 |
| left-margin | gint | 左边距的宽度,以像素为单位。 |
| name | gchararray | 可作为文本标签名称的字符串,使用 NULL 移除先前的设置。 |
| paragraph-background | gchararray | 段落背景颜色,以十六进制字符串指定,格式为 #RRGGBB。 |
| paragraph-background-gdk | GdkColor | 段落的背景颜色。 |
| pixels-above-lines | gint | 在段落上方添加的像素空间数。 |
| pixels-below-lines | gint | 在段落下方添加的像素空间数。 |
| pixels-inside-wrap | gint | 在换行线之间添加的像素空间数。 |
| right-margin | gint | 右边距的宽度,以像素为单位。 |
| rise | gint | 文本相对于行底部的偏移量。 |
| scale | gdouble | 字体大小,以 Pango 缩放值设置,如 PANGO_SCALE_XX_SMALL、PANGO_SCALE_X_SMALL 等。 |
| size | gint | 字体大小,以 Pango 单位表示。 |
| size-points | gdouble | 字体大小,以点为单位。 |
| stretch | PangoStretch | 文本的拉伸程度,设置为 PANGO_STRETCH_ULTRA_CONDENSED 等。 |
| strikethrough | gboolean | 指示是否在文本上划一条线。 |
| style | PangoStyle | 字体样式值,设置为 PANGO_STYLE_NORMAL、PANGO_STYLE_OBLIQUE 或 PANGO_STYLE_ITALIC。 |
| tabs | PangoTabArray | 用于标签范围内所有制表符的自定义制表符数组。 |
| underline | PangoUnderline | 下划线样式,设置为 PANGO_UNDERLINE_NONE、PANGO_UNDERLINE_SINGLE 等。 |
| variant | PangoVariant | 文本应全部以大写字母呈现(PANGO_VARIANT_SMALL_CAPS)或以正常方式呈现(PANGO_VARIANT_NORMAL)。 |

5. 小部件样式属性

许多小部件都有可以通过 RC 文件更改的样式属性,以下是部分小部件的样式属性:

5.1 GtkArrow 样式属性

属性 类型 描述
weight gint 字体粗细,设置为 PANGO_WEIGHT_ULTRALIGHT、PANGO_WEIGHT_LIGHT 等。
wrap-mode GtkWrapMode 换行模式,设置为 GTK_WRAP_NONE、GTK_WRAP_CHAR 等。

5.2 GtkAssistant 样式属性

属性 类型 描述
arrow-scaling gfloat 用于缩放箭头大小的数字,范围在 0.0 到 1.0 之间,默认值为 0.7。
content-padding gint 在每页内容周围添加的像素内边距。
header-padding gint 在每页标题周围添加的像素内边距。

5.3 GtkButton 样式属性

属性 类型 描述
child-displacement-x gint 按钮按下时,按钮子小部件的水平位移。
child-displacement-y gint 按钮按下时,按钮子小部件的垂直位移。
default-border GtkBorder 当按钮能够成为默认小部件时,在按钮周围添加的额外边框。
default-outside-border GtkBorder 当按钮能够成为默认小部件时,在按钮外部添加的额外边框。
displace-focus gboolean 如果设置为 TRUE,将使用子位移样式属性。
image-spacing gint 按钮中图像和文本之间添加的像素间距。
inner-border GtkBorder 按钮及其子小部件边缘的边框。

5.4 GtkButtonBox 样式属性

属性 类型 描述
child-internal-pad-x gint 每个子小部件两侧的内边距。
child-internal-pad-y gint 每个子小部件上下的内边距。
child-min-height gint 容器内每个按钮的最小高度。
child-min-width gint 容器内每个按钮的最小宽度。

5.5 GtkCheckButton 样式属性

属性 类型 描述
indicator-size gint 复选框或单选按钮的大小,以像素为单位。
indicator-spacing gint 复选框指示器周围添加的内边距。

5.6 样式定制流程

以下是一个简单的样式定制流程 mermaid 流程图:

graph LR
    A[开始] --> B[选择小部件]
    B --> C[确定小部件状态]
    C --> D[选择样式属性]
    D --> E[指定属性值]
    E --> F[保存 RC 文件]
    F --> G[应用样式]
    G --> H[结束]

通过以上介绍,我们可以看到 GTK+ 提供了丰富的样式定制选项,通过合理使用这些选项,可以为应用程序创建出独特的用户界面。后续还会有更多小部件样式属性的介绍以及实际应用案例。

6. 更多小部件样式属性

6.1 GtkCheckMenuItem 样式属性

属性 类型 描述
indicator-size gint 复选菜单项指示器的大小,以像素为单位。

6.2 GtkComboBox 样式属性

属性 类型 描述
appears-as-list gboolean 如果设置为 TRUE,激活小部件时显示的下拉窗口将显示为列表而不是菜单。
arrow-size gint 组合框显示的箭头大小,以像素为单位,这是最小值,如果字体大小设置得更大,箭头会相应增大。

6.3 GtkDialog 样式属性

属性 类型 描述
action-area-border gint 在对话框底部操作区域周围添加的像素内边距。
button-spacing gint 对话框操作区域中按钮之间添加的间距。
content-area-border gint 在对话框主要内容周围添加的像素内边距。

6.4 GtkEntry 样式属性

属性 类型 描述
inner-border GtkBorder 在 GtkEntry 小部件的文本和其边缘之间添加的像素内边距。

6.5 GtkExpander 样式属性

属性 类型 描述
expander-size gint 扩展器箭头的大小,以像素为单位。
expander-spacing gint 扩展器箭头周围添加的像素内边距。

6.6 GtkIconView 样式属性

属性 类型 描述
selection-box-alpha guchar 选择框的 alpha 值,默认值为 64。
selection-box-color GdkColor 选择框显示的颜色。

6.7 GtkMenu 样式属性

属性 类型 描述
double-arrow gboolean 如果设置为 TRUE,滚动菜单时将显示两个箭头。
horizontal-offset gint 子菜单相对于其原始位置的水平偏移量,以像素为单位,该值可以为正或负,默认值为 -2。
horizontal-padding gint 在菜单左右两侧添加的像素内边距。
vertical-offset gint 子菜单相对于其原始位置的垂直偏移量,以像素为单位,该值可以为正或负。
vertical-padding gint 在菜单上下边缘添加的像素内边距。

6.8 GtkMenuBar 样式属性

属性 类型 描述
internal-padding gint 菜单项和菜单栏边缘之间的内边距。
shadow-type GtkShadowType 菜单栏边缘周围放置的阴影类型。

6.9 GtkMenuItem 样式属性

属性 类型 描述
arrow-spacing gint 当菜单项包含子菜单时,菜单项标签和其箭头之间添加的内边距。
horizontal-padding gint 菜单项两侧添加的像素内边距。
selected-shadow-type GtkShadowType 菜单项被选中时,其边缘周围放置的阴影类型。
toggle-spacing gint 菜单项图标和文本之间添加的像素内边距。

6.10 GtkMessageDialog 样式属性

属性 类型 描述
message-border gint 消息对话框中图像和标签周围添加的内边距。
use-separator gboolean 如果设置为 TRUE,将在消息对话框的内容和其按钮之间绘制分隔线。

6.11 GtkNotebook 样式属性

属性 类型 描述
arrow-spacing gint 滚动箭头和 GtkNotebook 小部件标签之间的内边距。
has-backward-stepper gboolean 如果设置为 TRUE,将显示向后滚动箭头。
has-forward-stepper gboolean 如果设置为 TRUE,将显示向前滚动箭头。
has-secondary-backward-stepper gboolean 如果设置为 TRUE,将在标签的另一侧放置第二个向后滚动箭头。
has-secondary-forward-stepper gboolean 如果设置为 TRUE,将在标签的另一侧放置第二个向前滚动箭头。
tab-curvature gint 选中标签和未选中标签之间的大小差异。
tab-overlap gint 相邻标签重叠的像素数。

6.12 GtkPaned 样式属性

属性 类型 描述
handle-size gint 两个窗格之间分隔器的宽度或高度。

6.13 GtkProgressBar 样式属性

属性 类型 描述
xspacing gint 小部件宽度方向添加的水平间距。
yspacing gint 小部件高度方向添加的垂直间距。

6.14 GtkRange 样式属性

属性 类型 描述
activate-slider gboolean 如果设置为 TRUE,滑块被拖动时将绘制为活动状态,阴影将向内绘制。
arrow-displacement-x gint 当水平箭头被按下时,范围将沿箭头指向的方向移动的距离。
arrow-displacement-y gint 当垂直箭头被按下时,范围将沿箭头指向的方向移动的距离。
slider-width gint 实际滚动条或刻度区域的宽度或高度,取决于小部件的方向。
stepper-size gint 步进按钮的大小,取决于范围小部件的类型。
stepper-spacing gint 步进按钮和滑块之间添加的内边距,如果设置为正数,将导致 trough-under-steppers 被设置。
trough-border gint 步进器和外部槽之间添加的内边距。
trough-side-details gboolean 如果设置为 TRUE,将在步进器的侧面放置细节。
trough-upper-steppers gboolean 如果设置为 TRUE,槽将沿整个范围绘制。

6.15 GtkScale 样式属性

属性 类型 描述
slider-length gint GtkScale 滑块的长度,以像素为单位。
value-spacing gint 如果显示刻度值,刻度值和槽之间的内边距。

6.16 GtkScrollbar 样式属性

属性 类型 描述
fixed-slider-length gboolean 如果设置为 TRUE,滑块将被强制保持最小长度,无论范围大小如何。
has-backward-stepper gboolean 如果设置为 TRUE,将显示向后箭头。
has-forward-stepper gboolean 如果设置为 TRUE,将显示向前箭头。
has-secondary-backward-stepper gboolean 如果设置为 TRUE,将在滚动条的另一侧放置第二个向后箭头。
has-secondary-forward-stepper gboolean 如果设置为 TRUE,将在滚动条的另一侧放置第二个向前箭头。
min-slider-length gint 滑块的最小长度,如果 fixed-slider-length 设置为 TRUE,这将是滚动器的恒定大小。

6.17 GtkScrolledWindow 样式属性

属性 类型 描述
scrollbar-spacing gint 滚动条和滚动窗口内容之间的像素内边距。

6.18 GtkSpinButton 样式属性

属性 类型 描述
shadow-type GtkShadowType 围绕微调按钮绘制的阴影类型,默认阴影类型为 GTK_SHADOW_IN。

6.19 GtkStatusbar 样式属性

属性 类型 描述
shadow-type GtkShadowType 围绕状态栏内容绘制的阴影类型,默认阴影类型为 GTK_SHADOW_IN。

6.20 GtkTextView 样式属性

属性 类型 描述
error-underline-color GdkColor 用于在标记为错误的文本下方绘制下划线的颜色。

6.21 GtkToolbar 样式属性

属性 类型 描述
button-relief GtkReliefStyle 工具栏按钮周围放置的边框类型。
internal-padding gint 工具栏边框和工具按钮之间的像素内边距。
max-child-expand gint 每个工具项可以调整到的最大宽度或高度。
shadow-type GtkShadowType 围绕工具栏绘制的阴影类型,默认阴影类型为 GTK_SHADOW_OUT。
space-size gint 工具栏上间隔器的宽度或高度。
space-style GtkToolbarSpaceStyle 工具栏将显示的间隔器类型,可以设置为 GTK_TOOLBAR_SPACE_EMPTY 或 GTK_TOOLBAR_SPACE_LINE,分别显示空内边距或一条线。

6.22 GtkToolButton 样式属性

属性 类型 描述
icon-spacing gint 工具按钮图标和标签之间的像素内边距。

6.23 GtkTreeView 样式属性

属性 类型 描述
allow-rules gboolean 如果设置为 TRUE,行可以以交替颜色绘制,但这并不启用此功能,只是允许这样做。
even-row-color GdkColor 当交替行以不同颜色绘制时,偶数行的背景颜色。
expander-size gint 行扩展器的大小,以像素为单位,默认值为 12。
grid-line-pattern gchararray 树视图中绘制网格线使用的模式。
grid-line-width gint 树视图中绘制网格线的宽度。
horizontal-separator gint 单元格之间的水平间距,必须是正偶数。
indent-expanders gboolean 如果设置为 TRUE,当行内容展开时,扩展器将缩进。
odd-row-color GdkColor 当交替行以不同颜色绘制时,奇数行的背景颜色。
row-ending-details gboolean 如果设置为 TRUE,将启用行背景主题。
tree-line-pattern gchararray 用于绘制树视图线的模式字符串。
tree-line-width gint 树视图线的宽度,以像素为单位。
vertical-separator gint 单元格之间的垂直间距,必须是正偶数。

6.24 GtkWidget 样式属性

属性 类型 描述
cursor-aspect-ratio gfloat 绘制插入光标时的纵横比,范围在 0.0 到 1.0 之间,默认值为 0.04。
cursor-color GdkColor 用于绘制插入光标的颜色。
draw-border GtkBorder 在小部件初始分配范围之外放置的边框量。
focus-line-pattern gchararray 小部件获得焦点时围绕其绘制的模式字符串。
focus-line-width gint 小部件获得焦点时绘制的线的宽度。
focus-padding gint 焦点线和小部件边缘之间的像素内边距。
interior-focus gboolean 如果设置为 TRUE,将为小部件绘制焦点线。
link-color GdkColor 用于绘制未访问链接的颜色。
scroll-arrow-hlength gint 具有水平滚动箭头的小部件中,水平滚动箭头的长度。
scroll-arrow-vlength gint 具有垂直滚动箭头的小部件中,垂直滚动箭头的长度。
secondary-cursor-color GdkColor 用于绘制辅助插入光标的颜色,当同时编辑从左到右和从右到左的文本时显示此光标。
separator-height gint 不同小部件中显示的许多类型分隔器的高度,此属性仅在 wide-separators 设置为 TRUE 时有效。
separator-width gint 不同小部件中显示的许多类型分隔器的宽度,此属性仅在 wide-separators 设置为 TRUE 时有效。
visited-link-color GdkColor 用于绘制已访问链接的颜色。
wide-separators gboolean 如果设置为 TRUE,可以使用 separator-width 和 separator-height 设置分隔器的宽度和高度,此时分隔器将绘制为框而不是线。

7. 总结

GTK+ 提供了丰富多样的样式定制选项,涵盖了从基本的颜色、字体设置到各种小部件的详细样式属性调整。通过合理运用这些定制方法,如使用 RC 文件、Pango 文本标记语言和 GtkTextTag 样式等,可以为应用程序打造出独具特色的用户界面。

在实际应用中,我们可以按照以下步骤进行样式定制:
1. 选择要定制样式的小部件。
2. 确定小部件的状态(如 NORMAL、ACTIVE 等)。
3. 选择合适的样式属性。
4. 为属性指定具体的值。
5. 保存 RC 文件。
6. 应用样式到应用程序中。

以下是一个简单的总结流程图:

graph LR
    A[选择小部件] --> B[确定状态]
    B --> C[选择属性]
    C --> D[指定值]
    D --> E[保存文件]
    E --> F[应用样式]

在定制过程中,要注意颜色的指定格式、字体的设置规范以及不同小部件样式属性的特点。同时,通过自定义颜色和使用便捷标签等功能,可以更高效地实现所需的样式效果。希望这些内容能帮助你在 GTK+ 应用开发中实现出色的界面设计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值