Видео ролики бесплатно онлайн

Смотреть ева элфи видео

Официальный сайт jetune 24/7/365

Смотреть видео бесплатно

18.10.2009 21:29

predatorПервые программы

Оригинал
В этой части нашего руководства мы создадим наши первые программы с использованием GTK+.

Простой пример.


Мы начнем с простого примера.
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <gtk/gtk.h>

int main( int argc, char *argv
)
{
GtkWidget *window;

gtk_init(&argc;, &argv;);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_show(window);

gtk_main();

return 0;
}


Этот пример создаст на экране простое окно.
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+ приложений для обработки событий (нажатие клавишь клавиатуры и т.д.).
=Simple window
Вот что у нас должно получиться.

Центрирование окна.


Если мы сами не укажем позицию окна на экране, менеджер окон сделает это за нас. В следующем примере мы расположим наше окно по центру.
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include  <gtk/gtk.h>

int main( int argc, char *argv
)
{
GtkWidget *window;

gtk_init(&argc;, &argv;);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Center");
gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_widget_show(window);

g_signal_connect_swapped(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);

gtk_main();

return 0;
}

В этом примере мы расположили окно в центре, установили свой заголовок и изменили размер окна.
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().

Иконка приложения.


В следующем примере мы покажем как создать иконку для нашего приложения. Большинство менеджеров окон отображают иконку в левом углу заголовка окна и на панели задач.
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include  <gtk/gtk.h>

GdkPixbuf *create_pixbuf(const gchar * filename)
{
GdkPixbuf *pixbuf;
GError *error = NULL;
pixbuf = gdk_pixbuf_new_from_file(filename, &error;);
if(!pixbuf) {
fprintf(stderr, "%s\n", error-&gt;message);
g_error_free(error);
}

return pixbuf;
}

int main( int argc, char *argv
)
{
GtkWidget *window;

gtk_init(&argc;, &argv;);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "icon");
gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_icon(GTK_WINDOW(window), create_pixbuf("web.png"));
gtk_widget_show(window);

g_signal_connect_swapped(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);

gtk_main();

return 0;
}


Пример с использованием иконки в приложении.
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 это специальный указатель на недоступную для приложения область памяти) в случае ошибки.
=Window with icon=Taskbar

Увеличение - уменьшение.


Мы закончим первую часть нашего руководства ещё одним примером. Здесь у нас будет три дочерних виджета. Две кнопки (buttons) и метка (label). Метка будет содержать целое число. С помощью кнопок это число можно будет увеличивать и уменьшать.
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include  <gtk/gtk.h>
gint count = 0;
char buf<5>;

void increase(GtkWidget *widget, gpointer label)
{
count++;

sprintf(buf, "%d", count);
gtk_label_set_text(label, buf);
}

void decrease(GtkWidget *widget, gpointer label)
{
count--;

sprintf(buf, "%d", count);
gtk_label_set_text(label, buf);
}

int main(int argc, char** argv) {

GtkWidget *label;
GtkWidget *window;
GtkWidget *frame;
GtkWidget *plus;
GtkWidget *minus;

gtk_init(&argc;, &argv;);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 250, 180);
gtk_window_set_title(GTK_WINDOW(window), "+-");

frame = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window), frame);

plus = gtk_button_new_with_label("+");
gtk_widget_set_size_request(plus, 80, 35);
gtk_fixed_put(GTK_FIXED(frame), plus, 50, 20);

minus = gtk_button_new_with_label("-");
gtk_widget_set_size_request(minus, 80, 35);
gtk_fixed_put(GTK_FIXED(frame), minus, 50, 80);

label = gtk_label_new("0");
gtk_fixed_put(GTK_FIXED(frame), label, 190, 58);

gtk_widget_show_all(window);

g_signal_connect(window, "destroy",
G_CALLBACK (gtk_main_quit), NULL);

g_signal_connect(plus, "clicked",
G_CALLBACK(increase), label);

g_signal_connect(minus, "clicked",
G_CALLBACK(decrease), label);

gtk_main();

return 0;
}


Этот пример показывает как можно изменять значение в 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 новый текст, который будет отображать метка.
=PlusMinus window


Тэги: c++ cpp Gtk+ GUI programming программирование
+ 15 -
Похожие Поделиться

Kraplax 18.10.2009 22:04 #
+ 0 -
Поправил оформление, добавил теги. Впредь постарайтесь использовать тег &lgt;code&rgt; для оформления кусков кода. То, что номера строк сползают слегка - позже можно будет в стилях пофиксить, равно как и белый фон (его желательно сделать слегка серым).
predator 18.10.2009 22:08 #
+ 1 -
Все равно, мне кажется, до этого лучше выглядело. И с амперсандами проблема. Номера строк здесь не обязательны
bosha 18.10.2009 22:23 #
+ 2 -
Спасибо тебе... Прям огромное спасибо. Для меня сейчас крайне актуальна эта тема.
predator 18.10.2009 22:32 #
+ 3 -
Рад стараться =)
philosoft 18.10.2009 23:43 #
+ 0 -
А инклуды только у меня пустые?
Kraplax 19.10.2009 00:05 #
+ 0 -
нет, они такие и были. либо я что-то испортил пока поправлял :(
Автор, глянь что там с инклудами?
predator 19.10.2009 01:39 #
+ 0 -
лол, видимо парсер думает что это теги =)
там везде стоит gtk/gtk.h
И ещё тем кто будет переписывать примеры, & на заменить на обычный амперсанд. А лучше берите из оригинала.
PS: было же все норм оформлено ...
Kraplax 19.10.2009 06:06 #
+ 1 -
поправил еще раз - в общем, нужно < перед копипастом заменять на &lt;, а > — на &gt;.
Sov1et 18.10.2009 23:45 #
+ 0 -
Пишите ещё. Очень интересно.
digiwhite 19.10.2009 00:42 #
+ 0 -
Немножко текст сливается. Трудновато читать.

Я вот чего-то никак не могу понять, как там работает расположение виджетов. Бился с Glade, но чот так и не понял :(. Могли бы описать?
predator 19.10.2009 01:41 #
+ 1 -
Об этом в четвертой части. Но уже сейчас могу сказать, что это будет похоже на менеджеры компоновки Qt.
digiwhite 19.10.2009 06:42 #
+ 0 -
Нет, ну принцип то понятен. Но виджеты ведут себя странно ИМХО :).

Будем ждать 4-й части :).
greatperson 19.10.2009 06:17 #
+ -1 -
А вам не кажется, что мануалов по GTK+ на C в сети и так полно, а вот толкового руководства по GTKmm на C++ нет. Может, напишете? Буду очень признателен, давно хотел разобраться с ним.
bosha 19.10.2009 10:12 #
+ 1 -
Они англоязычные в основном.
predator 19.10.2009 13:40 #
+ 0 -
Мне кажется. что разобравшись с одним языком не составить большого труда разобраться с привязкой к другому.
Kraplax 19.10.2009 15:05 #
+ 0 -
/me после камента про англоязычные ресурсы представил, как переводчик разбирается с привязками к китайскому языку в немецком языке :P

Смотреть онлайн бесплатно

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн