GtkCheckButton 與 GtkRadioButton


核 取鈕(Check Button)是可以進行選項複選的元件,單選鈕(Radio Button)是只能進行選項單選的元件,在GTK中分別使用GtkCheckButton 與GtkRadioButton來負責,它們是雙態按鈕GtkToggleButton的子類:
GtkToggleButton
    +----GtkCheckButton
    +----GtkRadioButton

建立核取鈕或單選鈕的方式與建立一般按鈕類似,您可以使用gtk_check_button_new()、 gtk_check_button_new_with_label()、gtk_check_button_new_with_mnemonic(),來 建立核取鈕,GtkRadioButton必須使用按鈕群組(Button Group)來加以群組,來表示哪些單選項為一個群組,彼此互斥,同時間只能選擇一個,例如 gtk_radio_button_new_with_label()函式:
GtkWidget *gtk_radio_button_new_with_label(GSList *group, const gchar  *label);

第一次建立GtkRadioButton時,GSList的參數直接設為NULL即可,接著使用gtk_radio_button_get_group()獲得按鈕群組;
GSList *gtk_radio_button_get_group( GtkRadioButton *radio_button);

例如以下的程式碼會先建立一個GtkRadioButton,接著從已建立的GtkRadioButton獲得按鈕群組,然後再用以建立另一個GtkRadioButton,如此兩個單選鈕就屬於同一個群組,同時間只能選取一個:
GtkWidget *radio1 = gtk_radio_button_new_with_label(NULL, "Linux");
GtkWidget *radio2 = gtk_radio_button_new_with_label(
             gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio1)) , "Windows");

您也可以使用gtk_radio_button_new_with_label_from_widget(),這可以省略gtk_radio_button_get_group()這道手續,例如:
GtkWidget *radio1 = gtk_radio_button_new_with_label(NULL, "Linux");
GtkWidget *radio2 = gtk_radio_button_new_with_label_from_widget(
                       GTK_RADIO_BUTTON(radio1) , "Windows");


由於GtkCheckButton與GtkRadioButton都屬於GtkToggleButton的子類,如果要設定按鈕為選取狀態,則直接使用gtk_toggle_button_set_active()函式即可。

下面的程式為
GtkCheckButton與GtkRadioButton配置的基本示範:
  • check_radio_demo.c
#include <gtk/gtk.h>

GtkWidget* checkButtonsNew() {
GtkWidget *check1, *check2;
GtkWidget *vbox;

check1 = gtk_check_button_new_with_label("Java is good!");
check2 = gtk_check_button_new_with_label("C++ is good!");

vbox = gtk_vbox_new(TRUE, 5);
gtk_box_pack_start(GTK_BOX(vbox), check1, TRUE, TRUE, 5);
gtk_box_pack_start(GTK_BOX(vbox), check2, TRUE, TRUE, 5);

return vbox;
}

GtkWidget* radioButtonsNew() {
GtkWidget *radio1, *radio2, *radio3;
GtkWidget *vbox;

radio1 = gtk_radio_button_new_with_label(NULL, "Linux");
radio2 = gtk_radio_button_new_with_label_from_widget(
GTK_RADIO_BUTTON(radio1) , "Windows");
radio3 = gtk_radio_button_new_with_label_from_widget(
GTK_RADIO_BUTTON(radio1) , "Mac");

vbox = gtk_vbox_new(TRUE, 5);
gtk_box_pack_start(GTK_BOX(vbox), radio1, TRUE, TRUE, 5);
gtk_box_pack_start(GTK_BOX(vbox), radio2, TRUE, TRUE, 5);
gtk_box_pack_start(GTK_BOX(vbox), radio3, TRUE, TRUE, 5);

return vbox;
}

int main(int argc, char *argv[]) {
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *frame;

gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "GtkCheckButton & GtkRadioButton");
gtk_window_set_default_size(GTK_WINDOW(window), 400, 50);

vbox = gtk_vbox_new(FALSE, 5);

gtk_box_pack_start(GTK_BOX(vbox), checkButtonsNew(), TRUE, TRUE, 5);

frame = gtk_frame_new("Favorite OS");
gtk_container_add(GTK_CONTAINER(frame), radioButtonsNew());

gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 5);

gtk_container_add(GTK_CONTAINER(window), vbox);

g_signal_connect(GTK_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);

gtk_widget_show_all(window);

gtk_main();

return 0;
}

執行的畫面如下所示: