September 3, 2010, Friday, 245

Gtk miscellaneous widget

出自TechWiki

在2008年7月22日 (二) 05:59由Odin (對話 | 貢獻)所做的修訂版本
(差異) ←上一修訂 | 當前修訂 (差異) | 下一修訂→ (差異)
跳轉到: 導航, 搜索

目錄

[編輯] Miscellaneous Widgets

[編輯] Label

以下為如何宣告 Label:

GtkWidget *gtk_label_new( const char *str );
 
GtkWidget *gtk_label_new_with_mnemonic( const char *str );

參數為在 label 中欲顯示的字串,若要在 label 產生後修改其字串,則:

void gtk_label_set_text( GtkLabel   *label,
                         const char *str );

參數為欲修改的 label 及新字串。

要取得該 label 的字串,使用:

const gchar* gtk_label_get_text( GtkLabel  *label );

label 中的字串可以調整位置,使用:

void gtk_label_set_justify( GtkLabel         *label,
                            GtkJustification  jtype );
 
/* jtype 包括:
   GTK_JUSTIFY_LEFT
  GTK_JUSTIFY_RIGHT
  GTK_JUSTIFY_CENTER (the default)
  GTK_JUSTIFY_FILL */

label 字串會自動被格線圍繞,也可以自己設定:

void gtk_label_set_line_wrap (GtkLabel *label,
                              gboolean  wrap);
 
/* 參數wrap 可設為 TRUE 換 FALSE */

你也可以設定字串的底線格式:

void gtk_label_set_pattern   (GtkLabel          *label,
                                    const gchar       *pattern);


[編輯] Arrow

Arrow widget 會畫出一個箭頭,它不會發送訊號,通常和 button 一起使用。

以下為如何宣告 Arrow:

GtkWidget *gtk_arrow_new( GtkArrowType   arrow_type,
                          GtkShadowType  shadow_type );
 
/* 參數 arrow_type 設定箭頭的方向:
   GTK_ARROW_UP
  GTK_ARROW_DOWN
  GTK_ARROW_LEFT
  GTK_ARROW_RIGHT
 
 參數  shadow_type 設定箭頭的外觀:
   GTK_SHADOW_IN
  GTK_SHADOW_OUT (the default)
  GTK_SHADOW_ETCHED_IN
  GTK_SHADOW_ETCHED_OUT */

或者於 arrow 宣告後改變其設定:

void gtk_arrow_set( GtkArrow      *arrow,
                    GtkArrowType   arrow_type,
                    GtkShadowType  shadow_type );


[編輯] Tooltip

Tooltip 是當你將游標移動至某個 widget 上會彈跳出一段字串。

以下為如何宣告 Tooltip:

GtkTooltips *gtk_tooltips_new( void );

當產生一個 tooltip 後,將它附著在某個 widget 上:

void gtk_tooltips_set_tip( GtkTooltips *tooltips,
                           GtkWidget   *widget,
                           const gchar *tip_text,
                           const gchar *tip_private );
 
/* 參數 tooltips 為之前產生的 tooltip,參數 widget 為欲附著此 tooltip 的 widget,
      參數 tip_text 為 toolitip 欲顯示的文字,參數 tip_private 為一字串,是當要使用 
     GtkTipsQuery 時,可做為識別之用,可先設為 NULL。 */

與 tooltips 相關的還有兩個 functions,用來設定 tooltips 顯示與否:

void gtk_tooltips_enable( GtkTooltips *tooltips );
 
void gtk_tooltips_disable( GtkTooltips *tooltips );


[編輯] Progress Bar

Progress bar 用來表示目前工作執行的狀態。

以下為如何宣告 Progress bar:

GtkWidget *gtk_progress_bar_new( void );

使用 _set_fraction 設定 progress bar 的進度:

void gtk_progress_bar_set_fraction ( GtkProgressBar *pbar,
                                     gdouble        fraction );
 
/* 參數 pbar 為欲設定的 progress bar
    參數 fraction 為從0~100%,已完成多少進度,數值範圍從 0~1。 */

使用 _set_orientation 設定 progress bar 的方向:

void gtk_progress_bar_set_orientation( GtkProgressBar *pbar,
                                       GtkProgressBarOrientation orientation );
 
/* 參數 orientation 為 progress bar 數值變動的方向,可為以下四個其中之一:
   GTK_PROGRESS_LEFT_TO_RIGHT
  GTK_PROGRESS_RIGHT_TO_LEFT
  GTK_PROGRESS_BOTTOM_TO_TOP
  GTK_PROGRESS_TOP_TO_BOTTOM */

Progress bar 也可以用動態移動的方式來表現,設定一個 progress bar 使其能動態移動:

void gtk_progress_bar_pulse ( GtkProgressBar *progress );

設定動態移動的距離:

void gtk_progress_bar_set_pulse_step( GtkProgressBar *pbar,
                                      gdouble         fraction );

另外,在非動態移動下,可以設定文字字串顯示於 progress bar 上:

/* 使用 _set_text 設定文字字串 */
void gtk_progress_bar_set_text( GtkProgressBar *progress,
                                const gchar    *text );
 
/* 使用 _get_text 取得文字字串 */
const gchar *gtk_progress_bar_get_text( GtkProgressBar *pbar );


[編輯] Dialog

Dialog 如同 window 一樣,並包裝了一個 vbox、separator 及一個 hbox(action_area)。

Dialog 的架構如下:

struct GtkDialog
{
      GtkWindow window;
 
      GtkWidget *vbox;
      GtkWidget *action_area;
};

以下為如何宣告一個 dialog:

GtkWidget *gtk_dialog_new( void );

依上述產生一個空的 dialog 後,使用這個 dialog 的方法如下:

/* 將 label 加入 dialog 中 */
    label = gtk_label_new ("this is dialog");
    gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
                        label, TRUE, TRUE, 0);
    gtk_widget_show (label);
 
    /* 將 button 加入 dialog 中 */
    button = gtk_button_new ();
    gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
                        button, TRUE, TRUE, 0);
    gtk_widget_show (button);


[編輯] Ruler

Ruler 用來標示游標所在的位置。又分為垂直和水平兩種尺標,對應 window 的高度與寬度,並用一個三角形標識指出游標的正確位置。

以下為如何宣告 ruler:

/* 垂直尺標 */
GtkWidget *gtk_hruler_new( void );
 
/* 水平尺標 */
GtkWidget *gtk_vruler_new( void );

使用 _set_metric 定義其測量單位:

void gtk_ruler_set_metric( GtkRuler      *ruler,
                           GtkMetricType  metric );
 
/* 參數 metric 可以是:
  GTK_PIXELS
 GTK_INCHES
 GTK_CENTIMETERS */

使用 _set_range 定義尺標的初始位置及範圍:

void gtk_ruler_set_range( GtkRuler *ruler,
                          gdouble   lower,
                          gdouble   upper,
                          gdouble   position,
                          gdouble   max_size );
 
/* 參數 lower 與 upper 定義尺標的範圍
      參數 max_size 定義最大可顯示的數值
      參數 position 定義三角形標識的初始位置 */


[編輯] Statusbar

Statusbar 用來顯示文字訊息,並以堆疊的方式(push/pop)儲存訊息。

以下為如何宣告一個 statusbar:

GtkWidget *gtk_statusbar_new( void );

為了讓其它的 functions 呼叫,需要一個 context id 做識別:

guint gtk_statusbar_get_context_id( GtkStatusbar *statusbar,
                                    const gchar  *context_description );

statusbar 提供三種操作方式:

/* _push() 將訊息加入 statusbar,並傳回一 message_id。 */
guint gtk_statusbar_push( GtkStatusbar *statusbar,
                          guint         context_id,
                          const gchar  *text );
 
/* _pop() 移除堆疊中位置最高的訊息。 */
void gtk_statusbar_pop( GtkStatusbar *statusbar)
                        guint         context_id );
 
/* _remove() 根據  message_id,移除特定的訊息。 */
void gtk_statusbar_remove( GtkStatusbar *statusbar,
                           guint         context_id,
                           guint         message_id );


[編輯] Text Entry

Entry widget 允許在單行的 text box 中輸入和顯示文字。

以下為如何宣告一個 entry :

GtkWidget *gtk_entry_new( void );

使用 _set_text 改變文字內容:

void gtk_entry_set_text( GtkEntry    *entry,
                         const gchar *text );

使用 _get_text 取得文字內容:

const gchar *gtk_entry_get_text( GtkEntry *entry );

使用 _set_editable 設定文字是否可以被修改:

void gtk_editable_set_editable( GtkEditable *entry,
                                gboolean     editable );
 
/* 參數 editable 可為 TRUE 或 FALSE */

使用 _set_visibility 設定文字內容是否公開,常用於密碼輸入:

void gtk_entry_set_visibility( GtkEntry *entry,
                               gboolean  visible );
 
/* 參數 visible 設為 FALSE 時,文字以 '*' 號取代  */

使用 _select_region 設定選取文字:

void gtk_editable_select_region( GtkEditable *entry,
                                 gint         start,
                                 gint         end );
 
/* 參數 start 和 end 設定欲選取文字的起點與終點 */


[編輯] Spin Button

Spin Button widget 讓使用者在一定的範圍內選取數值,它包含一個 text entry box 以及 up、down arrow buttons。選擇某一個 arrow button 會改變 text entry 中的數值,text entry 也允許直接修改。

Spin Button 使用 Adjustments 物件以存取 spin button 的資訊:

GtkObject *gtk_adjustment_new( gdouble value,
                               gdouble lower,
                               gdouble upper,
                               gdouble step_increment,
                               gdouble page_increment,
                               gdouble page_size );
 
/* 各參數意義為:
      value: Spin Button 的起始值
    lower: 範圍的最小數值
    upper: 範圍的最大數值
    step_increment: 按下滑鼠 button 1 時遞增/遞減的數值
    page_increment: 按下滑鼠 button 2 時遞增/遞減的數值
    page_size: 未使用 */

以下為如何宣告一個 spin button:

GtkWidget *gtk_spin_button_new( GtkAdjustment *adjustment,
                                gdouble         climb_rate,
                                guint          digits );
/* 參數 climb_rate 定義 spin button 數值增加的幅度,數值範圍是 0.0~1.0
    參數 digits 定義小數點後有幾位 */

於產生一個 spin button 後,重新配置它:

void gtk_spin_button_configure( GtkSpinButton *spin_button,
                                GtkAdjustment *adjustment,
                                gdouble        climb_rate,
                                guint          digits );
 
/* 參數定義同上 */

使用以下兩個 functions 設定及取得 Adjustments

void gtk_spin_button_set_adjustment( GtkSpinButton  *spin_button,
                                     GtkAdjustment  *adjustment );
 
GtkAdjustment *gtk_spin_button_get_adjustment( GtkSpinButton *spin_button );

設定小數點後的位數:

void gtk_spin_button_set_digits( GtkSpinButton *spin_button,
                                 guint          digits) ;

設定 spin button 目前顯示數值:

void gtk_spin_button_set_value( GtkSpinButton *spin_button,
                                gdouble        value );

以浮點數或整數的方式取得目前 spin button 的數值:

/* 以浮點數方式取得目前 spin button 的數值 */
gdouble gtk_spin_button_get_value ( GtkSpinButton *spin_button );
 
/* 以整數方式取得目前 spin button 的數值 */
gint gtk_spin_button_get_value_as_int( GtkSpinButton *spin_button );

根據 spin button 目前的顯示數值,相對修改其數值:

void gtk_spin_button_spin( GtkSpinButton *spin_button,
                           GtkSpinType    direction,
                           gdouble        increment );
 
/* 參數 direction 可為以下其中之一
   GTK_SPIN_STEP_FORWARD   
  GTK_SPIN_STEP_BACKWARD
  GTK_SPIN_PAGE_FORWARD
  GTK_SPIN_PAGE_BACKWARD
  GTK_SPIN_HOME
  GTK_SPIN_END
  GTK_SPIN_USER_DEFINED 
 
 
GTK_SPIN_STEP_FORWARD 和 GTK_SPIN_STEP_BACKWARD :
根據參數 increment 修改 spin button 的數值,若 increment = 0,則根據 Adjestment 中的參數 step_increment 做修改。
 
GTK_SPIN_PAGE_FORWARD 和  GTK_SPIN_PAGE_BACKWARD :
修改 spin button 的參數 increment。
 
GTK_SPIN_HOME :
設定 spin button 的範圍最小數值。
 
GTK_SPIN_END :
設定 spin button 的範圍最大數值。
 
GTK_SPIN_USER_DEFINED :
依特定值修改 spin button 的數值 */

其他相關 functions:

/* 設定 psin button text 只允許輸入數值 */
void gtk_spin_button_set_numeric( GtkSpinButton *spin_button,
                                  gboolean       numeric );
 
/* 設定 spin button 是否包函範圍內最高與最低數值 */
void gtk_spin_button_set_wrap( GtkSpinButton *spin_button,
                               gboolean       wrap );
 
/* 設定 spin button 的數值至最接近的 step_increment*/
void gtk_spin_button_set_snap_to_ticks( GtkSpinButton  *spin_button,
                                        gboolean        snap_to_ticks );
 
/* 設定 spin button 的  update policy
    policy 有兩種 GTK_UPDATE_ALWAYS 或 GTK_UPDATE_IF_VALID 
    GTK_UPDATE_IF_VALID 依 text 中數入的數值做修改,且數值必須在 Adjustment 範圍內,否則保持原值
      GTK_UPDATE_ALWAYS  忽視 text 中的內容轉換為數值時所產生的錯誤 */
void gtk_spin_button_set_update_policy( GtkSpinButton  *spin_button,
                                        GtkSpinButtonUpdatePolicy policy );
 
/* 要求 spin button 使用 update policy */
void gtk_spin_button_update( GtkSpinButton  *spin_button );


[編輯] Combo Box

Combo box 可視為其它 widgets 的集合,它包含一個 text entry box 和 pull down menu。

Combo box 的架構如下:

struct _GtkCombo { 
        GtkHBox hbox; 
        GtkWidget *entry; 
        GtkWidget *button;
        GtkWidget *popup; 
        GtkWidget *popwin; 
        GtkWidget *list;
	...  };

以下為如何宣告一個 combo box:

GtkWidget *gtk_combo_new( void );

使用 _set_text 設定 combo box 中 entry 的字串:

gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo)->entry), "My String.");

使用 _set_popdown_strings 設定 popdown list 中的值:

void gtk_combo_set_popdown_strings( GtkCombo *combo,
                                    GList    *strings );

..........


[編輯] Calendar

Calendar widget 能顯示每月日期等資訊。

以下為如何宣告一個 calendar:

GtkWidget *gtk_calendar_new( void );

使用 _display_options 改變 calendar 的樣式與操作方式:

void gtk_calendar_display_options( GtkCalendar               *calendar,
                                   GtkCalendarDisplayOptions  flags );
 
/* 參數 flags 可為下列5個選項的組合,使用 '|' 來進行
      GTK_CALENDAR_SHOW_HEADING
    指定 calendar 會顯示年、月
 
    GTK_CALENDAR_SHOW_DAY_NAMES
    指定星期會以縮寫的三個字元表示(eg Mon,Tue, etc.)
 
    GTK_CALENDAR_NO_MONTH_CHANGE
    指定使用者不能改變目前顯示的月份
 
    GTK_CALENDAR_SHOW_WEEK_NUMBERS
    指定該週的週數於 calendar 的左下方顯示(eg. Jan 1 = Week 1,Dec 31 = Week 52).
 
    GTK_CALENDAR_WEEK_START_MONDAY
    指定每週的第一天是星期一,預設是星期日 */

下面兩個 functions 用來設定目前顯示的日期:

/* 回傳一 boolean 值指示選擇是否成功 */
gint gtk_calendar_select_month( GtkCalendar *calendar, 
                                guint        month,
                                guint        year );
 
/* 指定選擇目前月份的某一天,day = 0 時則取消選取目前選擇的日期 */
void gtk_calendar_select_day( GtkCalendar *calendar,
                              guint        day );

當某個日期被選取,該日期會以反背景色標示出來,以下 functions 提供被選取日期的操作:

gint gtk_calendar_mark_day( GtkCalendar *calendar,
                            guint        day);
 
gint gtk_calendar_unmark_day( GtkCalendar *calendar,
                              guint        day);
 
void gtk_calendar_clear_marks( GtkCalendar *calendar);

被選取的日期以陣列的方式儲存於 GtkCalendar 中,該陣列共有31個元素,透過比對陣列中的元素來判斷日期是否被選取,範例如下:

GtkCalendar *calendar;
    calendar = gtk_calendar_new ();
 
    ...
 
    /* Is day 7 marked? */
    if (calendar->marked_date[7-1])
       /* day is marked */

使用 _get_date 取得目前選取日期的年、月、日:

void gtk_calendar_get_date( GtkCalendar *calendar, 
                            guint       *year,
                            guint       *month,
                            guint       *day );


[編輯] Color Selection

Color selection widget 讓使用者經由操作RGB (Red, Green, Blue) 和 HSV (Hue, Saturation, Value)的方式改變顏色,並於顏色改變發送 "color_changed" 訊號。

建立一個新的 color selection 有兩種方法,GtkColorSelection 和 GtkColorSelectionDialog,使用 GtkColorSelection 方法,還需要繼承 VBOX 才能正確的被使用,因此較常用的方法為 GtkColorSelectionDialog。

以下為使用 GtkColorSelectionDialog 宣告一個 color selection:

GtkWidget *gtk_color_selection_dialog_new( const gchar *title );

使用 _set_has_opacity_control 設定顏色是否以透明的方式顯示:

void gtk_color_selection_set_has_opacity_control( GtkColorSelection *colorsel,
                                                  gboolean           has_opacity );
 
/* 參數 has_opacity 預設為關閉 FALSE */


其它相關 functions:

/* 設定目前顏色,透過一個 GdkColor 指標 */
void gtk_color_selection_set_current_color( GtkColorSelection *colorsel,
                                            GdkColor          *color );
 
/* 設定目前透明度,範圍從0~65535 */
void gtk_color_selection_set_current_alpha( GtkColorSelection *colorsel,
                                            guint16            alpha );
 
/* 取得目前顏色 */
void gtk_color_selection_get_current_color( GtkColorSelection *colorsel,
	                                    GdkColor *color );
 
/* 取得目前透明度 */
void gtk_color_selection_get_current_alpha( GtkColorSelection *colorsel,
                                            guint16           *alpha );


[編輯] File Selection

File selection widget 包含 Ok、Cancel、Help 等 button,並顯示一個 File dialog box 以提供檔案存取操作。

以下為如何宣告一個 file selection box:

GtkWidget *gtk_file_selection_new( const gchar *title );

下列 functions 用來設定或取得檔案名稱:

/* 設定預設的檔案名稱 */
void gtk_file_selection_set_filename( GtkFileSelection *filesel,
                                      const gchar      *filename );
 
/* 取得使用者輸入的檔案名稱 */
gchar *gtk_file_selection_get_filename( GtkFileSelection *filesel );