Шаг 12 - Переключатели и радиокнопки

Тоже относятся к категории gtk_*_button. Для создания двухпозиционных переключателей (галочек:)) используются следующие функции:

GtkWidget *gtk_check_button_new( void );
GtkWidget *gtk_check_button_new_with_label ( gchar *label );

Элементарно, правда... Немного сложнее обстоит дело с радиокнопками, ведь их еще группировать надо. Для работы с этими кнопками используются следующие функции:

GtkWidget *gtk_radio_button_new( GSList *group );
GtkWidget *gtk_radio_button_new_with_label( GSList *group, gchar *label );
GSList *gtk_radio_button_group( GtkRadioButton *radio_button );
void gtk_toggle_button_set_active( GtkToggleButton *toggle_button, gint state );

Они означают именно то, что написано... Порядок такой:

  1. Создается кнопка функцией button1 = gtk_radio_button_new*(NULL,...);
  2. Создается группа group1 = gtk_radio_button_group(button1);
  3. Добавляются другие кнопки buttonx = gtk_radio_button_new*(group1,...);
  4. Устанавливается отмеченная по умолчанию кнопка gtk_toggle_button_set_active(buttonx,TRUE)

Вот пример программы, работающей с радиокнопками:

#include <gtk/gtk.h>
#include <glib.h>

gint close_application( GtkWidget *widget, GdkEvent *event, gpointer data )
{
	gtk_main_quit();
	return(FALSE);
}

int main( int argc, char *argv[] )
{
	GtkWidget *window = NULL;
	GtkWidget *box1;
	GtkWidget *box2;
	GtkWidget *button;
	GtkWidget *separator;
	GSList *group;

	gtk_init(&argc,&argv);    

	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

	gtk_signal_connect (GTK_OBJECT (window), "delete_event",
		GTK_SIGNAL_FUNC(close_application), NULL);

	gtk_window_set_title (GTK_WINDOW (window), "radio buttons");
	gtk_container_set_border_width (GTK_CONTAINER (window), 0);

	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);

	button = gtk_radio_button_new_with_label (NULL, "button1");
	gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
	gtk_widget_show (button);

	group = gtk_radio_button_group (GTK_RADIO_BUTTON (button));
	button = gtk_radio_button_new_with_label(group, "button2");
	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
	gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
	gtk_widget_show (button);

	button = gtk_radio_button_new_with_label(
		gtk_radio_button_group (GTK_RADIO_BUTTON (button)),
		"button3");
	gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
	gtk_widget_show (button);

	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");
	gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
		GTK_SIGNAL_FUNC(close_application),
		GTK_OBJECT (window));
	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);
}

У меня все это выглядело так:

gif/12_1.gif (8772 b)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Аванесов Самвел - 14.08.2002