18.10.2009 21:29
predator — Первые программы
ОригиналВ этой части нашего руководства мы создадим наши первые программы с использованием GTK+.
Простой пример.
Мы начнем с простого примера.
Этот пример создаст на экране простое окно.
gcc -o simple simple.c `pkg-config --libs --cflags gtk+-2.0`
Здесь мы компилируем нашу программу.
gtk_init(&argc;, &argv;);
Инициализирует использование GTK+.
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
Здесь мы создаем виджет типа GtkWindow. GTK_WINDOW_TOPLEVEL это тип окна. Окна этого типа имеют заголовок и рамку. Ими управляет менеджер окон.
gtk_widget_show(window);
После создания виджета мы отображаем его на экране.
gtk_main();
Эта функция вызывает главный цикл GTK+ приложений для обработки событий (нажатие клавишь клавиатуры и т.д.).Вот что у нас должно получиться.
Центрирование окна.
Если мы сами не укажем позицию окна на экране, менеджер окон сделает это за нас. В следующем примере мы расположим наше окно по центру.
gtk_window_set_title(GTK_WINDOW(window), "Center");
Эта функция установит заголовок окна. Если мы не сделаем этого сами, GTK+ будет использовать в качестве заголовка имя исходного файла.
gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);
Этот код устанавливает размер окна 230 на 150 пикселей. Имейте ввиду, что сюда не входит рамка окна или любые другие декорации оконного менеджера.
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
Устанавливает окно в центре экрана.
g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
В предыдущей программе окно не до конца завершало свою работу, если мы нажимали на х. Мы можем увидеть это запустив его из коммандной строки. По-умолчанию окно никак не воспринимало сигнал о закрытии окна (сигнал destroy). Мы должны явно связать сигнал о закрытии окна с функцией gtk_main_quit().Иконка приложения.
В следующем примере мы покажем как создать иконку для нашего приложения. Большинство менеджеров окон отображают иконку в левом углу заголовка окна и на панели задач.
Пример с использованием иконки в приложении.
gtk_window_set_icon(GTK_WINDOW(window), create_pixbuf("web.png"));
Функция gtk_window_set_icon() отображает иконку для нашего приложения. create_pixbuf() создает GdkPixbuf из png файла.
pixbuf = gdk_pixbuf_new_from_file(filename, &error;);
Согласно документации, функция gdk_pixbuf_new_from_file() создает объект типа GdkPixbuf из файла с изображением. Формат файла определяется автоматически. Функция возвращает NULL (NULL это специальный указатель на недоступную для приложения область памяти) в случае ошибки.Увеличение - уменьшение.
Мы закончим первую часть нашего руководства ещё одним примером. Здесь у нас будет три дочерних виджета. Две кнопки (buttons) и метка (label). Метка будет содержать целое число. С помощью кнопок это число можно будет увеличивать и уменьшать.
Этот пример показывает как можно изменять значение в GtkLabel.
g_signal_connect(plus, "clicked", G_CALLBACK(increase), label);
Мы соединяем increase() с кнопкой плюс (в данном контексте функцию increase() принято называть функцией обратного вызова). Имейте ввиду, что мы должны передавать метку в качестве параметра функции обратного вызова. Мы изменяем метку внутри функции.
count++;
sprintf(buf, "%d", count);
gtk_label_set_text(label, buf);
Увеличив значение переменной и преобразовав его в строку мы передаем в функцию gtk_label_set_text новый текст, который будет отображать метка.sprintf(buf, "%d", count);
gtk_label_set_text(label, buf);
Kraplax 18.10.2009 22:04 #
+ 0 -
Поправил оформление, добавил теги. Впредь постарайтесь использовать тег &lgt;code&rgt; для оформления кусков кода. То, что номера строк сползают слегка - позже можно будет в стилях пофиксить, равно как и белый фон (его желательно сделать слегка серым).
Все равно, мне кажется, до этого лучше выглядело. И с амперсандами проблема. Номера строк здесь не обязательны
Спасибо тебе... Прям огромное спасибо. Для меня сейчас крайне актуальна эта тема.
нет, они такие и были. либо я что-то испортил пока поправлял :(
Автор, глянь что там с инклудами?
Автор, глянь что там с инклудами?
лол, видимо парсер думает что это теги =)
там везде стоит gtk/gtk.h
И ещё тем кто будет переписывать примеры, & на заменить на обычный амперсанд. А лучше берите из оригинала.
PS: было же все норм оформлено ...
там везде стоит gtk/gtk.h
И ещё тем кто будет переписывать примеры, & на заменить на обычный амперсанд. А лучше берите из оригинала.
PS: было же все норм оформлено ...
поправил еще раз - в общем, нужно < перед копипастом заменять на <, а > — на >.
Немножко текст сливается. Трудновато читать.
Я вот чего-то никак не могу понять, как там работает расположение виджетов. Бился с Glade, но чот так и не понял :(. Могли бы описать?
Я вот чего-то никак не могу понять, как там работает расположение виджетов. Бился с Glade, но чот так и не понял :(. Могли бы описать?
Об этом в четвертой части. Но уже сейчас могу сказать, что это будет похоже на менеджеры компоновки Qt.
Нет, ну принцип то понятен. Но виджеты ведут себя странно ИМХО :).
Будем ждать 4-й части :).
Будем ждать 4-й части :).
А вам не кажется, что мануалов по GTK+ на C в сети и так полно, а вот толкового руководства по GTKmm на C++ нет. Может, напишете? Буду очень признателен, давно хотел разобраться с ним.
Мне кажется. что разобравшись с одним языком не составить большого труда разобраться с привязкой к другому.