| 
 виджет - кнопкаобычные кнопкивы
уже много раз видели процесс создания
виджетов. это довольно просто. есть
несколько способов создавать кнопки.
вы можете использовать
gtk_button_new_with_label() или gtk_button_new_with_mnemonic()
чтобы создать кнопку с ярлыком, или
используйте gtk_button_new_from_stock (), чтобы
создать кнопку, содержащую изображение
и текст. или gtk_button_new(), чтобы создать
чистую кнопку, в которую вы сможете
упаковать ярлык или pixmap(картинку). для
этого нужно создать контейнер, упаковать
в этот контейнер необходимый объект
используя gtk_box_pack_start(), и с помощью
gtk_container_add() упаковать контейнер в кнопку. вот
пример использования gtk_button_new(), для
создания кнопки с изображением и текстом
внутри. я отделил код создания контейнера
от остального, вы можете поступать также
в своих программмах. дальше в этом
руководстве будут приведены ещё примеры
использования изображений. 
 
	
		| #include <stdlib.h>
#include <gtk/gtk.h>
/* создаём новый контейнер hbox содержащий изображение и текст 
 * и возвращаем контейнер. */
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);
}
int main( int   argc,
          char *argv[] )
{
    /* gtkwidget является типом хранения для виджетов */
    gtkwidget *window;
    gtkwidget *button;
    gtkwidget *box;
    gtk_init (&argc, &argv);
    /* создаём новое окно */
    window = gtk_window_new (gtk_window_toplevel);
    gtk_window_set_title (gtk_window (window), "pixmap'd buttons!");
    /* хорошая идея сделать это для всех окон. */
    g_signal_connect (g_object (window), "destroy",
                      g_callback (gtk_main_quit), null);
    g_signal_connect (g_object (window), "delete_event",
                      g_callback (gtk_main_quit), null);
    /* устанавливаем окантовку для окна. */
    gtk_container_set_border_width (gtk_container (window), 10);
    /* создаём новую кнопку */
    button = gtk_button_new ();
    /* соединяем сигнал нажатия "clicked" кнопки с обратным вызовом */
    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;
} |  функция
xpm_label_box() может быть использована для
упаковки изображений и надписей в любой
виджет способный выступать в роли
контейнера. виджет кнопка, имеет
следующие сигналы: 
	pressed -
	посылается, когда кнопка нажата в
	пределах её размеровreleased -
	посылается, когда кнопка отжата в
	пределах её размеровclicked - когда
	кнопка нажата и отпущена в пределах
	размеров виджетаenter - когда
	курсор мыши входит в пределы кнопкиleave - когда
	курсор выходит из области, где нарисована
	кнопка 
 
 
 |