嵌入式成长轨迹23 【Linux应用编程强化】【Linux下的C编程 下】【Linux GUI编程】...
?
?
一 ??GTK+/Gnome開發簡介
GTK+是一個用于創建圖形用戶界面(GUI)的圖形庫,它在功能上類似微軟的MFC,為應用程序提供了一套與平臺無關的圖形用戶接口。GTK+最初用于開發GIMP(General Image Manipulation Program),因而稱為GTK(GIMP Toolkit)。
?
1???????? 第一個GTK+應用程序
GtkWidget *gtk_window_new(GtkWindowType windowtype);
GTK_WINDOW_TOPLEVEL
GTK_WINDOW_DIALOG
GTK_WINDOW_POPUP
void gtk_widget_show(GtkWidget *widget);
void gtk_main(void);
?
1 /* hello.c */ 2 3 #include<gtk/gtk.h> 4 5 int main(int argc, char **argv[]) 6 7 { 8 9 GtkWidget *window; 10 11 gtk_init(&argc, &argv); 12 13 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 14 15 gtk_widget_show(window); 16 17 gtk_main(); 18 19 return 0; 20 21 }?
?
2???????? 信號連接回調函數
#define gtk_signal_connect(object, name, func, func_data) \
?? gtk_signal_connect_full((object), (name), (func), 0, (func_data), 0, 0, 0)
gulong gtk_signal_connect_full(GtkObject *object, const gchar *name, GtkSignalFunc func, \
?? GtkCallbackMarshal unsupported, gpointer data, GtkDestroyNotify destroy_func, \
?? gint object_signal, gint after);
?
void callback_func(GtkWidget *widget, gpointer callback_data );
?
#define gtk_signal_connect_object(object, name, func, slot_object) \
?? gtk_signal_connect_full ((object), (name), (func), 0, (slot_object), 0, 1, 0)
gulong gtk_signal_connect_full(GtkObject *object, const gchar *name, GtkSignalFunc func, \
?? GtkCallbackMarshal unsupported, gpointer data, GtkDestroyNotify destroy_func, \
?? gint object_signal, gint after);
?
void callback_func( GtkObject *object );
?
?
1 /* hello2.c */ 2 3 #include <gtk/gtk.h> 4 5 void hello(GtkWidget *widget, gpointer data ) 6 7 { 8 9 g_print ("Hello World!\n"); 10 11 } 12 13 gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) 14 15 { 16 17 g_print ("delete event occurred\n"); 18 19 return TUNE; 20 21 } 22 23 void destroy(GtkWidget *widget, gpointer data ) 24 25 { 26 27 gtk_main_quit(); 28 29 } 30 31 int main(int argc, char **argv) 32 33 { 34 35 GtkWidget *window; 36 37 GtkWidget *button; 38 39 gtk_init(&argc, &argv); 40 41 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 42 43 gtk_signal_connect(GTK_OBJECT(window), "delete_event", 44 45 GTK_SIGNAL_FUNC(delete_event), NULL); 46 47 gtk_signal_connect(GTK_OBJECT(window), "destroy", 48 49 GTK_SIGNAL_FUNC(destroy), NULL); 50 51 gtk_container_set_border_width(GTK_CONTAINER (window), 30); 52 53 button = gtk_button_new_with_label("Hello World"); 54 55 gtk_signal_connect(GTK_OBJECT(button), "clicked", G_CALLBACK(hello), NULL); 56 57 gtk_container_add(GTK_CONTAINER(window), button); 58 59 gtk_widget_show(button); 60 61 gtk_widget_show(window); 62 63 gtk_main(); 64 65 return 0; 66 67 }?
?
1 /* table.c */ 2 3 #include <gtk/gtk.h> 4 5 void callback1(GtkWidget *widget, gpointer data ) 6 7 { 8 9 g_print ("Button 1 clicked\n"); 10 11 } 12 13 void callback2(GtkWidget *widget, gpointer data ) 14 15 { 16 17 g_print ("Button 2 clicked\n"); 18 19 } 20 21 gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) 22 23 { 24 25 g_print ("delete event occurred\n"); 26 27 gtk_main_quit(); 28 29 return FALSE; 30 31 } 32 33 int main(int argc, char **argv) 34 35 { 36 37 GtkWidget *window; 38 39 GtkWidget *table; 40 41 GtkWidget *button; 42 43 gtk_init(&argc, &argv); 44 45 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 46 47 gtk_signal_connect(GTK_OBJECT(window), "delete_event", 48 49 GTK_SIGNAL_FUNC(delete_event), NULL); 50 51 gtk_container_set_border_width(GTK_CONTAINER (window), 15); 52 53 table = gtk_table_new(2, 2, TRUE); 54 55 gtk_container_add (GTK_CONTAINER (window), table); 56 57 button = gtk_button_new_with_label("Button 1"); 58 59 gtk_signal_connect(GTK_OBJECT(button), "clicked", G_CALLBACK(callback1), NULL); 60 61 gtk_table_attach_defaults (GTK_TABLE (table), button, 0, 1, 0, 1); 62 63 gtk_widget_show (button); 64 65 button = gtk_button_new_with_label("Button 2"); 66 67 gtk_signal_connect(GTK_OBJECT(button), "clicked", G_CALLBACK(callback2), NULL); 68 69 gtk_table_attach_defaults (GTK_TABLE (table), button, 1, 2, 0, 1); 70 71 gtk_widget_show (button); 72 73 button = gtk_button_new_with_label("Exit"); 74 75 gtk_signal_connect(GTK_OBJECT(button), "clicked", G_CALLBACK(delete_event), NULL); 76 77 gtk_table_attach_defaults (GTK_TABLE (table), button, 0, 2, 1, 2); 78 79 gtk_widget_show (button); 80 81 gtk_widget_show (table); 82 83 gtk_widget_show(window); 84 85 gtk_main(); 86 87 return 0; 88 89 }?
?
二? 常用GTK+構件
GTK+中的構件非常豐富,這一節主要介紹其中部分常用的構件,例如按鈕、標簽、對話框等。下面首先討論構件的定位。
1???????? 構件定位
在用GTK+構件創建程序界面時,使用容器來實現構件的定位。GTK+中有兩種容器,其中一種只能容納一個子構件,例如GtkWindow;而另外一種則可以容納多個子構件,例如GtkHBox、GtkVBox以及GtkTable等。
1).GtkWindow構件
?????? GtkWidget* gtk_window_new(GtkWindowType type);
?????? void gtk_window_set_title(GtkWindow *window, const gchar *title);
?????? void gtk_window_set_default_size(GtkWindow *window, gint width, gint height);
?
?
?
2).GtkBox構件
?????? GtkWidget* gtk_hbox_new(gboolean homogeneous, ?????????????? gint spacing);
?????? GtkWidget* gtk_vbox_new(gboolean homogeneous, ?????????????? gint spacing);
?????? void gtk_box_pack_start(GtkBox *box, GtkWidget? ?????????????? *child, gint expand, gint fill, gint padding);
?????? void gtk_box_pack_end(GtkBox *box, GtkWidget ????????????????? ???*child, gint expand, gint fill, gint padding);
?
?
3).GtkTable構件
?????? GtkWidget *gtk_table_new( guint rows, guint columns, gboolean homogeneous);
?
?????? void gtk_table_attach(GtkTable *table, GtkWidget?? *child, guint left_attach, guint right_attach, guint top_attach, guint bottom_attach, GtkAttachOptions xoptions, GtkAttachOptions yoptions, guint xpadding, guint ypadding);
?
?????? void gtk_table_attach_defaults(GtkTable *table, GtkWidget *widget, guint left_attach, guint right_attach, guint top_attach, guint bottom_attach);
?
2? 按鈕構件
1).普通按鈕(GtkButton)
GtkWidget* gtk_button_new(void);
GtkWidget* gtk_button_new_with_label(const gchar *label);
2).開關按鈕(GtkToggleButton)
GtkWidget *gtk_toggle_button_new(void);
GtkWidget *gtk_toggle_button_new_with_label(const gchar *label);
gboolean gtk_toggle_button_get_active (GtkToggleButton *toggle_button);
3).復選按鈕(GtkCheckButton)
GtkWidget *gtk_check_button_new(void);
GtkWidget *gtk_check_button_new_with_label(const gchar *label);
4).單選按鈕(GtkRadioButton)
GtkWidget *gtk_radio_button_new(CSList *group);
GtkWidget *gtk_radio_button_new_with_label(CSList *group, gchar *label);
GSList* gtk_radio_button_group(GtkRadioButton *radio_button);
?
1 /* radio.c */ 2 3 #include <gtk/gtk.h> 4 5 gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) 6 7 { 8 9 g_print ("delete event occurred\n"); 10 11 gtk_main_quit(); 12 13 return FALSE; 14 15 } 16 17 int main(int argc, char **argv) /* 主函數 */ 18 19 { 20 21 GtkWidget *window; 22 23 GtkWidget *vbox; 24 25 GtkWidget *button; 26 27 GSList *group; 28 29 gtk_init(&argc, &argv); /* 初始化 */ 30 31 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); /* 創建主窗口 */ 32 33 /* 為delete_event事件連接一個回調函數 */ 34 35 gtk_signal_connect(GTK_OBJECT(window), "delete_event", 36 37 GTK_SIGNAL_FUNC(delete_event), NULL); 38 39 gtk_window_set_title(GTK_WINDOW (window), "radio"); /* 設置窗口的標題 */ 40 41 gtk_container_set_border_width(GTK_CONTAINER (window), 15); /* 設置窗口的邊框寬度 */ 42 43 /* 創建一個垂直組裝盒 */ 44 45 vbox = gtk_vbox_new(FALSE, 0); 46 47 gtk_container_add(GTK_CONTAINER(window), vbox); /* 添加到主窗口之中 */ 48 49 gtk_widget_show(vbox); 50 51 /* 創建第一個單選按鈕 */ 52 53 button = gtk_radio_button_new_with_label(NULL, "radio button 1"); 54 55 gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0); /* 將按鈕添加到組裝盒之中 */ 56 57 gtk_widget_show(button); 58 59 group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button)); /* 創建按鈕組 */ 60 61 /* 創建第二個單選按鈕 */ 62 63 button = gtk_radio_button_new_with_label(group, "radio button 2"); 64 65 gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0); 66 67 gtk_widget_show(button); 68 69 /* 創建第三個單選按鈕 */ 70 71 button = gtk_radio_button_new_with_label(group, "radio button 3"); 72 73 gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0); 74 75 gtk_widget_show(button); 76 77 /* 顯示主窗口 */ 78 79 gtk_widget_show(window); 80 81 /* 事件循環 */ 82 83 gtk_main(); 84 85 return 0; 86 87 }?
?
?
3???????? 標簽構件
標簽(GtkLabel)也是應用程序中經常使用的一種構件。
GtkWidget *gtk_label_new(const char *str );
gchar *gtk_label_get_text(GtkLabel *label);
void gtk_label_set_text(GtkLabel *label, const char *str);
void gtk_label_set_justify(GtkLabel *label, GtkJustification jtype);
GTK_JUSTIFY_LEFT:左對齊
GTK_JUSTIFY_RIGHT:右對齊
GTK_JUSTIFY_CENTER:居中對齊(默認)
GTK_JUSTIFY_FILL:填滿
?
1 /* labels.c */ 2 3 #include <gtk/gtk.h> 4 5 int main(int argc, char **argv) 6 7 { 8 9 GtkWidget *window; 10 11 GtkWidget *vbox; 12 13 GtkWidget *label; 14 15 gtk_init(&argc, &argv); /* 初始化 */ 16 17 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); /* 創建主窗口 */ 18 19 gtk_signal_connect(GTK_OBJECT(window), "destroy", 20 21 GTK_SIGNAL_FUNC(gtk_main_quit), NULL); 22 23 gtk_window_set_title(GTK_WINDOW (window), "label"); /* 設置窗口的標題 */ 24 25 gtk_container_set_border_width(GTK_CONTAINER (window), 15); /* 設置窗口的邊框寬度 */ 26 27 /* 創建一個垂直組裝盒 */ 28 29 vbox = gtk_vbox_new(FALSE, 0); 30 31 gtk_container_add(GTK_CONTAINER(window), vbox); /* 添加到主窗口之中 */ 32 33 /* 創建第一個標簽 */ 34 35 label = gtk_label_new("Line 1: Hello\nLine 2 : World"); 36 37 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT); 38 39 gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); 40 41 /* 創建第二個標簽 */ 42 43 label = gtk_label_new("Line 3 : Linux\nLine 4 : Programming "); 44 45 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); 46 47 gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); 48 49 /* 顯示所有構件 */ 50 51 gtk_widget_show_all(window); 52 53 /* 事件循環 */ 54 55 gtk_main(); 56 57 return 0; 58 59 }?
?
?
4???????? 文本及文本輸入構件
文本構件和文本輸入構件是兩個比較常用的構件,用于顯示和編輯文本。
1).文本構件
2).文本輸入構件
?
1 /* text.c */ 2 3 #include <gtk/gtk.h> 4 5 void editable_toggle(GtkWidget *widget, GtkWidget *text) /* 復選框回調函數 */ 6 7 { 8 9 gtk_editable_set_editable(GTK_EDITABLE(text), 10 11 GTK_TOGGLE_BUTTON(widget)->active); 12 13 } 14 15 16 17 gint delete_event(GtkWidget *widget, /* 退出按鈕回調函數 */ 18 19 GdkEvent *event, gpointer data) 20 21 { 22 23 gtk_main_quit(); 24 25 return FALSE; 26 27 } 28 29 30 31 int main(int argc, char **argv) /* 主函數 */ 32 33 { 34 35 GtkWidget *window; 36 37 GtkWidget *vbox, *hbox; 38 39 GtkWidget *text; 40 41 GtkWidget *check; 42 43 GtkWidget *button; 44 45 gtk_init(&argc, &argv); /* 初始化 */ 46 47 /* 創建主窗口 */ 48 49 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 50 51 gtk_signal_connect(GTK_OBJECT(window), "destroy", 52 53 GTK_SIGNAL_FUNC(gtk_main_quit), NULL); 54 55 gtk_window_set_title(GTK_WINDOW (window), "text"); 56 57 gtk_container_set_border_width(GTK_CONTAINER (window), 15); 58 59 /* 創建一個垂直組裝盒 */ 60 61 vbox = gtk_vbox_new(FALSE, 0); 62 63 gtk_container_add(GTK_CONTAINER(window), vbox); 64 65 /* 創建一個文本構件 */ 66 67 text = gtk_text_new(NULL, NULL); 68 69 gtk_text_insert(text, NULL, NULL, /* 插入文本使用系統默認字體和顏色*/ 70 71 NULL, "Source Code :", -1); 72 73 gtk_box_pack_start(GTK_BOX(vbox), text, TRUE, TRUE, 0); 74 75 /* 創建一個水平組裝盒 */ 76 77 hbox = gtk_hbox_new(FALSE, 0); 78 79 gtk_container_add(GTK_CONTAINER(vbox), hbox); 80 81 /* 創建一個復選按鈕 */ 82 83 check = gtk_check_button_new_with_label("Editable"); 84 85 gtk_signal_connect(GTK_OBJECT(check), "toggled", 86 87 GTK_SIGNAL_FUNC(editable_toggle), text); 88 89 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE); 90 91 gtk_box_pack_start(GTK_BOX(hbox), check, TRUE, TRUE, 0); 92 93 /* 創建退出按鈕 */ 94 95 button = gtk_button_new_with_label("Exit"); 96 97 gtk_signal_connect(GTK_OBJECT(button), "clicked", 98 99 G_CALLBACK(delete_event), NULL); 100 101 gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0); 102 103 /* 顯示所有構件 */ 104 105 gtk_widget_show_all(window); 106 107 /* 事件循環 */ 108 109 gtk_main(); 110 111 return 0; 112 113 }?
?
1 /* entry.c */ 2 3 #include <gtk/gtk.h> 4 5 void enter_callback(GtkWidget *widget, gpointer data) /* 回調函數 */ 6 7 { 8 9 const gchar *entry_text; 10 11 entry_text = gtk_entry_get_text(GTK_ENTRY(widget)); 12 13 printf("Entry contents : %s\n", entry_text); 14 15 } 16 17 void editable_toggle(GtkWidget *widget, GtkWidget *entry) 18 19 { 20 21 gtk_editable_set_editable(GTK_EDITABLE(entry), GTK_TOGGLE_BUTTON(widget)->active); 22 23 } 24 25 gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) 26 27 { 28 29 gtk_main_quit(); 30 31 return FALSE; 32 33 } 34 35 int main(int argc, char **argv) /* 主函數 */ 36 37 { 38 39 GtkWidget *window; 40 41 GtkWidget *vbox, *hbox; 42 43 GtkWidget *entry; 44 45 GtkWidget *check; 46 47 GtkWidget *button; 48 49 gtk_init(&argc, &argv); /* 初始化 */ 50 51 /* 創建主窗口 */ 52 53 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 54 55 gtk_signal_connect(GTK_OBJECT(window), "destroy", 56 57 GTK_SIGNAL_FUNC(gtk_main_quit), NULL); 58 59 gtk_window_set_title(GTK_WINDOW (window), "label"); 60 61 gtk_container_set_border_width(GTK_CONTAINER (window), 15); 62 63 /* 創建一個垂直組裝盒 */ 64 65 vbox = gtk_vbox_new(FALSE, 0); 66 67 gtk_container_add(GTK_CONTAINER(window), vbox); 68 69 /* 創建一個文本輸入構件 */ 70 71 entry = gtk_entry_new(); 72 73 gtk_signal_connect(GTK_OBJECT(entry), "activate", GTK_SIGNAL_FUNC(enter_callback), NULL); 74 75 gtk_box_pack_start(GTK_BOX(vbox), entry, TRUE, TRUE, 0); 76 77 /* 創建一個水平組裝盒 */ 78 79 hbox = gtk_hbox_new(FALSE, 0); 80 81 gtk_container_add(GTK_CONTAINER(vbox), hbox); 82 83 /* 創建一個復選按鈕 */ 84 85 check = gtk_check_button_new_with_label("Editable"); 86 87 gtk_signal_connect(GTK_OBJECT(check), "toggled", GTK_SIGNAL_FUNC(editable_toggle), entry); 88 89 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE); 90 91 gtk_box_pack_start(GTK_BOX(hbox), check, TRUE, TRUE, 0); 92 93 /* 創建Exit按鈕 */ 94 95 button = gtk_button_new_with_label("Exit"); 96 97 gtk_signal_connect(GTK_OBJECT(button), "clicked", G_CALLBACK(delete_event), NULL); 98 99 gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0); 100 101 /* 顯示所有構件 */ 102 103 gtk_widget_show_all(window); 104 105 /* 事件循環 */ 106 107 gtk_main(); 108 109 return 0; 110 111 }?
?
5???????? 進度條構件
進度條構件(GtkProgressBar)一般用來顯示應用程序中某個操作的狀態。
?
1 /* progressbar.c */ 2 3 #include <gtk/gtk.h> 4 5 gint started; /* 狀態標志 */ 6 7 gint paused; 8 9 gint progress(gpointer data ) /* 更新進度條 */ 10 11 { 12 13 gfloat i; 14 15 GtkAdjustment *adj; /* 調整對象 */ 16 17 i = gtk_progress_get_value(GTK_PROGRESS(data)); /* 獲取進度條的當前值 */ 18 19 if(0 == started) /* 判斷進度更新是否被停止 */ 20 21 { 22 23 if(0 == paused) /* 判斷進度更新是否被暫停 */ 24 25 { 26 27 i = i + 1; 28 29 paused = 0; 30 31 } 32 33 } 34 35 else 36 37 { 38 39 i = 100; 40 41 } 42 43 adj = GTK_PROGRESS (data)->adjustment; 44 45 if (i > adj->upper) /* 判斷是否超出取值范圍 */ 46 47 { 48 49 i = adj->lower; 50 51 } 52 53 gtk_progress_set_value(GTK_PROGRESS (data), i); /* 更新進度條 */ 54 55 return (TRUE ) ; 56 57 } 58 59 60 61 void show_toggle(GtkWidget *widget, GtkWidget *pbar) /* 顯示文本復選框回調函數 */ 62 63 { 64 65 gtk_progress_set_show_text(GTK_PROGRESS(pbar), 66 67 GTK_TOGGLE_BUTTON(widget)->active); 68 69 } 70 71 72 73 gint start_event(GtkWidget *widget, gpointer data) /* 開始按鈕回調函數 */ 74 75 { 76 77 gfloat i; 78 79 i = gtk_progress_get_value(GTK_PROGRESS(pbar)); /* 獲取進度條的當前值 */ 80 81 if(100 == i) 82 83 { 84 85 started = 0; /* 設置狀態標志*/ 86 87 paused = 0; 88 89 } 90 91 return TRUE; 92 93 } 94 95 96 97 gint pause_event(GtkWidget *widget, gpointer data) /* 暫停按鈕回調函數 */ 98 99 { 100 101 if(0 == paused) /* 判斷是否已經暫停 */ 102 103 { 104 105 paused = 1; 106 107 } 108 109 else /* 如果已經暫停,則取消暫停 */ 110 111 { 112 113 paused = 0; 114 115 } 116 117 return TRUE; 118 119 } 120 121 122 123 gint stop_event(GtkWidget *widget, gpointer data) /* 停止按鈕回調函數 */ 124 125 { 126 127 started = 1; /* 設置狀態標志*/ 128 129 paused = 1; 130 131 return TRUE; 132 133 } 134 135 136 137 gint delete_event(GtkWidget *widget, /* 關閉按鈕回調函數 */ 138 139 GdkEvent *event, gpointer data) 140 141 { 142 143 gtk_main_quit(); 144 145 return FALSE; 146 147 } 148 149 150 151 int main(int argc, char **argv) /* 主函數 */ 152 153 { 154 155 GtkWidget *window; 156 157 GtkWidget *vbox, *hbox; 158 159 GtkWidget *pbar; 160 161 GtkWidget *check; 162 163 GtkWidget *button; 164 165 166 167 gtk_init(&argc, &argv); /* 初始化 */ 168 169 /* 創建主窗口 */ 170 171 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 172 173 gtk_signal_connect(GTK_OBJECT(window), "destroy", 174 175 GTK_SIGNAL_FUNC(gtk_main_quit), NULL); 176 177 gtk_window_set_title(GTK_WINDOW (window), "progressbar"); 178 179 gtk_container_set_border_width(GTK_CONTAINER (window), 15); 180 181 /* 創建一個垂直組裝盒 */ 182 183 vbox = gtk_vbox_new(FALSE, 0); 184 185 gtk_container_add(GTK_CONTAINER(window), vbox); 186 187 /* 創建進度條構件 */ 188 189 pbar = gtk_progress_bar_new(); 190 191 gtk_progress_bar_set_bar_style( /* 設置進度條構件更新方式 */ 192 193 GTK_PROGRESS_BAR(pbar), GTK_PROGRESS_CONTINUOUS); 194 195 gtk_progress_set_format_string( /* 如果顯示文本,指定其格式 */ 196 197 GTK_PROGRESS(pbar), "%p"); 198 199 gtk_timeout_add (100, progress, pbar); /* 對進度條進行連續更新,間隔時間為0.1s */ 200 201 gtk_box_pack_start(GTK_BOX(vbox), pbar, TRUE, TRUE, 0); 202 203 /* 創建一個水平組裝盒 */ 204 205 hbox = gtk_hbox_new(FALSE, 0); 206 207 gtk_container_add(GTK_CONTAINER(vbox), hbox); 208 209 /* 創建顯示文本復選按鈕 */ 210 211 check = gtk_check_button_new_with_label("Show Text"); 212 213 gtk_signal_connect(GTK_OBJECT(check), "toggled", 214 215 GTK_SIGNAL_FUNC(show_toggle), pbar); 216 217 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE); 218 219 gtk_box_pack_start(GTK_BOX(hbox), check, TRUE, TRUE, 0); 220 221 /* 創建一個水平組裝盒 */ 222 223 hbox = gtk_hbox_new(FALSE, 0); 224 225 gtk_container_add(GTK_CONTAINER(vbox), hbox); 226 227 /* 創建開始按鈕 */ 228 229 button = gtk_button_new_with_label("start"); 230 231 gtk_signal_connect(GTK_OBJECT(button), "clicked", 232 233 G_CALLBACK(start_event), pbar); 234 235 gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0); 236 237 /* 創建暫停按鈕 */ 238 239 button = gtk_button_new_with_label("Pause"); 240 241 gtk_signal_connect(GTK_OBJECT(button), "clicked", 242 243 G_CALLBACK(pause_event), NULL); 244 245 gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0); 246 247 /* 創建停止按鈕 */ 248 249 button = gtk_button_new_with_label("Stop"); 250 251 gtk_signal_connect(GTK_OBJECT(button), "clicked", 252 253 G_CALLBACK(stop_event), NULL); 254 255 gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0); 256 257 /* 創建關閉按鈕 */ 258 259 button = gtk_button_new_with_label("Close"); 260 261 gtk_signal_connect(GTK_OBJECT(button), "clicked", 262 263 G_CALLBACK(delete_event), NULL); 264 265 gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0); 266 267 /* 顯示所有構件 */ 268 269 gtk_widget_show_all(window); 270 271 /* 事件循環 */ 272 273 gtk_main(); 274 275 return 0; 276 277 }?
?
6???????? 組合框
組合框構件(GtkCombo)在應用程序中經常用到,它包含一個文本輸入框和一個下拉列表,用戶可以在下拉列表中進行選擇,也可以在文本框中直接輸入文本。
?
1 /* combo.c */ 2 3 #include <gtk/gtk.h> 4 5 #define N 16 6 7 typedef struct _Calculate /* 定義結構體,用來向回調函數傳遞參數 */ 8 9 { 10 11 GtkWidget *entry1; 12 13 GtkWidget *entry2; 14 15 GtkWidget *combo; 16 17 GtkWidget *label; 18 19 } Calculate; 20 21 22 23 gint cal_event(GtkWidget *widget, Calculate *cal) /* 計算按鈕回調函數 */ 24 25 { 26 27 const gchar *text1, *text2; 28 29 const char *options; 30 31 gchar result[N]; 32 33 char operator; 34 35 gint x, y, z; 36 37 gint flag; 38 39 text1 = gtk_entry_get_text( /* 獲取文本輸入構件中的字符串 */ 40 41 GTK_ENTRY(cal->entry1)); 42 43 x = atoi(text1); /* 將得到的字符串轉換為整數 */ 44 45 text2 = gtk_entry_get_text( /* 獲取文本輸入構件中的字符串 */ 46 47 GTK_ENTRY(cal->entry2)); 48 49 y = atoi(text2); /* 將得到的字符串轉換為整數 */ 50 51 options = gtk_entry_get_text( /* 獲取組合框構件中用戶選擇的字符串 */ 52 53 GTK_ENTRY(GTK_COMBO(cal->combo)->entry)); 54 55 operator = *options; /* 提取運算符 */ 56 57 flag = 0; /* 出錯標志,用于后面的錯誤檢測 */ 58 59 switch (operator) /* 對兩個操作數進行運算 */ 60 61 { 62 63 case '+': /* 加法運算 */ 64 65 z = x + y; 66 67 break; 68 69 case '-': /* 減法運算 */ 70 71 z = x - y; 72 73 break; 74 75 case 'x': /* 乘法運算 */ 76 77 z = x * y; 78 79 break; 80 81 case '/': /* 除法運算 */ 82 83 if(0 == y) /* 除數為0時,設置出錯標志 */ 84 85 flag = 1; 86 87 else 88 89 z = x / y; 90 91 break; 92 93 case '%': /* 取余運算 */ 94 95 if(0 == y) /* 除數為0時,設置出錯標志 */ 96 97 flag = 1; 98 99 else 100 101 z = x % y; 102 103 break; 104 105 default: /* 其余情況,設置出錯標志 */ 106 107 flag = 1; 108 109 } 110 111 if(1 == flag) /* 檢測出錯標志 */ 112 113 g_sprintf(result, "error"); 114 115 else 116 117 g_sprintf(result, "%d", z); /* 將運算結果轉換為字符串 */ 118 119 gtk_label_set_text(GTK_LABEL(cal->label), result); /* 輸出運算結果或出錯提示 */ 120 121 return TRUE; 122 123 } 124 125 126 127 gint close_event(GtkWidget *widget, /* 關閉按鈕回調函數 */ 128 129 GdkEvent *event, gpointer data) 130 131 { 132 133 gtk_main_quit(); 134 135 return TRUE; 136 137 } 138 139 140 141 int main(int argc, char **argv) /* 主函數 */ 142 143 { 144 145 Calculate *cal; 146 147 GtkWidget *window; 148 149 GtkWidget *table; 150 151 GtkWidget *label; 152 153 GtkWidget *button; 154 155 156 157 gtk_init(&argc, &argv); /* 初始化 */ 158 159 /* 創建主窗口 */ 160 161 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 162 163 gtk_signal_connect(GTK_OBJECT(window), "destroy", 164 165 GTK_SIGNAL_FUNC(gtk_main_quit), NULL); 166 167 gtk_window_set_title(GTK_WINDOW (window), "combo"); 168 169 gtk_container_set_border_width(GTK_CONTAINER (window), 15); 170 171 /* 創建一個6x2的網格 */ 172 173 table = gtk_table_new(6, 2, TRUE); 174 175 gtk_container_add( /* 將網格添加到主窗口之中 */ 176 177 GTK_CONTAINER (window), table); 178 179 /* 創建一個文本輸入構件,用于操作數輸入 */ 180 181 cal->entry1 = gtk_entry_new(); 182 183 gtk_table_attach_defaults( /* 將文本輸入構件放到網格之中 */ 184 185 GTK_TABLE (table), cal->entry1, 0, 2, 0, 1); 186 187 /* 創建一個組合框構件,用于操作符選擇 */ 188 189 cal->combo = gtk_combo_new(); 190 191 GList *glist=NULL; /* 定義Glist鏈表 */ 192 193 glist = g_list_append(glist, "+"); /* 向Glist鏈表中追加字符串 */ 194 195 glist = g_list_append(glist, "-"); 196 197 glist = g_list_append(glist, "x"); 198 199 glist = g_list_append(glist, "/"); 200 201 glist = g_list_append(glist, "%"); 202 203 gtk_combo_set_popdown_strings( /* 設置下拉列表中選項 */ 204 205 GTK_COMBO(cal->combo), glist); 206 207 gtk_entry_set_text(GTK_ENTRY( /* 文本輸入框中顯示文本 */ 208 209 GTK_COMBO(cal->combo)->entry), "operator"); 210 211 gtk_table_attach_defaults ( /* 將組合框構件放到網格之中 */ 212 213 GTK_TABLE (table), cal->combo, 0, 2, 1, 2); 214 215 /* 創建一個文本輸入構件,用于操作數輸入 */ 216 217 cal->entry2 = gtk_entry_new(); 218 219 gtk_table_attach_defaults ( /* 將文本輸入構件放到網格之中 */ 220 221 GTK_TABLE (table),cal->entry2, 0, 2, 2, 3); 222 223 /* 創建計算按鈕 */ 224 225 button = gtk_button_new_with_label("Calulate"); 226 227 gtk_signal_connect(GTK_OBJECT(button), "clicked", 228 229 G_CALLBACK(cal_event), cal); 230 231 gtk_table_attach_defaults ( /* 將按鈕構件放到網格之中 */ 232 233 GTK_TABLE (table), button, 0, 2, 3, 4); 234 235 /* 創建一個標簽構件 */ 236 237 label = gtk_label_new("Result : "); 238 239 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); 240 241 gtk_table_attach_defaults ( /* 將標簽構件放到網格之中 */ 242 243 GTK_TABLE (table), label, 0, 1, 4, 5); 244 245 /* 創建一個標簽構件,用于計算結果顯示 */ 246 247 cal->label = gtk_label_new(" "); 248 249 gtk_label_set_justify(GTK_LABEL(cal->label), GTK_JUSTIFY_CENTER); 250 251 gtk_table_attach_defaults ( /* 將標簽構件放到網格之中 */ 252 253 GTK_TABLE (table), cal->label, 1, 2, 4, 5); 254 255 /* 創建關閉按鈕 */ 256 257 button = gtk_button_new_with_label("Close"); 258 259 gtk_signal_connect(GTK_OBJECT(button), "clicked", 260 261 G_CALLBACK(close_event), NULL); 262 263 gtk_table_attach_defaults ( /* 將按鈕構件放到網格之中 */ 264 265 GTK_TABLE (table), button, 1, 2, 5, 6); 266 267 /* 顯示所有構件 */ 268 269 gtk_widget_show_all(window); 270 271 /* 事件循環 */ 272 273 gtk_main(); 274 275 return 0; 276 277 }?
?
7???????? 對話框
對話框(GtkDialog)主要用來彈出消息,或完成一些類似任務
?
1 /* dialog.c */ 2 3 #include <gtk/gtk.h> 4 5 #define N 64 6 7 gint yes_callback(GtkWidget *widget, gpointer data) /* yes按鈕回調函數 */ 8 9 { 10 11 gtk_main_quit(); 12 13 return TRUE; 14 15 } 16 17 18 19 gint no_callback(GtkWidget *widget, gpointer data) /* no按鈕回調函數 */ 20 21 { 22 23 gchar text[N]; 24 25 static gint i; /* 紀錄按鈕按下的次數 */ 26 27 i++; 28 29 g_sprintf(text, "\"No\" button clicked %d times.", i); 30 31 gtk_label_set_text(GTK_LABEL(data), text); /* 設置標簽構件顯示的文本 */ 32 33 return TRUE; 34 35 } 36 37 38 39 int main(int argc, char **argv) /* 主函數 */ 40 41 { 42 43 GtkWidget *window; 44 45 GtkWidget *label; 46 47 GtkWidget *button; 48 49 gtk_init(&argc, &argv); /* 初始化 */ 50 51 /* 創建對話框 */ 52 53 window = gtk_dialog_new(); 54 55 /* 創建并添加標簽構件 */ 56 57 label = gtk_label_new("\nDo you want to exit?\n"); 58 59 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); 60 61 gtk_box_pack_start( /* 添加到對話框上方的垂直組裝盒中 */ 62 63 GTK_BOX (GTK_DIALOG (window)->vbox), label, TRUE, TRUE, 0); 64 65 /* 創建并添加標簽構件 */ 66 67 label = gtk_label_new(" "); 68 69 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER); 70 71 gtk_box_pack_start( /* 添加到對話框上方的垂直組裝盒中 */ 72 73 GTK_BOX (GTK_DIALOG (window)->vbox), label, TRUE, TRUE, 0); 74 75 /* 創建并添加按鈕構件 */ 76 77 button = gtk_button_new_with_label("Yes"); 78 79 gtk_signal_connect( /* 設置回調函數 */ 80 81 GTK_OBJECT(button), "clicked", G_CALLBACK(yes_callback), NULL); 82 83 gtk_box_pack_start( /* 添加到對話框下方的活動區域中 */ 84 85 GTK_BOX(GTK_DIALOG (window)->action_area), button, TRUE, TRUE, 0); 86 87 /* 創建并添加按鈕構件 */ 88 89 button = gtk_button_new_with_label("No"); 90 91 gtk_signal_connect( /* 設置回調函數 */ 92 93 GTK_OBJECT(button), "clicked", G_CALLBACK(no_callback), label); 94 95 gtk_box_pack_start( /* 添加到對話框下方的活動區域中 */ 96 97 GTK_BOX(GTK_DIALOG (window)->action_area), button, TRUE, TRUE, 0); 98 99 /* 顯示所有構件 */ 100 101 gtk_widget_show_all(window); 102 103 /* 事件循環 */ 104 105 gtk_main(); 106 107 return 0; 108 109 }?
?
1 /* aboutdialog.c */ 2 3 #include <gtk/gtk.h> 4 5 #include <libgnomeui/gnome-about.h> /* 注意包含該頭文件 */ 6 7 #define N 64 8 9 10 11 gint about_callback(GtkWidget *widget, gpointer data) /* 關于按鈕回調函數 */ 12 13 { 14 15 GtkWidget *about; 16 17 const gchar *authors[] = { /* 軟件作者信息 */ 18 19 "Xxxxxx Xxx <xxxxxx@kernel.org>", 20 21 "Xxxxxx Xxx <xxxxxx@gnome.org>", 22 23 "Xxxxxx Xxx <xxxxxx@gnome.org>", 24 25 NULL 26 27 }; 28 29 const gchar *documenters[] = { /* 文檔作者信息 */ 30 31 "Xxxxxx Xxx <xxxxxx@gnome.org>", 32 33 NULL 34 35 }; 36 37 about = gnome_about_new ("XXXX", "1.00", /* 創建Gnome關于對話框 */ 38 39 "(C) 2009 the Free Software Foundation", 40 41 "comments ... ", 42 43 authors, 44 45 documenters, 46 47 NULL, 48 49 NULL) ; 50 51 gtk_widget_show(about); /* 顯示Gnome關于對話框 */ 52 53 return TRUE; 54 55 } 56 57 58 59 gint close_callback(GtkWidget *widget, gpointer data) /* 關閉按鈕回調函數 */ 60 61 { 62 63 gtk_main_quit(); 64 65 return TRUE; 66 67 } 68 69 70 71 int main(int argc, char **argv) /* 主函數 */ 72 73 { 74 75 GtkWidget *window; 76 77 GtkWidget *vbox; 78 79 GtkWidget *button; 80 81 82 83 gtk_init(&argc, &argv); /* 初始化 */ 84 85 /* 創建主窗口 */ 86 87 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 88 89 gtk_signal_connect(GTK_OBJECT(window), "destroy", 90 91 GTK_SIGNAL_FUNC(gtk_main_quit), NULL); 92 93 gtk_window_set_title(GTK_WINDOW (window), "combo"); 94 95 gtk_container_set_border_width(GTK_CONTAINER (window), 15); 96 97 /* 創建一個垂直組裝盒 */ 98 99 vbox = gtk_vbox_new(FALSE, 0); 100 101 gtk_container_add(GTK_CONTAINER(window), vbox); 102 103 /* 創建關于按鈕 */ 104 105 button = gtk_button_new_with_label("About"); 106 107 gtk_signal_connect(GTK_OBJECT(button), "clicked", 108 109 G_CALLBACK(about_callback), NULL); 110 111 gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0); 112 113 /* 創建關閉按鈕 */ 114 115 button = gtk_button_new_with_label("Close"); 116 117 gtk_signal_connect(GTK_OBJECT(button), "clicked", 118 119 G_CALLBACK(close_callback), NULL); 120 121 gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0); 122 123 /* 顯示所有構件 */ 124 125 gtk_widget_show_all(window); 126 127 /* 事件循環 */ 128 129 gtk_main(); 130 131 return 0; 132 133 }?
?
三? GUI生成器Glade
Glade是針對GTK+/Gnome快速圖形界面開發的應用軟件,它類似于Microsoft Windows環境下的VB、VC++以及Delphi等。Glade的可視化編程可以使程序員的主要精力集中于應用程序核心功能的開發上,而不需為界面的修改重復編寫大量煩瑣的Gtk+函數。
1???????? 打開Glade
Linux系統啟動圖形界面之后,在終端上輸入glade或在桌面上單擊【Application】|【Programming】|【Glade Interface Designer】命令,即可啟動Glade。一般能看到3個窗口:工程管理窗口、常用構件窗口和屬性管理窗口。
?
2???????? 創建應用程序界面
在創建應用程序界面之前,首先新建一個工程項目。單擊工程管理窗口上方的【New】按鈕,會彈出新建Project對話框。
1).創建一個新的窗口
2).在窗口中添加各種構件
3).為構件的信號連接回調函數
4).生成創建應用程序界面的源代碼
?
3???????? 編譯連接程序
Glade中使用Automake工具,可以根據編譯選項自動生成Makefile文件。
?
四? 常見面試題
常見面試題1:簡述編寫GTK+應用程序的一般步驟。
?
常見面試題2:Glade的可視化編程與Microsoft Windows環境下的VB、VC++以及Delphi等工具有何差異?
?
五 小結
在Linux系統中,基于GTK+構件的應用程序圖形界面,執行效率高,占用資源少,有著很好的發展前景。這一章主要介紹了GTK+編程的基本知識,通過本章的學習,讀者應該能夠編寫基本的圖形界面應用程序。由于篇幅有限,這里只介紹了很少一部分GTK+構件。
轉載于:https://www.cnblogs.com/zeedmood/archive/2012/04/09/2439359.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的嵌入式成长轨迹23 【Linux应用编程强化】【Linux下的C编程 下】【Linux GUI编程】...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开启MSDTC的方法
- 下一篇: MYSQL delete语句不支持别名?