виджет - кнопка
обычные кнопки
вы
уже много раз видели процесс создания
виджетов. это довольно просто. есть
несколько способов создавать кнопки.
вы можете использовать
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 - когда
курсор выходит из области, где нарисована
кнопка
|