這一章節介紹范圍控件的一些基本函數的使用和實現,很多函數的細節,在GTK編程文檔中有詳細的介紹。我只是照抄了文檔中的實例。當然生疏的部分自己也做了注釋和理解。GTK文檔鏈接在我的資源[里面可以下載](http://download.csdn.net/detail/jsh13417/6567043)
### 下面是范圍控件的具體實例代碼:
~~~
/*File:range_controls.c
*Date:2013-12-08
*Author:sjin
*Mail:413977243@qq.com
*/
#include <stdio.h>
#include <gtk/gtk.h>
#include <stdlib.h>
/*范圍控件:
* 由一般按鈕派生而來,只是開關按鈕只有兩個狀態,通過點擊
* 可以切換。
* 開關按鈕是復選按鈕和單選按鈕的基礎,所以單選按鈕和復選按鈕繼承了
* 許多開關按鈕的函數調用
*/
GtkWidget *hscale,*vscale;
void cb_pos_menu_select(GtkWidget *item,GtkPositionType pos)
{
/*設置兩個比例構件的比例值的顯示位置
*void gtk_scale_set_value_pos(GtkScale * scale,:比例構件
* GtkPositionType pos);:顯示對象的位置
* GTK_POS_TOP
* GTK_POS_RIGHT
* GTK_POS_BOTTOM
* GTK_POS_LEFT
* */
printf("###%s,pos = %d \n",__func__,pos);
gtk_scale_set_value_pos(GTK_SCALE(hscale),pos);
gtk_scale_set_value_pos(GTK_SCALE(vscale),pos);
}
void cb_update_menu_select(GtkWidget *item,GtkUpdateType Policy)
{
/*設置兩個比例控件的更新方式
*void gtk_range_set_update_policy(GtkRange *range,GtkUpdateType Policy);
*range : 范圍控件
*Policy :更新方式,有以下三個
* GTK_UPDATE_CONTINUOUS:信號時連續引發的
* GTK_UPDATE_DISCONTINUOUS:只有滑塊停止移動,用戶釋放鼠標時才引發
* GTK_UPDATE_DELAYED:當用戶釋放鼠標,或者滑塊短期停止移動時引發
*
* */
gtk_range_set_update_policy(GTK_RANGE(hscale),Policy);
gtk_range_set_update_policy(GTK_RANGE(vscale),Policy);
}
void cb_digits_scale(GtkAdjustment *adj)
{
/*設置 小數的位數
*gtk_scale_set_digits(GtkScale *scale,gint Digits)
*參數:scale:比例構件對象
* Digits:要顯示小數位數,最大13
* */
gtk_scale_set_digits(GTK_SCALE(hscale),(gint)adj->value);
gtk_scale_set_digits(GTK_SCALE(vscale),(gint)adj->value);
}
void cb_page_size(GtkAdjustment * get,GtkAdjustment * set)
{
/*將實例調整對象的page_size,和page_increment size設置為“page Size”
*比例控件指定的數值。
*/
set->page_size = get->value;
set->page_increment = get->value;
/*設置調整對象的值并使它引發一個“changed"信號,以重新配置所有已連接到這個調整對象的構件
*/
gtk_adjustment_set_value(set,CLAMP(set->value,set->lower,(set->upper-set->page_size)));
}
void cb_draw_value(GtkToggleButton * button)
{
/*根據復選框的狀態設置在比例構件上是否顯示比例值
*TRUE :顯示 FALSE:不顯示
* */
gtk_scale_set_draw_value(GTK_SCALE(hscale),button->active);
gtk_scale_set_draw_value(GTK_SCALE(vscale),button->active);
}
GtkWidget * make_menu_item(gchar *name,GCallback callback,gpointer data)
{
GtkWidget *item;
item = gtk_menu_item_new_with_label(name);
g_signal_connect(G_OBJECT(item),"activate",callback,data);
gtk_widget_show(item);
return item;
}
/*設置比例控件默認方式*/
void scale_set_default_values(GtkScale * scale)
{
gtk_range_set_update_policy(GTK_RANGE(scale),GTK_UPDATE_CONTINUOUS);
gtk_scale_set_digits(scale,1);
gtk_scale_set_value_pos(scale,GTK_POS_TOP);
gtk_scale_set_draw_value(scale,TRUE);
}
/*創建示例窗口*/
static void create_range_controls()
{
GtkWidget *window;
GtkWidget *button;
/*box1:縱向組裝盒子
* */
GtkWidget *box1,*box2,*box3;
GtkWidget *scrollbar;
GtkWidget *separator;
GtkWidget *opt,*menu,*item;
GtkWidget *label;
GtkWidget *scale;
GtkWidget *adj1,*adj2;
/************標準的窗口代碼**********/
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/*這個一般必要有delete_event信號到主窗口*/
g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);
/*設置窗口寬度*/
gtk_container_set_border_width(GTK_CONTAINER(window),20);
/*設置窗口標題*/
gtk_window_set_title(GTK_WINDOW(window),"范圍控件練習");
/******************************/
/*創建一個縱向組裝盒子*/
box1 = gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(window),box1);
gtk_widget_show(box1);
/*創建一個橫向組裝盒子*/
box2 = gtk_hbox_new(FALSE,0);
gtk_container_set_border_width(GTK_CONTAINER(box2),10);
gtk_box_pack_start(GTK_BOX(box1),box2,TRUE,TRUE,0);
gtk_widget_show(box2);
/*創建一個調整對象
* GtkObject *gtk_adjustment_new(gdouble value,調整對象的初始值,通常是最高或者最低位置
* gdouble lower,調整對象能取得的最低值
* gdouble upper,用于分欄構件最底部或最右邊的坐標
* gdouble step_increment,小步調整的值
* gdouble page_increment,大步調整的值
* gdouble page_size);分欄構件的可視區域
* */
adj1 = gtk_adjustment_new(0.0,0.0,101.0,0.1,1.0,1.0);
/*創建一個垂直比例控件*/
vscale = gtk_vscale_new(GTK_ADJUSTMENT(adj1));
scale_set_default_values(GTK_SCALE(vscale));
gtk_box_pack_start(GTK_BOX(box2),vscale,TRUE,TRUE,0);
gtk_widget_show(vscale);
/*創建一個縱向組裝盒子,并加入2個水平比例控件*/
box3 = gtk_vbox_new(FALSE,10);
gtk_box_pack_start(GTK_BOX(box2),box3,TRUE,TRUE,0);
gtk_widget_show(box3);
/*創建一個水平比例控件*/
hscale = gtk_hscale_new(GTK_ADJUSTMENT(adj1));
/*設置控件的寬度和高度*/
gtk_widget_set_size_request(GTK_WIDGET(hscale),200,-1);
scale_set_default_values(GTK_SCALE(hscale));
gtk_box_pack_start(GTK_BOX(box3),hscale,TRUE,TRUE,0);
gtk_widget_show(hscale);
/*創建一個滑動條*/
scrollbar = gtk_hscrollbar_new(GTK_ADJUSTMENT(adj1));
/*注意:
* 這導致當滾動條移動時,比例構件總是連續更新
* */
gtk_range_set_update_policy(GTK_RANGE(scrollbar),GTK_UPDATE_CONTINUOUS);
gtk_box_pack_start(GTK_BOX(box3),scrollbar,TRUE,TRUE,0);
gtk_widget_show(scrollbar);
box2 = gtk_hbox_new(FALSE,10);
gtk_container_set_border_width(GTK_CONTAINER(box2),10);
gtk_box_pack_start(GTK_BOX(box1),box2,TRUE,TRUE,0);
gtk_widget_show(box2);
/*用一個復選框控制是否顯示比較構件的當前的數值*/
button = gtk_check_button_new_with_label("Display value on scale widgets");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),TRUE);
g_signal_connect(G_OBJECT(button),"toggled",G_CALLBACK(cb_draw_value),NULL);
gtk_box_pack_start(GTK_BOX(box2),button,TRUE,TRUE,0);
gtk_widget_show(button);
box2 = gtk_hbox_new(FALSE,10);
gtk_container_set_border_width(GTK_CONTAINER(box2),10);
/*用一個選項菜單以改變顯示值的位置*/
label = gtk_label_new("Scale Value Position");
gtk_box_pack_start(GTK_BOX(box2),label,FALSE,FALSE,0);
gtk_widget_show(label);
opt = gtk_option_menu_new();
menu = gtk_menu_new();
item = make_menu_item("TOP",G_CALLBACK(cb_pos_menu_select),GINT_TO_POINTER(GTK_POS_TOP));
gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
item = make_menu_item("BUTTOM",G_CALLBACK(cb_pos_menu_select),GINT_TO_POINTER(GTK_POS_BOTTOM));
gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
item = make_menu_item("RIGHT",G_CALLBACK(cb_pos_menu_select),GINT_TO_POINTER(GTK_POS_RIGHT));
gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
item = make_menu_item("LEFT",G_CALLBACK(cb_pos_menu_select),GINT_TO_POINTER(GTK_POS_LEFT));
gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
gtk_option_menu_set_menu(GTK_OPTION_MENU(opt),menu);
gtk_box_pack_start(GTK_BOX(box2),opt,TRUE,TRUE,0);
gtk_widget_show(opt);
gtk_box_pack_start(GTK_BOX(box1),box2,TRUE,TRUE,0);
gtk_widget_show(box2);
box2 = gtk_hbox_new(FALSE,10);
gtk_container_set_border_width(GTK_CONTAINER(box2),0);
/*設置比例構件的更新方式*/
label = gtk_label_new("Scale Update Policy:");
gtk_box_pack_start(GTK_BOX(box2),label,TRUE,TRUE,0);
gtk_widget_show(label);
opt = gtk_option_menu_new();
menu = gtk_menu_new();
item = make_menu_item("Continuous",G_CALLBACK(cb_update_menu_select),GINT_TO_POINTER(GTK_UPDATE_CONTINUOUS));
gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
item = make_menu_item("Discontinuous",G_CALLBACK(cb_update_menu_select),GINT_TO_POINTER(GTK_UPDATE_DISCONTINUOUS));
gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
item = make_menu_item("Delayed",G_CALLBACK(cb_update_menu_select),GINT_TO_POINTER(GTK_UPDATE_DELAYED));
gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
gtk_option_menu_set_menu(GTK_OPTION_MENU(opt),menu);
gtk_box_pack_start(GTK_BOX(box2),opt,TRUE,TRUE,0);
gtk_widget_show(opt);
gtk_box_pack_start(GTK_BOX(box1),box2,TRUE,TRUE,0);
gtk_widget_show(box2);
box2 = gtk_hbox_new(FALSE,10);
gtk_container_set_border_width(GTK_CONTAINER(box2),10);
/*用于調整比例構件小數位數*/
label = gtk_label_new("Scale Digits:");
gtk_box_pack_start(GTK_BOX(box2),label,FALSE,FALSE,0);
gtk_widget_show(label);
adj2 = gtk_adjustment_new(1.0,0.0,5.0,1.0,1.0,0.0);
g_signal_connect(G_OBJECT(adj2),"value_changed",G_CALLBACK(cb_digits_scale),NULL);
scale = gtk_hscale_new(GTK_ADJUSTMENT(adj2));
gtk_scale_set_digits(GTK_SCALE(scale),0);
gtk_box_pack_start(GTK_BOX(box2),scale,TRUE,TRUE,0);
gtk_widget_show(scale);
gtk_box_pack_start(GTK_BOX(box1),box2,TRUE,TRUE,0);
gtk_widget_show(box2);
box2 = gtk_hbox_new(FALSE,10);
gtk_container_set_border_width(GTK_CONTAINER(box2),10);
/*用于調整水平比例構件滾動條的page size */
label = gtk_label_new("Scrollbar Page Size:");
gtk_box_pack_start(GTK_BOX(box2),label,FALSE,FALSE,0);
gtk_widget_show(label);
adj2 = gtk_adjustment_new(1.0,1.0,110.0,1.0,1.0,0.0);
g_signal_connect(G_OBJECT(adj2),"value_changed",G_CALLBACK(cb_page_size),adj1);
scale = gtk_hscale_new(GTK_ADJUSTMENT(adj2));
gtk_scale_set_digits(GTK_SCALE(scale),0);
gtk_box_pack_start(GTK_BOX(box2),scale,TRUE,TRUE,0);
gtk_widget_show(scale);
gtk_box_pack_start(GTK_BOX(box1),box2,TRUE,TRUE,0);
gtk_widget_show(box2);
/*創建一個分割線*/
separator = gtk_hseparator_new();
gtk_box_pack_start(GTK_BOX(box1),separator,FALSE,TRUE,0);
gtk_widget_show(separator);
box2 = gtk_vbox_new(FALSE,10);
gtk_container_set_border_width(GTK_CONTAINER(box2),10);
gtk_box_pack_start(GTK_BOX(box1),box2,FALSE,TRUE,0);
gtk_widget_show(box2);
/*創建一個退出按鈕*/
button = gtk_button_new_with_label("Quit");
g_signal_connect_swapped(G_OBJECT(button),"clicked",G_CALLBACK(gtk_main_quit),NULL);
gtk_box_pack_start(GTK_BOX(box2),button,TRUE,TRUE,0);
/*將退出按鈕固定為缺省,只要按回車鍵就能觸發*/
GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
gtk_widget_grab_default(button);
gtk_widget_show(button);
gtk_widget_show(window);
}
int main(int argc,char *argv[])
{
gtk_init(&argc,&argv);
/*創建范圍控件*/
create_range_controls();
gtk_main();
return 0;
}
~~~
執行后:
