1. 程式人生 > >GTK圖形控件中的rc文件使用心得

GTK圖形控件中的rc文件使用心得

覆蓋 void 編輯 幸運 ted 初始化 想象 list ica

轉載自:

1、http://blog.csdn.net/saintwinona/article/details/6972754

2、

(1)、GTK 主題指南

1.Widgets
GTK擁有一套大量的widget集合,如按鈕,滾動條,編輯框等,每一種組件的屬性都可以單獨進行配置。
所有的widget由GtkWidget派生出來的。也就是說,更改GtkWidget的屬性所有的widgets會受到影響。幸運的是,大多數widget有其父類,如GtkButton的屬性同樣使GtkCheckButton生效,除非你對其進行單獨的配制。

widgets, 一些常用元素:/GnomePanel /GtkButton /GtkCheckButton /GtkColorButton /GtkComboBox /GtkComboBoxEntry /GtkEntry /GtkFrame /GtkMenu /GtkMenuBar /GtkMenuItem /GtkNotebook /GtkProgressBar /GtkRadioButton /GtkScale /GtkSpinButton /GtkStatusbar /GtkTreeView /StyleProperties /SymbolicColors

2.Styles
用戶自定義GtkWidget形成自己的風格,定義的方式有兩種形式,一種是以使用Gtk中的style,但style定義方式中只給出了幾種有限風格屬 性,如設置滾動條的寬度。另一種就是通過使用engine這種機制來實現,其中定義很多的屬性可供使用時選擇。
通過定義不同的styles合並在一起成為一個最終的Gtk主題,所以通常可以定義出一個基本的風格,其包含一此通用的選項配置,對於定義組件專有的屬性可以在引用它的基礎上做設置,如顏色的修改.

3.Engines
與styles組合實現出更有吸引力的風格,gtk內部實現很多可供選擇的風格。

4.gtkrc文件
一個rc文件被稱為gtkrc,存放的地方取決於系統的配置,通常放在/usr/share/themes/themename目錄下,存在gtk-2.0/gtkrc文件,此文件可以是一個rc文件,裏面定義了gtk中各種組件的配置。

1)修改構件的屬性:
fg:設置一個構件的前景色
bg:設置一個構件的背景色
text:可編輯文本構件的前景色
base:可編輯文本構件的背景色
bg_pixmap:顯示像素圖的構件的背景色
font_name:設置字體風格
xthickness:設置左右邊界的寬度
ythickness:設置上下邊界寬度

2)每一構件的分為五種狀態:
NORMAL:鼠標沒有覆蓋,點擊的狀態
PRELIGHT:鼠標在組件之上
ACTIVE:鼠標被按下或點擊的狀態,
INSENSITIVE:不能被激活,或點擊的狀態
SELECTED:被選對象可以帶好多屬性

3)風格綁定:
1.將一種風格綁定到組件類
格式:class "GtkButton" style "my-button" 將“my-button"風格綁定到GtkButton的所有實例
widget_class "*Text*" style "bright_yellow"
將"bright_yellow"風格綁定到名字中含有“Text“的組件
2.組件嵌套的方式widget_class
如widget_class "*.GtkButton.*" style "button-content"
3.應用指定風格
如果一個應用開發者已經明確陳列一種元素,在gtkrc文件中指明元素名,來將它風格化。
eg: widget “funky bar“ style “mystyle“
4.風格綁定的優先次序
對widget的rc風格綁定 > 對widget_class風格的綁定 > class 同一種組件的多種聲明是,後一種優於前一種。指定優先的highest,rc,theme,application,gtk,lowest將覆蓋上述的風 格綁定,

4)組件指定風格:
gtk api文檔列表中,列出的style properties,對某種widget類型,是明確的,eg。GtkWiget::focus-line-width = 2

5)高級指定風格(依據gtk2正式文檔):
界定符#,註釋所在行的內容,在解析gtkrc文件時,將此行被忽略掉。
1.binding name {...} 聲明綁定設置
2.calss pattern [ style | binding [ : priority ]] name 對繼承層的一個具體的分支,指定風格或綁定設置
3.include finename: 在此處引入文件,如果不是包含絕對路徑的文件名,將會在當前打開rc文件的文件夾下,搜索此文件
4.module_path path: 設置搜索rc文件中涉及的主題引擎路徑。
5.pixmap_path path: 設置搜索像素圖的路徑。
6.widget pattern [ style | binding [ : priority ]] name 給路徑名上相配匹配的一組具體的組件設置風格或綁定。
7.widget_class pattern [ style | binding [ : priority ]] nane 給路徑名上相匹配的一組具體的組件設置風格或綁定。

5.widget設置示例:
* Buttons:
buttons不存在背景的設置,只能通過對其所處的widget上添加背景的處理。
bevelling (relief): 對button進行三種狀態的設置: GTK_RELIEF_NORMAL, GTK_RELIEF_HALF, GTK_RELIEF_NONE.
* Labels:
不存在背景色,估計可以通過text[]這一屬性設置其前景色
* Text Boxes:
背景: base[NORMAL]
文本顏色: text[NORMAL]
應用自定義的風格: widget_class "*TextView*" style "my_style"
改變編輯時光標的顏色eg: GtkWidget::cursor-color "red"
* Scrollbars and Scales:
使用 widget_class "*Scrollbar*" 來指定scrollbars.
arrow button and main draggable rectangle colour is controlled by bg[NORMAL]
槽和邊框設置背景色 bg[ACTIVE]
鼠標光標移動scrollbar(滾動條)上時的顏色使用bg[PRELIGHT]設置
光標箭頭的顏色fg[NORMAL]
* Combobox: http://live.gnome.org/GnomeArt/Tutorials/GtkThemes/GtkComboBox
combobox是一個按鈕包含:label, separator, and arrow
* Icons:
設置自定義的圖標
stock["my-stock-item"] =
{
{ "itemmenusize.png", *, *, "gtk-menu" },
{ "itemtoolbarsize.png", *, *, "gtk-large-toolbar" }
{ "itemgeneric.png" } /* implicit *, *, * as a fallback */
}
* Menus:
菜單是一個組合控件,包括menubar和menuitems.
* Lists:
與Treeview組合為一個整體.
* Treeview:
Treeview開為兩部分:head_window,bin_window,該組件可以按元素列表和樹的形式顯示
Treeview 背景色是通過base[]控制,如果處於非關註狀態則按base[ACTIVE]的著色顯示.
設置Treeview的列的頂部的顏色,使用bg控制.
Treeview列的頂部為一個按鈕. 指定widget_class "*TreeView.GtkButton*". 指定頂部文本的顏色The text colour in the heads is controlled with fg, and not text.
The default line spacing of TreeView lists is quite large. It is not possible to reduce it in the rc file. This is a known issue.
Treeview 風格自屬性有: allow-rules, even-row-color, expander-size, horizontal-separator, indent-expanders, odd-row-color, vertical-separator.
* Tabs:
文本內容在非選中的tab上使用的是fg[ACTIVE],背景色設置bg[ACTIVE].
定義tabs文本設置 widget_class "*GtkNotebook*GtkLabel".
* engine
gtk engines 給開發者提供大量不同的顯示風格選項。通過使用不同的engine來設置不同風格的組件。
style "some-style" {
engine "clearlooks" {
# engine specific settings go here
}
}

顏 色可以使用顏色的名稱(GTK+ knows all names from the X color database /usr/lib/X11/rgb.txt),使用一種16進制的形式例如#rrrrggggbbbb, #rrrgggbbb, #rrggbb, or #rgb。r,g,b是16進制的整數(0-65535)或者是浮點數字0.0-1.0。
從2.10開始顏色可以使用符號顏色 以@color-name 或者是用表達式合成顏色。


(2)、如何從開始理解gtkrc在實踐中的使用
GTK 有自己缺省處理應用程序的方法,這就是使用rc配置文件。這些文件可用於給幾乎任何構件設置顏色,也能為一些構件的背景貼上一幅像素圖。

rc 文件的功能
在你的應用程序開始處,應包含一個如下的函數調用:
void gtk_rc_parse( char *filename );
把 rc 文件名傳遞給被調用的函數,隨後 GTK 會解析這個文件,並且使用文件中所定義構件類型的風格設置。

如果希望定義一套和其它構件集或同一構件集中其它邏輯部分具有不同風格的特定構件集,使用以下函數調用:
void gtk_widget_set_name( GtkWidget *widget, gchar *name );
把新創建的構件作為第一個參數,把你給該構件定的名程作為第二個參數。這使你能夠在 rc 文件中按名稱更改這個構件的屬性。

如果我們使用了一個如下的函數調用:
button = gtk_button_new_with_label ("redred");
gtk_widget_set_name (button,"redred");
那麽這個按鈕取名為"redred",並且在 rc 文件中可能通過像"redred button.GtkButton"這樣的名稱找到它。

後面作為示例的 rc 文件,設置主窗口的屬性,告訴所有子窗口繼承在"main button"風格項中規定的風格。在應用程序中的代碼為:
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_name (window, "main window");
然後在 rc 文件中用如下一行定義它的風格:
widget "main window.*GtkButton*" style "main_button"
該定義把"主窗口"中的所有按鈕構件設置為 rc 文件中定義的"main_buttons"風格。
如你所見,這是一個非常強大和靈活的系統。如何最大限度的利用它的優勢需要使用你的想象力。)


(3)、背景介紹
什麽是gtk主題引擎?

主題引擎是應用程序主題使用的一些代碼。如今,已有許多不同的主題引擎存在。GTK + 主題由三件事: 一個主題引擎 ,這是一個共享對象包括代碼的圖形要素,一個配置文件來配置的運作主題的引擎和核心部分基於GTK +和額外的數據文件的主題引擎如圖片。
A theme can include its own theme engine, it can use an existing theme engine, such as the Pixbuf theme which draws all elements in terms of images, or it can use GTK+‘s built in drawing code.

GTK+程序啟動如何分析主題?
每一個GTK+的程序都會在啟動時分析當前主題的gtkrc文件來決定顯示控件的風格,在gtkrc文件中通常會定義一個theme engine,並給它傳遞適當的參數,例如
engine "crux-engine" {
rect_scrollbar = TRUE
}

theme engine以共享庫的形式存在,存放在/usr/lib/gtk-2.0/2.2.0/engines或/usr/lib/gtk/themes/engines下,文件名形式為libcrux-engine.so.

我們看在實施題材引擎的有些細節。 如上所述,題材引擎是一個共有的對象。 共有的對象必須出口三個入口:

(1)void theme_init (GtkThemeEngine *engine);
(2)void theme_exit (GtkThemeEngine *engine);
(3)GtkRcStyle *theme_create_rc_style (GtkThemeEngine *engine);


重點:
1,在theme_init函數主要執行以下兩個函數,註冊生成GtkRCStyle和GtkStyle類。
crux_rc_style_register_type (module);
crux_style_register_type (module);
-----crux_rc_style_register_type函數執行GtkRCStyle類的初始化函數,重載crux_parse_rc_style和crux_rc_style_merge函數,用於gtkrc文件中參數的提取分析。
同樣地,crux_style_register_type函數執行GtkStyle類的初始化函數,重載所有drawing functions,例如
static void crux_style_class_init (PixbufStyleClass *klass)
{
GtkStyleClass *style_class = GTK_STYLE_CLASS (klass);

style_class->draw_hline = draw_hline;
style_class->draw_vline = draw_vline;
style_class->draw_shadow = draw_shadow;
style_class->draw_polygon = draw_polygon;
style_class->draw_arrow = draw_arrow;
style_class->draw_diamond = draw_diamond;
這些主題引擎通過對這些作用中的每一個的GtkThemeEngin的描述,是GTK+為每個題材引擎模塊創造它裝載的對象。

如何安裝主題引擎

我們現在常用的發行版都對主題引擎進行了打包,並與Gnome中的已經存在的引擎一起裝載。
對其主題引擎使用下面的命名方案:gtk-engines-(GTK+ 1.2的引擎)和 gtk2-engines-(GTK+ 2.4 的引擎)。先檢查所使用的發行版的引擎,如果有,直接使用它。
如果所用的發行版沒有您想要的主題引擎,那麽可以使用標準包的安裝方法來安裝。大多數引擎使用的是 atuoconf 和 make install。這樣安裝就非常簡單了:./configure && make && make install 。一般在readme中有詳細的說明引擎如何安裝。

引擎和主題如何區分?
我個人覺得,引擎其實只是一個程序,主題的配置文件就是是這個程序的參數,而這個程序運行的結果就是主題的外觀。

(4)、GTK+簡介

1、GTK+(GIMP ToolKit,GIMP工具包)最初用於開發GIMP,是一個用於創建圖形用戶接口的圖形庫在功能上類似微軟的MFC,即為應用程序提供一套與平臺無關 的圖形用戶界面接口GTK+是基於LGPL授權的,因此GTK+在開發開源軟件或商業的非自由軟件領域中都得到越來越廣泛的使用特別在嵌入式應用中,由於 GTK+庫小,且程序員可以根據自己需要對其進行裁剪,因此其占用資源少並能快速裝入,所以基於GTK+開發的圖形用戶界面適合在內存受限的嵌入式設備上 運行

2、GTK+是在GDK的基礎上創建的,其軟件層次結構如圖1所示Glib是Linux系統下最常用的輕量級的C語言函數庫,它提供了C常用的數據結構定義、處理函數、宏、

3、(引入)如果定義組件的風格
定義組合構件的設計首先需要對GTK+自定義構件的設計非常熟悉,對GTK+構件的設計風格和繼承關系很了解,並且能掌握對各個庫的相應關系組合構件它不 是單純從某個構件繼承下來的,只是組合任何想要組合的構件來實現某項功能因此必須考慮該組合構件的父類問題組合構件也跟構件庫裏面的構件一樣,它也可能要 接收信號並做出相應的處理因此掛接信號也是設計需要考慮的問題作為一個構件,組合構件也應有自己的風格,由於組合構件是多個構件的組合,每個構件又有其不 同的風格,如何確定當前構件的風格也是設計的難點

組合構件的設計思想及其實現
1、組合構件的設計思想
通俗的講,GTK+的構件庫是基於C語言的,它不具有面向對象的特性,然而GTK+的確又是面向對象的,那是因為它用C語言來實現了C++編譯器的功能因 此它同樣具有繼承的特性,它的代碼風格也延續了面向對象的設計風格在GTK+庫中,直接繼承自GtkObject對象的構件主要是GtkWidget,它 幾乎是所有可視構件的共同祖先,大多數構件共有的屬性都包括在其中與其他GUI開發工具不同的是,我們不用直接創建GtkObject或 GtkWidget對象,而是用定義對象的實例結構和類結構的方式來定義對象,然後再通過類型註冊來實現對象當前筆者就根據組合構件的特點,直接從 GtkObject繼承它與GtkWidget是一種並行關系和其他構件一樣,它也有相應的宏定義,來進行各種強制轉換和類型獲取任何一個構件都有其創建 對象函數,組合構件也是一樣,在對象中定義各個成員構件,在創建對象時將其一一創建,並根據需要對其各個構件來進行屬性設定,最後返回的是組合構件對象本 身關於信號的設定也是和其他構件的方法一樣,在類的結構體中定義信號,並在類的初始化中對信號進行定義組合構件的接口設計應可以根據當前總體設計的需要, 而不是像一般構件一樣完全的獨立出來,它具有自己的特色,並不需要刻意遵守一般構件的要求這也是組合構件的靈活性所在GTK+允許用戶通過rc文件來定制 應用程序的主題風格,即設置構件顏色、字號大小,並為構件添加背景圖標等而對於組合構件而言,由於其為多個構件的組合,每個構件都有其相應的風格設計,因 此嚴格的講它本身是不具有風格設計的,所謂組合構件的風格設計,就是對各個構件進行風格設計,並將其風格設定封裝在一個函數裏,對外只提供一個接口對於組 合構件如果不進行風格設計,它將沿用整個圖形界面的風格設計。


(5)、項目中GTK主題文件實例
*************************************************************

style "my_font_style" {
fg[NORMAL] = "#ffffff" #窗口文字顏色:白
bg[NORMAL] = "#666666" #窗口底色:灰白
font_name = "fzheiti 20"
}
widget "GtkWidget*" style "my_font_style"

#style "my_window_style" {
# engine "pixmap" {
# image {
# function = FLAT_BOX
# recolorable = TRUE
# stretch = TRUE
# file = "../pixmaps/olderpc_desktop/neoshine-default.jpg"
# }
# }
#}
#widget "window" style "my_window_style"

#style "fixed" {
# bg_pixmap[NORMAL] = "<parent>"
# bg_pixmap[INSENSITIVE]="<parent>"
# bg_pixmap[ACTIVE]="<parent>"
# bg_pixmap[PRELIGHT]="<parent>"
#}
#widget "win.fixed" style "fixed"

style "my_button_style" {
engine "pixmap" {
# image {
# function = BOX
# recolorable = TRUE
# state = PRELIGHT
# stretch = TRUE
# file = "../pixmaps/olderpc_desktop/main_button_light.png"
# }
image {
function = FOCUS #當控件獲得焦點的時候,使用下面得圖片
overlay_file = "../pixmaps/olderpc_desktop/main_button_light.png"
}
image {
function = BOX
recolorable = TRUE
# state = NORMAL
stretch = TRUE
file = "../pixmaps/olderpc_desktop/main_button.png"
}
}
# bg_pixmap[NORMAL] = "../pixmaps/olderpc_desktop/main_button.png"
}
widget "GtkButton*" style "my_button_style"

# Setting default font style
class "GtkWidget" style "my_font_style"
class "GtkWidget" style "my_button_style"

***************************************************

GTK圖形控件中的rc文件使用心得