GTK编程基础----状态栏、文本输入构件、组合框

GTK编程基础----状态栏、文本输入构件、组合框

138人阅读 评论(0) 收藏 举报

状态栏 Statusbars
状态栏(Statusbars)是一些简单的构件,一般用来显示文本消息。它将文本消息压入到一个栈里面,当弹出当前消息时,将重新显示前一条文本消息。看下面具体的代码实现:


  1. /*File:statusbar.c 
  2.  *Date:2013-12-22 
  3.  *Author:sjin 
  4.  *Mail:413977243@qq.com 
  5.  */  
  6.   
  7. #include <gtk/gtk.h>  
  8. #include <stdlib.h>  
  9. #include <glib.h>  
  10.   
  11. GtkWidget *status_bar;  
  12.   
  13. void push_item(GtkWidget *widget,gpointer data)  
  14. {  
  15.     static int count = 1;  
  16.     char buf[20] = {'\0'};  
  17.       
  18.     g_snprintf(buf,20,"Item %d",count++);  
  19.     //将新消息加到状态栏  
  20.     gtk_statusbar_push(GTK_STATUSBAR(status_bar),GPOINTER_TO_INT(data),buf);  
  21.     return;  
  22. }  
  23.   
  24. void pop_item(GtkWidget *widget,gpointer data)  
  25. {  
  26.     //删除在栈中给定上下文标识符最上面的一个消息  
  27.     gtk_statusbar_pop(GTK_STATUSBAR(status_bar),GPOINTER_TO_INT(data));  
  28.     return;  
  29. }  
  30.   
  31. int main(int argc, char*argv[])  
  32. {  
  33.     GtkWidget *window;  
  34.     GtkWidget *button;  
  35.     GtkWidget *vbox;  
  36.     gint context_id;  
  37.   
  38.     //初始化GTK  
  39.     gtk_init(&argc,&argv);  
  40.     //创建最上层主窗口  
  41.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  42.     //连接信号"delete_event",使得窗口关闭时发生  
  43.     g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);  
  44.     //设置窗口标题      
  45.     gtk_window_set_title(GTK_WINDOW(window),"GTK 状态栏工具");  
  46.     //设定窗口的默认宽高  
  47.     //gtk_window_set_default_size(GTK_WINDOW(window),200,300);  
  48.     //设定窗口的位置,让窗口总在最前端  
  49.     gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);  
  50.     //设定容器边框的宽度  
  51.     gtk_container_set_border_width(GTK_CONTAINER(window),20);  
  52.   
  53.     vbox = gtk_vbox_new(FALSE,1);  
  54.     gtk_container_add(GTK_CONTAINER(window),vbox);  
  55.     gtk_widget_show(vbox);  
  56.   
  57.     //创建一个状态栏  
  58.     status_bar = gtk_statusbar_new();  
  59.     gtk_box_pack_start(GTK_BOX(vbox),status_bar,TRUE,TRUE,0);  
  60.     gtk_widget_show(status_bar);  
  61.   
  62.     //获得上下文的标识符  
  63.     context_id = gtk_statusbar_get_context_id(GTK_STATUSBAR(status_bar),"Statusbar example");  
  64.   
  65.     button = gtk_button_new_with_label("push_item");  
  66.     g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(push_item),GINT_TO_POINTER(context_id));  
  67.     gtk_box_pack_start(GTK_BOX(vbox),button,TRUE,TRUE,2);  
  68.     gtk_widget_show(button);  
  69.   
  70.     button = gtk_button_new_with_label("pop last item");  
  71.     g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(pop_item),GINT_TO_POINTER(context_id));  
  72.     gtk_box_pack_start(GTK_BOX(vbox),button,TRUE,TRUE,2);  
  73.     gtk_widget_show(button);  
  74.   
  75.     gtk_widget_show_all(window);  
  76.     gtk_main();  
  77.     return FALSE;  
  78. }  

文本输入构件 Text Entries
文本输入构件(Entry widget)允许在一个单行文本框里输入和显示一行文本。文本可以用函数进行操作,如将新的文本替换、前插、追加到文本输入构件的当前内容中。


  1. /*File:text_entry.c 
  2.  *Date:2013-12-28 
  3.  *Author:sjin 
  4.  *Mail:413977243@qq.com 
  5.  */  
  6.   
  7. #include<gtk/gtk.h>  
  8. #include <stdio.h>  
  9. #include <stdlib.h>  
  10.   
  11. static GtkWidget* entry1;  
  12. static GtkWidget* entry2;  
  13.   
  14. void on_button_clicked (GtkWidget* button,gpointer data)  
  15. {  
  16.     /*void gtk_entry_set_text(Gtk_Entry *entry,const gchr  *text) 
  17.      *     将新的内容取代文本输入构件当前的内容。 
  18.      *const gchar *gtk_entry_get_text(GtkEntry *entry) 
  19.      *     获得当前文本输入构件的内容 
  20.      */  
  21.     if((int)data == 1){  
  22.         gtk_entry_set_text(GTK_ENTRY(entry1),"");  
  23.         gtk_entry_set_text(GTK_ENTRY(entry2),"");  
  24.     } else if ((int)data == 2){  
  25.         const gchar* username = gtk_entry_get_text(GTK_ENTRY(entry1));  
  26.         const gchar* password = gtk_entry_get_text(GTK_ENTRY(entry2));  
  27.         g_print("用户名是:%s",username);  
  28.         g_print("\n");  
  29.         g_print("密码是:%s\n",password);  
  30.     } else if((int)data == 3){  
  31.         /*改变文本空的可编辑状态*/  
  32.         gtk_editable_set_editable(GTK_EDITABLE(entry1),GTK_TOGGLE_BUTTON(button)->active);  
  33.         gtk_editable_set_editable(GTK_EDITABLE(entry2),GTK_TOGGLE_BUTTON(button)->active);  
  34.     }  
  35. }  
  36.   
  37. int main(int argc,char* argv[])  
  38. {  
  39.     GtkWidget* window;  
  40.     GtkWidget* box;  
  41.     GtkWidget* box1;  
  42.     GtkWidget* box2;  
  43.     GtkWidget* box3;  
  44.     GtkWidget* label1;  
  45.     GtkWidget* label2;  
  46.     GtkWidget* button;  
  47.     GtkWidget* sep;  
  48.     //初始化  
  49.     gtk_init(&argc,&argv);  
  50.     //设置窗口  
  51.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  52.     g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);  
  53.     gtk_window_set_title(GTK_WINDOW(window),"登录窗口");  
  54.     gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);  
  55.     gtk_container_set_border_width(GTK_CONTAINER(window),20);  
  56.   
  57.     box = gtk_vbox_new(FALSE,0);  
  58.     gtk_container_add(GTK_CONTAINER(window),box);  
  59.     box1 = gtk_hbox_new(FALSE,0);  
  60.     gtk_box_pack_start(GTK_BOX(box),box1,FALSE,FALSE,5);  
  61.     box2 = gtk_hbox_new(FALSE,0);  
  62.     gtk_box_pack_start(GTK_BOX(box),box2,FALSE,FALSE,5);  
  63.     sep = gtk_hseparator_new();//分割线  
  64.     gtk_box_pack_start(GTK_BOX(box),sep,FALSE,FALSE,5);  
  65.     box3 = gtk_hbox_new(FALSE,0);  
  66.     gtk_box_pack_start(GTK_BOX(box),box3,TRUE,TRUE,5);  
  67.   
  68.   
  69.     label1 = gtk_label_new("用户名:");  
  70.     entry1 = gtk_entry_new();  
  71.     gtk_box_pack_start(GTK_BOX(box1),label1,FALSE,FALSE,5);  
  72.     gtk_box_pack_start(GTK_BOX(box1),entry1,FALSE,FALSE,5);  
  73.   
  74.     label2 = gtk_label_new("密    码:");  
  75.     entry2 = gtk_entry_new();  
  76.     /*设置输入文本不可见*/  
  77.     gtk_entry_set_visibility(GTK_ENTRY(entry2),FALSE);  
  78.     gtk_box_pack_start(GTK_BOX(box2),label2,FALSE,FALSE,5);  
  79.     gtk_box_pack_start(GTK_BOX(box2),entry2,FALSE,FALSE,5);  
  80.   
  81.     button = gtk_check_button_new_with_label("Editable");  
  82.     g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_button_clicked),(gpointer)3);  
  83.     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),TRUE);  
  84.     gtk_box_pack_start(GTK_BOX(box3),button,TRUE,TRUE,10);  
  85.     gtk_widget_show(button);  
  86.   
  87.     button = gtk_button_new_with_label("清空");  
  88.     g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_button_clicked),(gpointer)1);  
  89.     gtk_box_pack_start(GTK_BOX(box3),button,TRUE,TRUE,10);  
  90.     gtk_widget_show(button);  
  91.   
  92.     button = gtk_button_new_with_label("确认");  
  93.     g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_button_clicked),(gpointer)2);  
  94.     g_signal_connect_swapped(G_OBJECT(button),"clicked",G_CALLBACK(gtk_widget_destroy),window);  
  95.     gtk_box_pack_start(GTK_BOX(box3),button,TRUE,TRUE,5);  
  96.     gtk_widget_show(button);  
  97.   
  98.   
  99.     gtk_widget_show_all(window);  
  100.     gtk_main();  
  101.     return FALSE;  
  102. }  

组合框 Combo Box
组合框(combo box)是另一个很简单的构件,实际上它仅仅是其它构件的集合。从用户的观点来说,这个构件是由一个文本输入构件和一个下拉菜单组成的,用户可以从一个预先定义的列表里面选择一个选项,同时,用户也可以直接在文本框里面输入文本.


  1. #include <gtk/gtk.h>  
  2.   
  3. void callback(GtkWidget *button,gpointer data)  
  4. {  
  5.     printf("组合框发生改变\n");      
  6.     if((int)data == 1){  
  7.         gchar *ptr = gtk_entry_get_text(GTK_ENTRY(button));  
  8.         printf("组合框A发生改变,内容是:%s\n",ptr);  
  9.     }else if((int)data == 2) {  
  10.         gchar *ptr = gtk_entry_get_text(GTK_ENTRY(button));  
  11.         printf("组合框A发生改变,内容是:%s\n",ptr);      
  12.     }  
  13. }  
  14. GtkWidget *create_item (gint i)  
  15. {  
  16.     GtkWidget *item;  
  17.     GtkWidget *label;  
  18.     GtkWidget *hbox;  
  19.     GtkWidget *image;  
  20.     hbox = gtk_hbox_new(FALSE,0);  
  21.     switch(i){  
  22.     case 1:  
  23.         image = gtk_image_new_from_stock(GTK_STOCK_YES,GTK_ICON_SIZE_MENU);  
  24.         label = gtk_label_new("列表项一");  
  25.         break;  
  26.     case 2:  
  27.         image = gtk_image_new_from_stock(GTK_STOCK_NO,GTK_ICON_SIZE_MENU);  
  28.         label = gtk_label_new("列表项二");  
  29.         break;  
  30.     case 3:  
  31.         image = gtk_image_new_from_stock(GTK_STOCK_HELP,GTK_ICON_SIZE_MENU);  
  32.         label = gtk_label_new("列表项三");  
  33.         break;  
  34.     case 4:  
  35.         image = gtk_image_new_from_stock(GTK_STOCK_OK,GTK_ICON_SIZE_MENU);  
  36.         label = gtk_label_new("列表项四");  
  37.         break;  
  38.     case 5:  
  39.         image = gtk_image_new_from_stock(GTK_STOCK_CANCEL,GTK_ICON_SIZE_MENU);  
  40.         label = gtk_label_new("列表项五");  
  41.         break;  
  42.     }  
  43.     gtk_box_pack_start(GTK_BOX(hbox),image,FALSE,FALSE,2);  
  44.     gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,2);  
  45.     item = gtk_list_item_new();  
  46.     gtk_container_add(GTK_CONTAINER(item),hbox);  
  47.     gtk_widget_show_all(item);  
  48.     return item;  
  49. }  
  50. int main(int argc,char* argv[])  
  51. {  
  52.     GtkWidget *window;  
  53.     GtkWidget *combo;  
  54.     GtkWidget *label;  
  55.     GtkWidget *vbox;  
  56.     GList *items = NULL;  
  57.     GtkWidget *item;  
  58.     items =g_list_append(items,"列表项A");  
  59.     items =g_list_append(items,"列表项B");  
  60.     items =g_list_append(items,"列表项C");  
  61.     items =g_list_append(items,"列表项D");  
  62.     items =g_list_append(items,"列表项E");  
  63.     gtk_init(&argc,&argv);  
  64.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  65.     g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);  
  66.     gtk_window_set_title(GTK_WINDOW(window),"下拉列表框");  
  67.     gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);  
  68.     gtk_container_set_border_width(GTK_CONTAINER(window),20);  
  69.   
  70.     vbox = gtk_vbox_new(FALSE,0);  
  71.     gtk_container_add(GTK_CONTAINER(window),vbox);  
  72.     label = gtk_label_new("组合框A");  
  73.     gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,5);  
  74.     combo = gtk_combo_new();  
  75.     gtk_box_pack_start(GTK_BOX(vbox),combo,FALSE,FALSE,5);  
  76.     gtk_combo_set_popdown_strings(GTK_COMBO(combo),items);  
  77.     g_signal_connect(G_OBJECT(GTK_COMBO(combo)->entry),"changed",G_CALLBACK(callback),(gpointer)1);  
  78.   
  79.     /************************另一种创建的方式******************************/  
  80.     label = gtk_label_new("组合框B");  
  81.     gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,5);  
  82.     combo = gtk_combo_new();  
  83.     gtk_box_pack_start(GTK_BOX(vbox),combo,FALSE,FALSE,5);  
  84.     item = create_item(1);  
  85.     gtk_combo_set_item_string(GTK_COMBO(combo),GTK_ITEM(item),"项目一");  
  86.     gtk_container_add(GTK_CONTAINER(GTK_COMBO(combo)->list),item);  
  87.     item = create_item(2);  
  88.     gtk_combo_set_item_string(GTK_COMBO(combo),GTK_ITEM(item),"项目二");  
  89.     gtk_container_add(GTK_CONTAINER(GTK_COMBO(combo)->list),item);  
  90.     item = create_item(3);  
  91.     gtk_combo_set_item_string(GTK_COMBO(combo),GTK_ITEM(item),"项目三");  
  92.     gtk_container_add(GTK_CONTAINER(GTK_COMBO(combo)->list),item);  
  93.     item = create_item(4);  
  94.     gtk_combo_set_item_string(GTK_COMBO(combo),GTK_ITEM(item),"项目四");  
  95.     gtk_container_add(GTK_CONTAINER(GTK_COMBO(combo)->list),item);  
  96.     item = create_item(5);  
  97.     gtk_combo_set_item_string(GTK_COMBO(combo),GTK_ITEM(item),"项目五");  
  98.     gtk_container_add(GTK_CONTAINER(GTK_COMBO(combo)->list),item);  
  99.     g_signal_connect(G_OBJECT(GTK_COMBO(combo)->entry),"changed",G_CALLBACK(callback),(gpointer)2);  
  100.   
  101.     gtk_widget_show_all(window);  
  102.     gtk_main();  
  103.     return FALSE;  
  104. }  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值