創建按鈕有好幾種方法。你可以用 gtk_button_new_with_label() 或?gtk_button_new_with_mnemonic() 來創建一個帶標簽的按鈕,用 gtk_button_new_from_stock() 來從一個原料(stock)項創建一個包含圖像和文本的按鈕,或者用 gtk_button_new() 創建一個空白按鈕。接著你可以決定把一個標簽或位圖(pixmap)組裝到這個新創建的按鈕里。要這樣做,創建一個新的盒,然后用常見的 gtk_box_pack_start() 把你的對象組裝到盒里,再gtk_container_add() 把盒組裝到按鈕里。
### 下面是演示用函數gtk_button_new()去創建一個帶圖像和標簽的按鈕控件。
~~~
/*File:Normal_Button.c
*Date:2013-12-03
*Author:sjin
*Mail:413977243@qq.com
*/
#include <stdio.h>
#include <gtk/gtk.h>
#include <stdlib.h>
/*創建一個橫向盒,它包含一個圖像和一個標簽,并非你會這個盒子*/
GtkWidget *xpm_label_box(gchar *xpm_filename,gchar *label_text)
{
GtkWidget *box;
GtkWidget *label;
GtkWidget *image;
/*為圖像和標簽創建盒*/
box = gtk_hbox_new(FALSE,0);
gtk_container_set_border_width(GTK_CONTAINER(box),2);
/*創建一個圖像*/
image = gtk_image_new_from_file(xpm_filename);
/*為按鈕創建一個標簽*/
label = gtk_label_new(label_text);
/*圖像和按鈕組裝到盒子里*/
gtk_box_pack_start(GTK_BOX(box),image,FALSE,FALSE,3);
gtk_box_pack_start(GTK_BOX(box),label,FALSE,FALSE,3);
gtk_widget_show(image);
gtk_widget_show(label);
return box;
}
/*回調函數
*傳到這個函數的數據將唄打印到標準輸出
* */
void callback(GtkWidget *widget, gpointer data)
{
g_print("Hello again -%s was pressed\n",(char *) data);
}
/*退出回調函數*/
gint delete_event(GtkWidget *widget,GdkEvent *event,gpointer data)
{
gtk_main_quit();
return FALSE;
}
int main(int argc,char *argv[])
{
GtkWidget *window;
GtkWidget *button;
GtkWidget *box;
/*初始化*/
gtk_init(&argc,&argv);
/*創建窗口*/
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/*這個一般必要有delete_event信號到主窗口*/
g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(delete_event),NULL);
/*設置窗口寬度*/
gtk_container_set_border_width(GTK_CONTAINER(window),80);
/*設置窗口標題*/
gtk_window_set_title(GTK_WINDOW(window),"普通按鈕練習");
button = gtk_button_new();
g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(callback),(gpointer)"cool button");
box = xpm_label_box("info.xpm","cool button");
gtk_widget_show(box);
gtk_container_add(GTK_CONTAINER(button),box);
gtk_widget_show(button);
gtk_container_add(GTK_CONTAINER(window),button);
gtk_widget_show(window);
gtk_main();
return 0;
}
~~~
運行程序顯示下面的圖像:

### 按鈕構件有如下信號:
? pressed --- 當鼠標鍵在按鈕構件里按下時發出
? released --- 當鼠標鍵在按鈕構件里釋放時發出
? clicked --- 當鼠標鍵在按鈕構件里按下并接著在按鈕構件里釋放時發出
? enter --- 當鼠標光標進入按鈕構件時發出
? leave --- 當鼠標光標離開按鈕構件時發出
### 開關、復選按鈕
###

~~~
/*File:Toggle_button.c
*Date:2013-12-07
*Author:sjin
*Mail:413977243@qq.com
*/
#include <stdio.h>
#include <gtk/gtk.h>
#include <stdlib.h>
/*開關按鈕:
* 由一般按鈕派生而來,只是開關按鈕只有兩個狀態,通過點擊
* 可以切換。
* 開關按鈕是復選按鈕和單選按鈕的基礎,所以單選按鈕和復選按鈕繼承了
* 許多開關按鈕的函數調用
*/
GtkWidget *button1;
GtkWidget *button2;
/*回調函數
*傳到這個函數的數據將唄打印到標準輸出
* */
void Toggle_Button_callback(GtkWidget *widget, gpointer data)
{
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))){
g_print(" 按鈕被按下\n");
}else{
g_print("按鈕是彈起的\n",(char *) data);
}
}
void callback(GtkWidget *widget, gpointer data)
{
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button1))){
g_print(" 數學被選中\n");
}else{
g_print("nothing\n");
}
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button2))){
g_print(" 語文被選中\n");
}else{
g_print("nothing\n");
}
}
/*退出回調函數*/
gint delete_event(GtkWidget *widget,GdkEvent *event,gpointer data)
{
gtk_main_quit();
return FALSE;
}
int main(int argc,char *argv[])
{
GtkWidget *window;
GtkWidget *button;
GtkWidget *box;
/*初始化*/
gtk_init(&argc,&argv);
/*創建窗口*/
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/*這個一般必要有delete_event信號到主窗口*/
g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(delete_event),NULL);
/*設置窗口寬度*/
gtk_container_set_border_width(GTK_CONTAINER(window),20);
/*設置窗口標題*/
gtk_window_set_title(GTK_WINDOW(window),"開關按鈕練習");
/*創建一個組裝盒子*/
box = gtk_vbox_new(FALSE,0);
/*設置一個開關按鈕*/
button = gtk_toggle_button_new_with_label("打開");
/*設置按鈕的狀態,默認為彈起 FALSE .*/
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),FALSE);
g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(Toggle_Button_callback),(gpointer)"cool button");
gtk_box_pack_start(GTK_BOX(box),button,TRUE,TRUE,0);
gtk_widget_show(button);
/*********設置復選按鈕********/
button1 = gtk_check_button_new_with_label("數學");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button1),TRUE);
gtk_box_pack_start(GTK_BOX(box),button1,TRUE,TRUE,0);
gtk_widget_show(button1);
button2 = gtk_check_button_new_with_label("語文");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button2),TRUE);
gtk_box_pack_start(GTK_BOX(box),button2,TRUE,TRUE,0);
gtk_widget_show(button2);
button = gtk_button_new_with_label("OK");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),TRUE);
gtk_box_pack_start(GTK_BOX(box),button,TRUE,TRUE,0);
g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(callback),NULL);
gtk_widget_show(button);
gtk_container_add(GTK_CONTAINER(window),box);
gtk_widget_show(box);
gtk_widget_show(window);
gtk_main();
return 0;
}
~~~
### ?單選按鈕?

### ?
~~~
/*File:Radio_Button.c
*Date:2013-12-03
*Author:sjin
*Mail:413977243@qq.com
*/
#include <stdio.h>
#include <gtk/gtk.h>
#include <stdlib.h>
/*創建單選按鈕,點擊close 回輸出那個單選按鈕被點擊
* 單選按鈕是分組的,一個組中只能有一個對象被選中、按下
*當應用程序中,要從多個選項中選中一個時用到
*/
enum Subject{
SHUXVE,
YUWEN,
YINGYU
};
GtkWidget *button1;//語文
GtkWidget *button2;//數學
GtkWidget *button3;//英語
void Radio_Button_callback(GtkWidget *widget,gpointer data)
{
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button1))){
g_print("語文被點擊\n");
}
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button2))){
g_print("數學被點擊\n");
}
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button3))){
g_print("英語被點擊\n");
}
}
/*回調函數
*傳到這個函數的數據將唄打印到標準輸出
* */
void callback(GtkWidget *widget, gpointer data)
{
g_print("Hello again -%s was pressed\n",(char *) data);
}
/*退出回調函數*/
gint delete_event(GtkWidget *widget,GdkEvent *event,gpointer data)
{
gtk_main_quit();
return FALSE;
}
int main(int argc,char *argv[])
{
GtkWidget *window;
GtkWidget *button;
GtkWidget *box1;
GtkWidget *box2;
GtkWidget *separator;
GSList *group;
/*初始化*/
gtk_init(&argc,&argv);
/*創建窗口*/
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/*這個一般必要有delete_event信號到主窗口*/
g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(delete_event),NULL);
/*設置窗口寬度*/
gtk_container_set_border_width(GTK_CONTAINER(window),0);
/*設置窗口標題*/
gtk_window_set_title(GTK_WINDOW(window),"單選按鈕練習");
box1 = gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(window),box1);
gtk_widget_show(box1);
box2 = gtk_vbox_new(FALSE,10);
gtk_container_set_border_width(GTK_CONTAINER(box2),10);
gtk_box_pack_start(GTK_BOX(box1),box2,TRUE,TRUE,0);
gtk_widget_show(box2);
button1 = gtk_radio_button_new_with_label(NULL,"語文");
gtk_box_pack_start(GTK_BOX(box2),button1,TRUE,TRUE,0);
gtk_widget_show(button1);
group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button1));
button2 = gtk_radio_button_new_with_label(group,"數學");
/*默認是選擇這個*/
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button2),TRUE);
gtk_box_pack_start(GTK_BOX(box2),button2,TRUE,TRUE,0);
gtk_widget_show(button2);
button3 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(button2),"英語");
gtk_box_pack_start(GTK_BOX(box2),button3,TRUE,TRUE,0);
gtk_widget_show(button3);
/*分割線*/
separator = gtk_hseparator_new();
gtk_box_pack_start(GTK_BOX(box1),separator,FALSE,TRUE,0);
gtk_widget_show(separator);
box2 = gtk_vbox_new(FALSE,10);
gtk_container_set_border_width(GTK_CONTAINER(box2),10);
gtk_box_pack_start(GTK_BOX(box1),box2,FALSE,TRUE,0);
gtk_widget_show(box2);
/*退出按鈕*/
button = gtk_button_new_with_label("close");
g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(Radio_Button_callback),(gpointer)"cool button");
gtk_box_pack_start(GTK_BOX(box2),button,TRUE,TRUE,0);
GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
gtk_widget_grab_default(button);
gtk_widget_show(button);
gtk_widget_show(window);
gtk_main();
return 0;
}
~~~