Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 284

Автор ΠœΡΡ‚ΡŒΡŽ НСйл

Π’ Ρ‚Π°Π±Π». 16.1 описаны ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ

gtk_box_pack_start
ΠΈΠ»ΠΈ
gtk_box_pack_end
.

Π’Π°Π±Π»ΠΈΡ†Π° 16.1

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ОписаниС
GtkBox *box
ЗаполняСмый ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€
GtkWidget *child
Π’ΠΈΠ΄ΠΆΠ΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слСдуСт ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€
gboolean expand
Если Ρ€Π°Π²Π΅Π½
TRUE
, Π΄Π°Π½Π½Ρ‹ΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ всС доступноС пространство, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ совмСстно с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… этот Ρ„Π»Π°Π³ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π²Π΅Π½
TRUE
gboolean fill
Если Ρ€Π°Π²Π΅Π½
TRUE
, Π΄Π°Π½Π½Ρ‹ΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ всю Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ вмСсто использования Π΅Π΅ ΠΊΠ°ΠΊ отступа ΠΎΡ‚ ΠΊΡ€Π°Π΅Π². ДСйствуСт, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Ρ„Π»Π°Π³
expand
Ρ€Π°Π²Π΅Π½
TRUE
guint padding
Π Π°Π·ΠΌΠ΅Ρ€ отступа Π²ΠΎΠΊΡ€ΡƒΠ³ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π² пиксСлах

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим эти Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² ΠΈ создадим Π±ΠΎΠ»Π΅Π΅ слоТный ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ (ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.3).

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.3. ΠœΠ°ΠΊΠ΅Ρ‚ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ спланируСтС Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… простых Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ²-ΠΌΠ΅Ρ‚ΠΎΠΊ Ρ‚ΠΈΠΏΠ°

GtkLabel
с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Ρ‚ΠΈΠΏΠ°
GtkHBox
ΠΈ
GtkVBox
. Π’ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹-ΠΌΠ΅Ρ‚ΠΊΠΈ β€” простыС графичСскиС элСмСнты, подходящиС для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… тСкстовых Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ². НазовитС эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ container.c:

#include <gtk/gtk.h>

void closeApp(GtkWidget *window, gpointer data) {

Β gtk_main_quit();

}

/* ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² позволяСт ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ событиС

Β Β  close/destroy. (Для ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ TRUE.) */

gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) {

Β printf("In delete_event\n");

Β return FALSE;

}

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

Β GtkWidget *window;

Β GtkWidget *label1, *label2, *label3;

Β GtkWidget *hbox;

Β GtkWidget *vbox;

Β gtk_init(&argc, &argv);

Β window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

Β gtk_window_set_title(GTK_WINDOW window), "The Window Title");

Β gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

Β gtk_window_set_default_size(GTK_WTNDOW(window), 300, 200);

Β g_signal_connect(GTK_OBJECT(window), "destroy",

Β  GTK_SIGNAL_FUNC(closeApp), NULL);

Β g_signal_connect(GTK_OBJECT(window), "delete_event",

Β  GTK_SIGNAL_FUNC(delete_event), NULL);

Β label1 = gtk_label_new("Label 1");

Β label2 = gtk_label_new("Label 2");

Β label3 = gtk_label_new("Label 3");

Β hbox = gtk_hbox_new(TRUE, 5);

Β vbox = gtk_vbox_new(FALSE, 10);

Β gtk_box_pack_start(GTK_BOX(vbox), label1, TRUE, FALSE, 5);

Β gtk_box_pack_start(GTK_BOX(vbox), label2, TRUE, FALSE, 5);

Β gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 5);

Β gtk_box_pack_start(GTK_BOX(hbox), label3, FALSE, FALSE, 5);

Β gtk_container_add(GTK_CONTAINER(window), hbox);

Β gtk_widget_show_all(window);

Β gtk_main();

Β return 0;

}

Когда Π²Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Ρ‚ΠΎ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ схСму располоТСния Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ²-ΠΌΠ΅Ρ‚ΠΎΠΊ Π² вашСм ΠΎΠΊΠ½Π΅ (рис. 16.6).

ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² Linux - image056.jpg

Рис. 16.6

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Π’Ρ‹ создаСтС Π΄Π²Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ²:

hbox
ΠΈ
vbox
. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
gtk_box_pack_start
Π²Ρ‹ заполняСтС
vbox
Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ
label1
ΠΈ
label2
, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ
label2
располагаСтся Ρƒ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ края ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ вставляСтся послС
label1
. Π”Π°Π»Π΅Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€
vbox
Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ наряду с ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ
label3
вставляСтся Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€
hbox
.

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

hbox
добавляСтся Π² ΠΎΠΊΠ½ΠΎ ΠΈ выводится Π½Π° экран с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
gtk_widget_show_all
.

Π‘Ρ…Π΅ΠΌΡƒ размСщСния ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π»Π΅Π³Ρ‡Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±Π»ΠΎΠΊ-схСмы, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π½Π° рис. 16.7.

ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² Linux - image057.jpg

Рис. 16.7

Познакомившись с Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ, сигналами, ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌΠΈ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ ΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ, Π²Ρ‹ рассмотрСли основы ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π° инструмСнтов GTK+. Но для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΡ‚Π°Ρ‚ΡŒ программистом, ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΌ GTK+, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹.

Π’ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ GTK+

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим API самых популярных Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² GTK+, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‡Π°Ρ‰Π΅ всСго Π² своих прилоТСниях.

GtkWindow

GtkWindow
β€” Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ элСмСнт всСх ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ GTK+. Π”ΠΎ сих ΠΏΠΎΡ€ Π²Ρ‹ использовали Π΅Π³ΠΎ для хранСния своих Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ².

GtkWidget

Β +----Β GtkContainer