Шаг 11 - Виджет gtk_button

Этот виджет мы уже использовали несколько раз... Самый простой способ создания кнопки - вызов функции gtk_button_new_with_label(char* label), которая возвращает указатель на вновь созданную кнопку... С подписью. Другим способом является создание пустой кнопки. Затем создается контейнер, в который упаковывается, скажем, XPM иконка и метка... Затем уже сам контейнер упаковывается в кнопку. Которая по иерархии также является контейнером.

В англоязычной документации был пример реализации такой функции. Без особых изменений (помните деревянный велосипед...) приведу его текст:

#include <gtk/gtk.h>

/* Функция по созданию контейнера, создержащего выравненные иконку и метку
 * возвращающая этот виджет. */

GtkWidget *xpm_label_box(
	GtkWidget *parent,
	gchar *xpm_filename,
	gchar *label_text )
{
	GtkWidget *box1;
	GtkWidget *label;
	GtkWidget *pixmapwid;
	GdkPixmap *pixmap;
	GdkBitmap *mask;
	GtkStyle *style;

	/* Создать новый контейнер */
	box1 = gtk_hbox_new (FALSE, 0);
	gtk_container_set_border_width (GTK_CONTAINER (box1), 2);

	/* Получить стиль родителя для имитации прозрачности
	* фона. */
	style = gtk_widget_get_style(parent);

	/* Теперь сделаем иконку */
	pixmap = gdk_pixmap_create_from_xpm(
		parent->window, &mask,
		&style->bg[GTK_STATE_NORMAL],
		xpm_filename);
	pixmapwid = gtk_pixmap_new (pixmap, mask);

	/* Метка пошла... */
	label = gtk_label_new (label_text);

	/* Упакуем все... */
	gtk_box_pack_start (GTK_BOX (box1),
		pixmapwid, FALSE, FALSE, 3);

	gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 3);

	gtk_widget_show(pixmapwid);
	gtk_widget_show(label);

	return(box1);
}

void callback(
	GtkWidget *widget,
	gpointer data )
{
	g_print ("Hello again - %s was pressed\n", (char *) data);
}


int main( int argc,	char *argv[] )
{
	GtkWidget *window;
	GtkWidget *button;
	GtkWidget *box1;

	gtk_init (&argc, &argv);

	/* Новое окно */
	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

	gtk_window_set_title (GTK_WINDOW (window), "Pixmap'd Buttons!");

	/* Хммм. может макрос для этого придумать.... */
	gtk_signal_connect (GTK_OBJECT (window), "destroy",
		GTK_SIGNAL_FUNC (gtk_exit), NULL);

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

	/* Установить ширину невидимой границу. */
	gtk_container_set_border_width (GTK_CONTAINER (window), 10);
	gtk_widget_realize(window);

	/* Новая кнопка */
	button = gtk_button_new ();

	/* Обработчик события "clicked" */
	gtk_signal_connect (GTK_OBJECT (button), "clicked",
		GTK_SIGNAL_FUNC (callback), (gpointer) "cool button");

	/* Вызываем ту самую функцию */
	box1 = xpm_label_box(window, "info.xpm", "cool button");

	/* Покажем все миру */
	gtk_widget_show(box1);

	gtk_container_add (GTK_CONTAINER (button), box1);

	gtk_widget_show(button);

	gtk_container_add (GTK_CONTAINER (window), button);

	gtk_widget_show (window);

	gtk_main ();

	return(0);
}

Вот так это безобразие выглядит:

gif/11_1.gif (3487 b)

В следующем шаге рассмотрим другие виды кнопок...


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