嵌入式成长轨迹23 【Linux应用编程强化】【Linux下的C编程 下】【Linux GUI编程】...
?
?
一 ??GTK+/Gnome開(kāi)發(fā)簡(jiǎn)介
GTK+是一個(gè)用于創(chuàng)建圖形用戶界面(GUI)的圖形庫(kù),它在功能上類似微軟的MFC,為應(yīng)用程序提供了一套與平臺(tái)無(wú)關(guān)的圖形用戶接口。GTK+最初用于開(kāi)發(fā)GIMP(General Image Manipulation Program),因而稱為GTK(GIMP Toolkit)。
?
1???????? 第一個(gè)GTK+應(yīng)用程序
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???????? 信號(hào)連接回調(diào)函數(shù)
#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+構(gòu)件
GTK+中的構(gòu)件非常豐富,這一節(jié)主要介紹其中部分常用的構(gòu)件,例如按鈕、標(biāo)簽、對(duì)話框等。下面首先討論構(gòu)件的定位。
1???????? 構(gòu)件定位
在用GTK+構(gòu)件創(chuàng)建程序界面時(shí),使用容器來(lái)實(shí)現(xiàn)構(gòu)件的定位。GTK+中有兩種容器,其中一種只能容納一個(gè)子構(gòu)件,例如GtkWindow;而另外一種則可以容納多個(gè)子構(gòu)件,例如GtkHBox、GtkVBox以及GtkTable等。
1).GtkWindow構(gòu)件
?????? 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構(gòu)件
?????? 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構(gòu)件
?????? 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? 按鈕構(gòu)件
1).普通按鈕(GtkButton)
GtkWidget* gtk_button_new(void);
GtkWidget* gtk_button_new_with_label(const gchar *label);
2).開(kāi)關(guān)按鈕(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).復(fù)選按鈕(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) /* 主函數(shù) */ 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); /* 創(chuàng)建主窗口 */ 32 33 /* 為delete_event事件連接一個(gè)回調(diào)函數(shù) */ 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"); /* 設(shè)置窗口的標(biāo)題 */ 40 41 gtk_container_set_border_width(GTK_CONTAINER (window), 15); /* 設(shè)置窗口的邊框?qū)挾?*/ 42 43 /* 創(chuàng)建一個(gè)垂直組裝盒 */ 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 /* 創(chuàng)建第一個(gè)單選按鈕 */ 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)); /* 創(chuàng)建按鈕組 */ 60 61 /* 創(chuàng)建第二個(gè)單選按鈕 */ 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 /* 創(chuàng)建第三個(gè)單選按鈕 */ 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 /* 事件循環(huán) */ 82 83 gtk_main(); 84 85 return 0; 86 87 }?
?
?
3???????? 標(biāo)簽構(gòu)件
標(biāo)簽(GtkLabel)也是應(yīng)用程序中經(jīng)常使用的一種構(gòu)件。
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:左對(duì)齊
GTK_JUSTIFY_RIGHT:右對(duì)齊
GTK_JUSTIFY_CENTER:居中對(duì)齊(默認(rèn))
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); /* 創(chuàng)建主窗口 */ 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"); /* 設(shè)置窗口的標(biāo)題 */ 24 25 gtk_container_set_border_width(GTK_CONTAINER (window), 15); /* 設(shè)置窗口的邊框?qū)挾?*/ 26 27 /* 創(chuàng)建一個(gè)垂直組裝盒 */ 28 29 vbox = gtk_vbox_new(FALSE, 0); 30 31 gtk_container_add(GTK_CONTAINER(window), vbox); /* 添加到主窗口之中 */ 32 33 /* 創(chuàng)建第一個(gè)標(biāo)簽 */ 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 /* 創(chuàng)建第二個(gè)標(biāo)簽 */ 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 /* 顯示所有構(gòu)件 */ 50 51 gtk_widget_show_all(window); 52 53 /* 事件循環(huán) */ 54 55 gtk_main(); 56 57 return 0; 58 59 }?
?
?
4???????? 文本及文本輸入構(gòu)件
文本構(gòu)件和文本輸入構(gòu)件是兩個(gè)比較常用的構(gòu)件,用于顯示和編輯文本。
1).文本構(gòu)件
2).文本輸入構(gòu)件
?
1 /* text.c */ 2 3 #include <gtk/gtk.h> 4 5 void editable_toggle(GtkWidget *widget, GtkWidget *text) /* 復(fù)選框回調(diào)函數(shù) */ 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, /* 退出按鈕回調(diào)函數(shù) */ 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) /* 主函數(shù) */ 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 /* 創(chuàng)建主窗口 */ 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 /* 創(chuàng)建一個(gè)垂直組裝盒 */ 60 61 vbox = gtk_vbox_new(FALSE, 0); 62 63 gtk_container_add(GTK_CONTAINER(window), vbox); 64 65 /* 創(chuàng)建一個(gè)文本構(gòu)件 */ 66 67 text = gtk_text_new(NULL, NULL); 68 69 gtk_text_insert(text, NULL, NULL, /* 插入文本使用系統(tǒng)默認(rèn)字體和顏色*/ 70 71 NULL, "Source Code :", -1); 72 73 gtk_box_pack_start(GTK_BOX(vbox), text, TRUE, TRUE, 0); 74 75 /* 創(chuàng)建一個(gè)水平組裝盒 */ 76 77 hbox = gtk_hbox_new(FALSE, 0); 78 79 gtk_container_add(GTK_CONTAINER(vbox), hbox); 80 81 /* 創(chuàng)建一個(gè)復(fù)選按鈕 */ 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 /* 創(chuàng)建退出按鈕 */ 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 /* 顯示所有構(gòu)件 */ 104 105 gtk_widget_show_all(window); 106 107 /* 事件循環(huán) */ 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) /* 回調(diào)函數(shù) */ 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) /* 主函數(shù) */ 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 /* 創(chuàng)建主窗口 */ 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 /* 創(chuàng)建一個(gè)垂直組裝盒 */ 64 65 vbox = gtk_vbox_new(FALSE, 0); 66 67 gtk_container_add(GTK_CONTAINER(window), vbox); 68 69 /* 創(chuàng)建一個(gè)文本輸入構(gòu)件 */ 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 /* 創(chuàng)建一個(gè)水平組裝盒 */ 78 79 hbox = gtk_hbox_new(FALSE, 0); 80 81 gtk_container_add(GTK_CONTAINER(vbox), hbox); 82 83 /* 創(chuàng)建一個(gè)復(fù)選按鈕 */ 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 /* 創(chuàng)建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 /* 顯示所有構(gòu)件 */ 102 103 gtk_widget_show_all(window); 104 105 /* 事件循環(huán) */ 106 107 gtk_main(); 108 109 return 0; 110 111 }?
?
5???????? 進(jìn)度條構(gòu)件
進(jìn)度條構(gòu)件(GtkProgressBar)一般用來(lái)顯示應(yīng)用程序中某個(gè)操作的狀態(tài)。
?
1 /* progressbar.c */ 2 3 #include <gtk/gtk.h> 4 5 gint started; /* 狀態(tài)標(biāo)志 */ 6 7 gint paused; 8 9 gint progress(gpointer data ) /* 更新進(jìn)度條 */ 10 11 { 12 13 gfloat i; 14 15 GtkAdjustment *adj; /* 調(diào)整對(duì)象 */ 16 17 i = gtk_progress_get_value(GTK_PROGRESS(data)); /* 獲取進(jìn)度條的當(dāng)前值 */ 18 19 if(0 == started) /* 判斷進(jìn)度更新是否被停止 */ 20 21 { 22 23 if(0 == paused) /* 判斷進(jìn)度更新是否被暫停 */ 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); /* 更新進(jìn)度條 */ 54 55 return (TRUE ) ; 56 57 } 58 59 60 61 void show_toggle(GtkWidget *widget, GtkWidget *pbar) /* 顯示文本復(fù)選框回調(diào)函數(shù) */ 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) /* 開(kāi)始按鈕回調(diào)函數(shù) */ 74 75 { 76 77 gfloat i; 78 79 i = gtk_progress_get_value(GTK_PROGRESS(pbar)); /* 獲取進(jìn)度條的當(dāng)前值 */ 80 81 if(100 == i) 82 83 { 84 85 started = 0; /* 設(shè)置狀態(tài)標(biāo)志*/ 86 87 paused = 0; 88 89 } 90 91 return TRUE; 92 93 } 94 95 96 97 gint pause_event(GtkWidget *widget, gpointer data) /* 暫停按鈕回調(diào)函數(shù) */ 98 99 { 100 101 if(0 == paused) /* 判斷是否已經(jīng)暫停 */ 102 103 { 104 105 paused = 1; 106 107 } 108 109 else /* 如果已經(jīng)暫停,則取消暫停 */ 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) /* 停止按鈕回調(diào)函數(shù) */ 124 125 { 126 127 started = 1; /* 設(shè)置狀態(tài)標(biāo)志*/ 128 129 paused = 1; 130 131 return TRUE; 132 133 } 134 135 136 137 gint delete_event(GtkWidget *widget, /* 關(guān)閉按鈕回調(diào)函數(shù) */ 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) /* 主函數(shù) */ 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 /* 創(chuàng)建主窗口 */ 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 /* 創(chuàng)建一個(gè)垂直組裝盒 */ 182 183 vbox = gtk_vbox_new(FALSE, 0); 184 185 gtk_container_add(GTK_CONTAINER(window), vbox); 186 187 /* 創(chuàng)建進(jìn)度條構(gòu)件 */ 188 189 pbar = gtk_progress_bar_new(); 190 191 gtk_progress_bar_set_bar_style( /* 設(shè)置進(jìn)度條構(gòu)件更新方式 */ 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); /* 對(duì)進(jìn)度條進(jìn)行連續(xù)更新,間隔時(shí)間為0.1s */ 200 201 gtk_box_pack_start(GTK_BOX(vbox), pbar, TRUE, TRUE, 0); 202 203 /* 創(chuàng)建一個(gè)水平組裝盒 */ 204 205 hbox = gtk_hbox_new(FALSE, 0); 206 207 gtk_container_add(GTK_CONTAINER(vbox), hbox); 208 209 /* 創(chuàng)建顯示文本復(fù)選按鈕 */ 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 /* 創(chuàng)建一個(gè)水平組裝盒 */ 222 223 hbox = gtk_hbox_new(FALSE, 0); 224 225 gtk_container_add(GTK_CONTAINER(vbox), hbox); 226 227 /* 創(chuàng)建開(kāi)始按鈕 */ 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 /* 創(chuàng)建暫停按鈕 */ 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 /* 創(chuàng)建停止按鈕 */ 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 /* 創(chuàng)建關(guān)閉按鈕 */ 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 /* 顯示所有構(gòu)件 */ 268 269 gtk_widget_show_all(window); 270 271 /* 事件循環(huán) */ 272 273 gtk_main(); 274 275 return 0; 276 277 }?
?
6???????? 組合框
組合框構(gòu)件(GtkCombo)在應(yīng)用程序中經(jīng)常用到,它包含一個(gè)文本輸入框和一個(gè)下拉列表,用戶可以在下拉列表中進(jìn)行選擇,也可以在文本框中直接輸入文本。
?
1 /* combo.c */ 2 3 #include <gtk/gtk.h> 4 5 #define N 16 6 7 typedef struct _Calculate /* 定義結(jié)構(gòu)體,用來(lái)向回調(diào)函數(shù)傳遞參數(shù) */ 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) /* 計(jì)算按鈕回調(diào)函數(shù) */ 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( /* 獲取文本輸入構(gòu)件中的字符串 */ 40 41 GTK_ENTRY(cal->entry1)); 42 43 x = atoi(text1); /* 將得到的字符串轉(zhuǎn)換為整數(shù) */ 44 45 text2 = gtk_entry_get_text( /* 獲取文本輸入構(gòu)件中的字符串 */ 46 47 GTK_ENTRY(cal->entry2)); 48 49 y = atoi(text2); /* 將得到的字符串轉(zhuǎn)換為整數(shù) */ 50 51 options = gtk_entry_get_text( /* 獲取組合框構(gòu)件中用戶選擇的字符串 */ 52 53 GTK_ENTRY(GTK_COMBO(cal->combo)->entry)); 54 55 operator = *options; /* 提取運(yùn)算符 */ 56 57 flag = 0; /* 出錯(cuò)標(biāo)志,用于后面的錯(cuò)誤檢測(cè) */ 58 59 switch (operator) /* 對(duì)兩個(gè)操作數(shù)進(jìn)行運(yùn)算 */ 60 61 { 62 63 case '+': /* 加法運(yùn)算 */ 64 65 z = x + y; 66 67 break; 68 69 case '-': /* 減法運(yùn)算 */ 70 71 z = x - y; 72 73 break; 74 75 case 'x': /* 乘法運(yùn)算 */ 76 77 z = x * y; 78 79 break; 80 81 case '/': /* 除法運(yùn)算 */ 82 83 if(0 == y) /* 除數(shù)為0時(shí),設(shè)置出錯(cuò)標(biāo)志 */ 84 85 flag = 1; 86 87 else 88 89 z = x / y; 90 91 break; 92 93 case '%': /* 取余運(yùn)算 */ 94 95 if(0 == y) /* 除數(shù)為0時(shí),設(shè)置出錯(cuò)標(biāo)志 */ 96 97 flag = 1; 98 99 else 100 101 z = x % y; 102 103 break; 104 105 default: /* 其余情況,設(shè)置出錯(cuò)標(biāo)志 */ 106 107 flag = 1; 108 109 } 110 111 if(1 == flag) /* 檢測(cè)出錯(cuò)標(biāo)志 */ 112 113 g_sprintf(result, "error"); 114 115 else 116 117 g_sprintf(result, "%d", z); /* 將運(yùn)算結(jié)果轉(zhuǎn)換為字符串 */ 118 119 gtk_label_set_text(GTK_LABEL(cal->label), result); /* 輸出運(yùn)算結(jié)果或出錯(cuò)提示 */ 120 121 return TRUE; 122 123 } 124 125 126 127 gint close_event(GtkWidget *widget, /* 關(guān)閉按鈕回調(diào)函數(shù) */ 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) /* 主函數(shù) */ 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 /* 創(chuàng)建主窗口 */ 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 /* 創(chuàng)建一個(gè)6x2的網(wǎng)格 */ 172 173 table = gtk_table_new(6, 2, TRUE); 174 175 gtk_container_add( /* 將網(wǎng)格添加到主窗口之中 */ 176 177 GTK_CONTAINER (window), table); 178 179 /* 創(chuàng)建一個(gè)文本輸入構(gòu)件,用于操作數(shù)輸入 */ 180 181 cal->entry1 = gtk_entry_new(); 182 183 gtk_table_attach_defaults( /* 將文本輸入構(gòu)件放到網(wǎng)格之中 */ 184 185 GTK_TABLE (table), cal->entry1, 0, 2, 0, 1); 186 187 /* 創(chuàng)建一個(gè)組合框構(gòu)件,用于操作符選擇 */ 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( /* 設(shè)置下拉列表中選項(xiàng) */ 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 ( /* 將組合框構(gòu)件放到網(wǎng)格之中 */ 212 213 GTK_TABLE (table), cal->combo, 0, 2, 1, 2); 214 215 /* 創(chuàng)建一個(gè)文本輸入構(gòu)件,用于操作數(shù)輸入 */ 216 217 cal->entry2 = gtk_entry_new(); 218 219 gtk_table_attach_defaults ( /* 將文本輸入構(gòu)件放到網(wǎng)格之中 */ 220 221 GTK_TABLE (table),cal->entry2, 0, 2, 2, 3); 222 223 /* 創(chuàng)建計(jì)算按鈕 */ 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 ( /* 將按鈕構(gòu)件放到網(wǎng)格之中 */ 232 233 GTK_TABLE (table), button, 0, 2, 3, 4); 234 235 /* 創(chuàng)建一個(gè)標(biāo)簽構(gòu)件 */ 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 ( /* 將標(biāo)簽構(gòu)件放到網(wǎng)格之中 */ 242 243 GTK_TABLE (table), label, 0, 1, 4, 5); 244 245 /* 創(chuàng)建一個(gè)標(biāo)簽構(gòu)件,用于計(jì)算結(jié)果顯示 */ 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 ( /* 將標(biāo)簽構(gòu)件放到網(wǎng)格之中 */ 252 253 GTK_TABLE (table), cal->label, 1, 2, 4, 5); 254 255 /* 創(chuàng)建關(guān)閉按鈕 */ 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 ( /* 將按鈕構(gòu)件放到網(wǎng)格之中 */ 264 265 GTK_TABLE (table), button, 1, 2, 5, 6); 266 267 /* 顯示所有構(gòu)件 */ 268 269 gtk_widget_show_all(window); 270 271 /* 事件循環(huán) */ 272 273 gtk_main(); 274 275 return 0; 276 277 }?
?
7???????? 對(duì)話框
對(duì)話框(GtkDialog)主要用來(lái)彈出消息,或完成一些類似任務(wù)
?
1 /* dialog.c */ 2 3 #include <gtk/gtk.h> 4 5 #define N 64 6 7 gint yes_callback(GtkWidget *widget, gpointer data) /* yes按鈕回調(diào)函數(shù) */ 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按鈕回調(diào)函數(shù) */ 20 21 { 22 23 gchar text[N]; 24 25 static gint i; /* 紀(jì)錄按鈕按下的次數(shù) */ 26 27 i++; 28 29 g_sprintf(text, "\"No\" button clicked %d times.", i); 30 31 gtk_label_set_text(GTK_LABEL(data), text); /* 設(shè)置標(biāo)簽構(gòu)件顯示的文本 */ 32 33 return TRUE; 34 35 } 36 37 38 39 int main(int argc, char **argv) /* 主函數(shù) */ 40 41 { 42 43 GtkWidget *window; 44 45 GtkWidget *label; 46 47 GtkWidget *button; 48 49 gtk_init(&argc, &argv); /* 初始化 */ 50 51 /* 創(chuàng)建對(duì)話框 */ 52 53 window = gtk_dialog_new(); 54 55 /* 創(chuàng)建并添加標(biāo)簽構(gòu)件 */ 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( /* 添加到對(duì)話框上方的垂直組裝盒中 */ 62 63 GTK_BOX (GTK_DIALOG (window)->vbox), label, TRUE, TRUE, 0); 64 65 /* 創(chuàng)建并添加標(biāo)簽構(gòu)件 */ 66 67 label = gtk_label_new(" "); 68 69 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER); 70 71 gtk_box_pack_start( /* 添加到對(duì)話框上方的垂直組裝盒中 */ 72 73 GTK_BOX (GTK_DIALOG (window)->vbox), label, TRUE, TRUE, 0); 74 75 /* 創(chuàng)建并添加按鈕構(gòu)件 */ 76 77 button = gtk_button_new_with_label("Yes"); 78 79 gtk_signal_connect( /* 設(shè)置回調(diào)函數(shù) */ 80 81 GTK_OBJECT(button), "clicked", G_CALLBACK(yes_callback), NULL); 82 83 gtk_box_pack_start( /* 添加到對(duì)話框下方的活動(dòng)區(qū)域中 */ 84 85 GTK_BOX(GTK_DIALOG (window)->action_area), button, TRUE, TRUE, 0); 86 87 /* 創(chuàng)建并添加按鈕構(gòu)件 */ 88 89 button = gtk_button_new_with_label("No"); 90 91 gtk_signal_connect( /* 設(shè)置回調(diào)函數(shù) */ 92 93 GTK_OBJECT(button), "clicked", G_CALLBACK(no_callback), label); 94 95 gtk_box_pack_start( /* 添加到對(duì)話框下方的活動(dòng)區(qū)域中 */ 96 97 GTK_BOX(GTK_DIALOG (window)->action_area), button, TRUE, TRUE, 0); 98 99 /* 顯示所有構(gòu)件 */ 100 101 gtk_widget_show_all(window); 102 103 /* 事件循環(huán) */ 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) /* 關(guān)于按鈕回調(diào)函數(shù) */ 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", /* 創(chuàng)建Gnome關(guān)于對(duì)話框 */ 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關(guān)于對(duì)話框 */ 52 53 return TRUE; 54 55 } 56 57 58 59 gint close_callback(GtkWidget *widget, gpointer data) /* 關(guān)閉按鈕回調(diào)函數(shù) */ 60 61 { 62 63 gtk_main_quit(); 64 65 return TRUE; 66 67 } 68 69 70 71 int main(int argc, char **argv) /* 主函數(shù) */ 72 73 { 74 75 GtkWidget *window; 76 77 GtkWidget *vbox; 78 79 GtkWidget *button; 80 81 82 83 gtk_init(&argc, &argv); /* 初始化 */ 84 85 /* 創(chuàng)建主窗口 */ 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 /* 創(chuàng)建一個(gè)垂直組裝盒 */ 98 99 vbox = gtk_vbox_new(FALSE, 0); 100 101 gtk_container_add(GTK_CONTAINER(window), vbox); 102 103 /* 創(chuàng)建關(guān)于按鈕 */ 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 /* 創(chuàng)建關(guān)閉按鈕 */ 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 /* 顯示所有構(gòu)件 */ 124 125 gtk_widget_show_all(window); 126 127 /* 事件循環(huán) */ 128 129 gtk_main(); 130 131 return 0; 132 133 }?
?
三? GUI生成器Glade
Glade是針對(duì)GTK+/Gnome快速圖形界面開(kāi)發(fā)的應(yīng)用軟件,它類似于Microsoft Windows環(huán)境下的VB、VC++以及Delphi等。Glade的可視化編程可以使程序員的主要精力集中于應(yīng)用程序核心功能的開(kāi)發(fā)上,而不需為界面的修改重復(fù)編寫(xiě)大量煩瑣的Gtk+函數(shù)。
1???????? 打開(kāi)Glade
Linux系統(tǒng)啟動(dòng)圖形界面之后,在終端上輸入glade或在桌面上單擊【Application】|【Programming】|【Glade Interface Designer】命令,即可啟動(dòng)Glade。一般能看到3個(gè)窗口:工程管理窗口、常用構(gòu)件窗口和屬性管理窗口。
?
2???????? 創(chuàng)建應(yīng)用程序界面
在創(chuàng)建應(yīng)用程序界面之前,首先新建一個(gè)工程項(xiàng)目。單擊工程管理窗口上方的【New】按鈕,會(huì)彈出新建Project對(duì)話框。
1).創(chuàng)建一個(gè)新的窗口
2).在窗口中添加各種構(gòu)件
3).為構(gòu)件的信號(hào)連接回調(diào)函數(shù)
4).生成創(chuàng)建應(yīng)用程序界面的源代碼
?
3???????? 編譯連接程序
Glade中使用Automake工具,可以根據(jù)編譯選項(xiàng)自動(dòng)生成Makefile文件。
?
四? 常見(jiàn)面試題
常見(jiàn)面試題1:簡(jiǎn)述編寫(xiě)GTK+應(yīng)用程序的一般步驟。
?
常見(jiàn)面試題2:Glade的可視化編程與Microsoft Windows環(huán)境下的VB、VC++以及Delphi等工具有何差異?
?
五 小結(jié)
在Linux系統(tǒng)中,基于GTK+構(gòu)件的應(yīng)用程序圖形界面,執(zhí)行效率高,占用資源少,有著很好的發(fā)展前景。這一章主要介紹了GTK+編程的基本知識(shí),通過(guò)本章的學(xué)習(xí),讀者應(yīng)該能夠編寫(xiě)基本的圖形界面應(yīng)用程序。由于篇幅有限,這里只介紹了很少一部分GTK+構(gòu)件。
轉(zhuǎn)載于:https://www.cnblogs.com/zeedmood/archive/2012/04/09/2439359.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的嵌入式成长轨迹23 【Linux应用编程强化】【Linux下的C编程 下】【Linux GUI编程】...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 开启MSDTC的方法
- 下一篇: MYSQL delete语句不支持别名?