要想創建一個新的元件,最重要的是要對 GTK 物件的工作原理有所瞭解。這一節只是一個簡述,詳見參考手冊。
GTK 元件具有物件導向的特性。然而,它是用標準的 C 來寫的。比起用C++來說,這可以大大改善可移植性及穩定性;但是,這也意味著寫元件的人需要小心許多實作上的問題。所有同一類別的元件的一般資訊(比如所有的按鈕元件)是放在在類別結構裡,類別的信號訊息只以該結構存儲了一份(充當 C 中的虛函式)。為了支援繼承,類別結構的第一個欄位必須是它的父類別結構的一個拷貝。GtkButton 的類別結構宣告如下:
struct _GtkButtonClass { GtkContainerClass parent_class; void (* pressed) (GtkButton *button); void (* released) (GtkButton *button); void (* clicked) (GtkButton *button); void (* enter) (GtkButton *button); void (* leave) (GtkButton *button); }; |
當將一個按鈕視為容器時(例如,當調整它的大小時),它的類別結構被轉換為 GtkContainerClass,並且相應的欄位用於處理信號。
每一個元件也有一個結構,它是創建每個實體的基礎。該結構有為每個元件的實體存儲不同訊息的欄位。我們把該結構稱為物件結構。如下是按鈕類別:
struct _GtkButton { GtkContainer container; GtkWidget *child; guint in_button : 1; guint button_down : 1; }; |
請注意,它同類別結構相似,第一個欄位是父類別的物件結構,因此該結構在需要時可以轉換為父類別的物件結構。
2 則留言