您的位置:首页 > 编程语言

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

2014-07-17 23:14 423 查看

状态栏 Statusbars

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



[cpp]
view plaincopyprint?





/*File:statusbar.c 
 *Date:2013-12-22 
 *Author:sjin 
 *Mail:413977243@qq.com 
 */  
  
#include <gtk/gtk.h>  
#include <stdlib.h>  
#include <glib.h>  
  
GtkWidget *status_bar;  
  
void push_item(GtkWidget *widget,gpointer data)  
{  
    static int count = 1;  
    char buf[20] = {'\0'};  
      
    g_snprintf(buf,20,"Item %d",count++);  
    //将新消息加到状态栏  
    gtk_statusbar_push(GTK_STATUSBAR(status_bar),GPOINTER_TO_INT(data),buf);  
    return;  
}  
  
void pop_item(GtkWidget *widget,gpointer data)  
{  
    //删除在栈中给定上下文标识符最上面的一个消息  
    gtk_statusbar_pop(GTK_STATUSBAR(status_bar),GPOINTER_TO_INT(data));  
    return;  
}  
  
int main(int argc, char*argv[])  
{  
    GtkWidget *window;  
    GtkWidget *button;  
    GtkWidget *vbox;  
    gint context_id;  
  
    //初始化GTK  
    gtk_init(&argc,&argv);  
    //创建最上层主窗口  
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
    //连接信号"delete_event",使得窗口关闭时发生  
    g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);  
    //设置窗口标题      
    gtk_window_set_title(GTK_WINDOW(window),"GTK 状态栏工具");  
    //设定窗口的默认宽高  
    //gtk_window_set_default_size(GTK_WINDOW(window),200,300);  
    //设定窗口的位置,让窗口总在最前端  
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);  
    //设定容器边框的宽度  
    gtk_container_set_border_width(GTK_CONTAINER(window),20);  
  
    vbox = gtk_vbox_new(FALSE,1);  
    gtk_container_add(GTK_CONTAINER(window),vbox);  
    gtk_widget_show(vbox);  
  
    //创建一个状态栏  
    status_bar = gtk_statusbar_new();  
    gtk_box_pack_start(GTK_BOX(vbox),status_bar,TRUE,TRUE,0);  
    gtk_widget_show(status_bar);  
  
    //获得上下文的标识符  
    context_id = gtk_statusbar_get_context_id(GTK_STATUSBAR(status_bar),"Statusbar example");  
  
    button = gtk_button_new_with_label("push_item");  
    g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(push_item),GINT_TO_POINTER(context_id));  
    gtk_box_pack_start(GTK_BOX(vbox),button,TRUE,TRUE,2);  
    gtk_widget_show(button);  
  
    button = gtk_button_new_with_label("pop last item");  
    g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(pop_item),GINT_TO_POINTER(context_id));  
    gtk_box_pack_start(GTK_BOX(vbox),button,TRUE,TRUE,2);  
    gtk_widget_show(button);  
  
    gtk_widget_show_all(window);  
    gtk_main();  
    return FALSE;  
}  

文本输入构件 Text Entries

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



[cpp]
view plaincopyprint?





/*File:text_entry.c 
 *Date:2013-12-28 
 *Author:sjin 
 *Mail:413977243@qq.com 
 */  
  
#include<gtk/gtk.h>  
#include <stdio.h>  
#include <stdlib.h>  
  
static GtkWidget* entry1;  
static GtkWidget* entry2;  
  
void on_button_clicked (GtkWidget* button,gpointer data)  
{  
    /*void gtk_entry_set_text(Gtk_Entry *entry,const gchr  *text) 
     *     将新的内容取代文本输入构件当前的内容。 
     *const gchar *gtk_entry_get_text(GtkEntry *entry) 
     *     获得当前文本输入构件的内容 
     */  
    if((int)data == 1){  
        gtk_entry_set_text(GTK_ENTRY(entry1),"");  
        gtk_entry_set_text(GTK_ENTRY(entry2),"");  
    } else if ((int)data == 2){  
        const gchar* username = gtk_entry_get_text(GTK_ENTRY(entry1));  
        const gchar* password = gtk_entry_get_text(GTK_ENTRY(entry2));  
        g_print("用户名是:%s",username);  
        g_print("\n");  
        g_print("密码是:%s\n",password);  
    } else if((int)data == 3){  
        /*改变文本空的可编辑状态*/  
        gtk_editable_set_editable(GTK_EDITABLE(entry1),GTK_TOGGLE_BUTTON(button)->active);  
        gtk_editable_set_editable(GTK_EDITABLE(entry2),GTK_TOGGLE_BUTTON(button)->active);  
    }  
}  
  
int main(int argc,char* argv[])  
{  
    GtkWidget* window;  
    GtkWidget* box;  
    GtkWidget* box1;  
    GtkWidget* box2;  
    GtkWidget* box3;  
    GtkWidget* label1;  
    GtkWidget* label2;  
    GtkWidget* button;  
    GtkWidget* sep;  
    //初始化  
    gtk_init(&argc,&argv);  
    //设置窗口  
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
    g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);  
    gtk_window_set_title(GTK_WINDOW(window),"登录窗口");  
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);  
    gtk_container_set_border_width(GTK_CONTAINER(window),20);  
  
    box = gtk_vbox_new(FALSE,0);  
    gtk_container_add(GTK_CONTAINER(window),box);  
    box1 = gtk_hbox_new(FALSE,0);  
    gtk_box_pack_start(GTK_BOX(box),box1,FALSE,FALSE,5);  
    box2 = gtk_hbox_new(FALSE,0);  
    gtk_box_pack_start(GTK_BOX(box),box2,FALSE,FALSE,5);  
    sep = gtk_hseparator_new();//分割线  
    gtk_box_pack_start(GTK_BOX(box),sep,FALSE,FALSE,5);  
    box3 = gtk_hbox_new(FALSE,0);  
    gtk_box_pack_start(GTK_BOX(box),box3,TRUE,TRUE,5);  
  
  
    label1 = gtk_label_new("用户名:");  
    entry1 = gtk_entry_new();  
    gtk_box_pack_start(GTK_BOX(box1),label1,FALSE,FALSE,5);  
    gtk_box_pack_start(GTK_BOX(box1),entry1,FALSE,FALSE,5);  
  
    label2 = gtk_label_new("密    码:");  
    entry2 = gtk_entry_new();  
    /*设置输入文本不可见*/  
    gtk_entry_set_visibility(GTK_ENTRY(entry2),FALSE);  
    gtk_box_pack_start(GTK_BOX(box2),label2,FALSE,FALSE,5);  
    gtk_box_pack_start(GTK_BOX(box2),entry2,FALSE,FALSE,5);  
  
    button = gtk_check_button_new_with_label("Editable");  
    g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_button_clicked),(gpointer)3);  
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),TRUE);  
    gtk_box_pack_start(GTK_BOX(box3),button,TRUE,TRUE,10);  
    gtk_widget_show(button);  
  
    button = gtk_button_new_with_label("清空");  
    g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_button_clicked),(gpointer)1);  
    gtk_box_pack_start(GTK_BOX(box3),button,TRUE,TRUE,10);  
    gtk_widget_show(button);  
  
    button = gtk_button_new_with_label("确认");  
    g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_button_clicked),(gpointer)2);  
    g_signal_connect_swapped(G_OBJECT(button),"clicked",G_CALLBACK(gtk_widget_destroy),window);  
    gtk_box_pack_start(GTK_BOX(box3),button,TRUE,TRUE,5);  
    gtk_widget_show(button);  
  
  
    gtk_widget_show_all(window);  
    gtk_main();  
    return FALSE;  
}  

组合框 Combo Box

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



[cpp]
view plaincopyprint?





#include <gtk/gtk.h>  
  
void callback(GtkWidget *button,gpointer data)  
{  
    printf("组合框发生改变\n");      
    if((int)data == 1){  
        gchar *ptr = gtk_entry_get_text(GTK_ENTRY(button));  
        printf("组合框A发生改变,内容是:%s\n",ptr);  
    }else if((int)data == 2) {  
        gchar *ptr = gtk_entry_get_text(GTK_ENTRY(button));  
        printf("组合框A发生改变,内容是:%s\n",ptr);      
    }  
}  
GtkWidget *create_item (gint i)  
{  
    GtkWidget *item;  
    GtkWidget *label;  
    GtkWidget *hbox;  
    GtkWidget *image;  
    hbox = gtk_hbox_new(FALSE,0);  
    switch(i){  
    case 1:  
        image = gtk_image_new_from_stock(GTK_STOCK_YES,GTK_ICON_SIZE_MENU);  
        label = gtk_label_new("列表项一");  
        break;  
    case 2:  
        image = gtk_image_new_from_stock(GTK_STOCK_NO,GTK_ICON_SIZE_MENU);  
        label = gtk_label_new("列表项二");  
        break;  
    case 3:  
        image = gtk_image_new_from_stock(GTK_STOCK_HELP,GTK_ICON_SIZE_MENU);  
        label = gtk_label_new("列表项三");  
        break;  
    case 4:  
        image = gtk_image_new_from_stock(GTK_STOCK_OK,GTK_ICON_SIZE_MENU);  
        label = gtk_label_new("列表项四");  
        break;  
    case 5:  
        image = gtk_image_new_from_stock(GTK_STOCK_CANCEL,GTK_ICON_SIZE_MENU);  
        label = gtk_label_new("列表项五");  
        break;  
    }  
    gtk_box_pack_start(GTK_BOX(hbox),image,FALSE,FALSE,2);  
    gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,2);  
    item = gtk_list_item_new();  
    gtk_container_add(GTK_CONTAINER(item),hbox);  
    gtk_widget_show_all(item);  
    return item;  
}  
int main(int argc,char* argv[])  
{  
    GtkWidget *window;  
    GtkWidget *combo;  
    GtkWidget *label;  
    GtkWidget *vbox;  
    GList *items = NULL;  
    GtkWidget *item;  
    items =g_list_append(items,"列表项A");  
    items =g_list_append(items,"列表项B");  
    items =g_list_append(items,"列表项C");  
    items =g_list_append(items,"列表项D");  
    items =g_list_append(items,"列表项E");  
    gtk_init(&argc,&argv);  
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
    g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);  
    gtk_window_set_title(GTK_WINDOW(window),"下拉列表框");  
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);  
    gtk_container_set_border_width(GTK_CONTAINER(window),20);  
  
    vbox = gtk_vbox_new(FALSE,0);  
    gtk_container_add(GTK_CONTAINER(window),vbox);  
    label = gtk_label_new("组合框A");  
    gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,5);  
    combo = gtk_combo_new();  
    gtk_box_pack_start(GTK_BOX(vbox),combo,FALSE,FALSE,5);  
    gtk_combo_set_popdown_strings(GTK_COMBO(combo),items);  
    g_signal_connect(G_OBJECT(GTK_COMBO(combo)->entry),"changed",G_CALLBACK(callback),(gpointer)1);  
  
    /************************另一种创建的方式******************************/  
    label = gtk_label_new("组合框B");  
    gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,5);  
    combo = gtk_combo_new();  
    gtk_box_pack_start(GTK_BOX(vbox),combo,FALSE,FALSE,5);  
    item = create_item(1);  
    gtk_combo_set_item_string(GTK_COMBO(combo),GTK_ITEM(item),"项目一");  
    gtk_container_add(GTK_CONTAINER(GTK_COMBO(combo)->list),item);  
    item = create_item(2);  
    gtk_combo_set_item_string(GTK_COMBO(combo),GTK_ITEM(item),"项目二");  
    gtk_container_add(GTK_CONTAINER(GTK_COMBO(combo)->list),item);  
    item = create_item(3);  
    gtk_combo_set_item_string(GTK_COMBO(combo),GTK_ITEM(item),"项目三");  
    gtk_container_add(GTK_CONTAINER(GTK_COMBO(combo)->list),item);  
    item = create_item(4);  
    gtk_combo_set_item_string(GTK_COMBO(combo),GTK_ITEM(item),"项目四");  
    gtk_container_add(GTK_CONTAINER(GTK_COMBO(combo)->list),item);  
    item = create_item(5);  
    gtk_combo_set_item_string(GTK_COMBO(combo),GTK_ITEM(item),"项目五");  
    gtk_container_add(GTK_CONTAINER(GTK_COMBO(combo)->list),item);  
    g_signal_connect(G_OBJECT(GTK_COMBO(combo)->entry),"changed",G_CALLBACK(callback),(gpointer)2);  
  
    gtk_widget_show_all(window);  
    gtk_main();  
    return FALSE;  
}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐