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

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


/*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)允许在一个单行文本框里输入和显示一行文本。文本可以用函数进行操作,如将新的文本替换、前插、追加到文本输入构件的当前内容中。


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


#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;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值