### 狀態欄 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;
}
~~~