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

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

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

Π’ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² β€” Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹Π΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹, Π·Π°Π΄Π°Ρ‡Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… β€” Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΎΠΉ ΠΈΠ»ΠΈ схСмой размСщСния. Для управлСния Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ², содСрТащихся Π² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Π²Ρ‹ Π·Π°Π΄Π°Π΅Ρ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° вмСсто ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ GtkWidget ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ GtkBox сам являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Ρ‚ΠΈΠΏΠ° GtkWidget, для создания слоТных ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΠΊ ΠΌΠΎΠΆΠ½ΠΎ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ², Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ΄ΠΈΠ½ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

Π£ Ρ‚ΠΈΠΏΠ° GtkBox ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π° основных подкласса:

β–‘ GtkHBox β€” однострочный Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€;

β–‘ GtkVBox β€” одностолбцовый Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€.

ПослС создания ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² слСдуСт Π·Π°Π΄Π°Ρ‚ΡŒ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°: homogeneous ΠΈ spacing:

GtkWidget* gtk_hbox_new(gboolean homogeneous, gint spacing);

GtkWidget* gtk_vbox_new(gboolean homogeneous, gint spacing);

Π­Ρ‚ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΎΠΉ всСх Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ homogeneous β€” логичСский, Ссли ΠΎΠ½ Ρ€Π°Π²Π΅Π½ TRUE, Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡƒΡŽ ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ нСзависимо ΠΎΡ‚ ΠΈΡ… ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ². ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ spacing Π·Π°Π΄Π°Π΅Ρ‚ расстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ Π² пиксСлах.

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ создан, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² Π½Π΅Π³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ gtk_box_pack_start ΠΈ gtk_box_pack_end:

void gtk_box_pack_start(GtkBox *box, GtkWidget *child,

 gboolean expand, gboolean f ill, guint padding);

void gtk_box_pack_end(GtkBox *box, GtkWidget *child,

 gboolean expand, gboolean fill, guint padding);

Ѐункция gtk_box_pack_start вставляСт Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹, начиная ΠΎΡ‚ Π»Π΅Π²ΠΎΠ³ΠΎ края ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° GtkHBox ΠΈ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ края ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° GtkVBox; функция gtk_box_pack_end, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΎΡ‚ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΈ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΠΊΡ€Π°Π΅Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ расстояниСм ΠΌΠ΅ΠΆΠ΄Ρƒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°, находящСгося Π² ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅.

Π’ Ρ‚Π°Π±Π». 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).

Рис. 16.6


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

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

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

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

Рис. 16.7


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

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

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

GtkWindow

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

GtkWidget

 +---- GtkContainer

        +---- GtkBin

               +---- GtkWindow

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ дСсятки Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² API GtkWindow, Π½ΠΎ Π΄Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π·Π°ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ особого внимания.

GtkWidget* gtk_window_new(GtkWindowType type);

void gtk_window_set_title(GtkWindow *window, const gchar *title);

void gtk_window_set_position(GtkWindow *window, GtkWindowPosition position);

void gtk_window_set_default_size(GtkWindow *window, gint width, gint height);

void gtk_window_resize(GtkWindow *window, gint width, gint height);

void gtk_window_set_resizable(GtkWindow *window, gboolean resizable);

void gtk_window_present(GtkWindow *window);

void gtk_window_maximize(GtkWindow *window);

void gtk_window_unmaximize(GtkWindow *window);

Как Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, функция gtk_window_new создаСт Π² памяти Π½ΠΎΠ²ΠΎΠ΅ пустоС ΠΎΠΊΠ½ΠΎ. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΎΠΊΠ½Π° Π½Π΅ Π·Π°Π΄Π°Π½ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ мСстополоТСниС ΠΎΠΊΠ½Π° Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠΊΠ½ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ ΠΈ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ мСню ΠΈ панСль инструмСнтов ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ ΠΎΠΊΠ½Π° Π½Π° экран с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gtk_widget_show.

Ѐункция gtk_window_set_title измСняСт тСкст полосы Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, информируя ΠΎΠΊΠΎΠ½Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ запроса.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π·Π° ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ оформлСния ΠΎΠΊΠ½Π° ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ ΠΎΠΊΠΎΠ½Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€, Π° Π½Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° GTK+, ΡˆΡ€ΠΈΡ„Ρ‚, Ρ†Π²Π΅Ρ‚ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ тСкста зависят ΠΎΡ‚ вашСго Π²Ρ‹Π±ΠΎΡ€Π° ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°.

Ѐункция gtk_window_setposition управляСт Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ мСстополоТСниСм Π½Π° экранС. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ position ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, пСрСчислСнных Π² Ρ‚Π°Π±Π». 16.2.


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

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ position ОписаниС GTK_WIN_POS_NONE Окно располагаСтся ΠΏΠΎ ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° GTK_WIN_POS_CENTER Окно цСнтрируСтся Π½Π° экранС GTK_WIN_POS_MOUSE РасполоТСниС ΠΎΠΊΠ½Π° задаётся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΌΡ‹ΡˆΠΈ GTK_WIN_POS_CENTER_ALWAYS Окно остаСтся ΠΎΡ‚Ρ†Π΅Π½Ρ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ нСзависимо ΠΎΡ‚ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° GTK_WIN_POS_CENTER_ON_PARENT Окно цСнтрируСтся ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° (ΡƒΠ΄ΠΎΠ±Π½ΠΎ для Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΎΠΊΠΎΠ½)

Ѐункция gtk_window_set_default_size Π·Π°Π΄Π°Π΅Ρ‚ ΠΎΠΊΠ½ΠΎ Π½Π° экранС Π² Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Ρ… отобраТСния GTK+. Π―Π²Π½ΠΎΠ΅ Π·Π°Π΄Π°Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠΊΠ½Π° Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ содСрТимоС ΠΎΠΊΠ½Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎ Ρ‡Π΅ΠΌ-Π»ΠΈΠ±ΠΎ ΠΈΠ»ΠΈ скрыто. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΎΠΊΠ½Π° послС Π΅Π³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° экран, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ gtk_window_resize. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΎΠΊΠ½Π°, пСрСмСщая ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ способом Π΅Π³ΠΎ Π³Ρ€Π°Π½ΠΈΡ†Ρƒ ΠΌΡ‹ΡˆΡŒΡŽ. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ этому, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ gtk_window_set_resizeable, ΠΏΡ€ΠΈΡ€Π°Π²Π½Π΅Π½Π½ΡƒΡŽ FALSE.