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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux: ПолноС руководство». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 129

Автор ДСнис ΠšΠΎΠ»ΠΈΡΠ½ΠΈΡ‡Π΅Π½ΠΊΠΎ

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ β€” это список, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ β€” это функция сравнСния Π΄Π²ΡƒΡ… элСмСнтов. Π’ΠΎΡ‚ Π΅Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ:

typedef gint (*GCompareFunc) (gconstpointer a, gconstpointer b); Π”Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. Она Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Ρ†Π΅Π»ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

♦ Π΅ΡΠ»ΠΈ a<b, Ρ‚ΠΎ -1 (Ρ‚ΠΎΡ‡Π½Π΅Π΅, любоС число мСньшС 0);

♦ Π΅ΡΠ»ΠΈ a==b, Ρ‚ΠΎ 0;

♦ Π΅ΡΠ»ΠΈ a>b, Ρ‚ΠΎ 1 (любоС число большС 0).

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Glib Ρ‚Π°ΠΊΠΆΠ΅ содСрТит срСдства для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π΅Ρ€Π΅Π²ΡŒΡΠΌΠΈ β€” ΠΊΠ°ΠΊ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ, Π½ΠΎ ΠΌΡ‹ эти срСдства Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ.

23.2.5. Π’Π°ΠΉΠΌΠ΅Ρ€Ρ‹ Π² Glib

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Glib позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹ Π² Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ….

Для этого Π½ΡƒΠΆΠ½ΠΎ:

♦ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» gtimer.h;

♦ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ GTimer *g_timer_new();

♦ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ g_timer_start(GTimer *timer);

♦ ΡƒΠ·Π½Π°Ρ‚ΡŒ врСмя, отсчитанноС Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠΌ β€” g_timer_elapsed();

♦ ΠΏΡ€ΠΈ нСобходимости ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ g_timer_reset(GTimer *timer);

♦ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ g_timer_stop(GTimer * timer);

♦ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠΈΡ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ β€” g_timer_destroy(GTimer *timer).

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ лишь Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ g_timer_elapsed(GTimer *timer, gulong *mcs). Данная функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число сСкунд, отсчитанноС Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠΌ. По адрСсу указатСля *mcs записываСтся число микросСкунд.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° прСдставлСн Π² листингС 23.1.

Листинг 23.1. ИспользованиС Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

#include <stdio.h>

#include <glib.h>

#include <gtimer.h>


int main() {

 double sec;

 gulong ms;

 int i;


 GTimer *timer = g_timer_new();


 printf("Π”Π°Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 10 сСкунд\n");

 g_timer_start(timer);


 for (i=1; i>0;) {

  sec = g_timer_elapsed(timer,&ms);

  if (sec >=10) {

   g_timer_stop(timer);

   printf("Π’Π°ΠΉΠΌΠ΅Ρ€ остановлСн. Мкс: %d\n",ms);

   break;

  }

 }


 g_timer_destroy(timer);


 return 0;

}

23.3. ΠŸΠ΅Ρ€Π²Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° GTK+

23.3.1. Π’ΠΈΠ΄ΠΆΠΈΡ‚Ρ‹

ΠŸΠ΅Ρ€Π΅Π΄ написаниСм самой простой GTK-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ GTK. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ графичСского интСрфСйса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ β€” ΠΎΠΊΠ½Π°, ΠΊΠ½ΠΎΠΏΠΊΠΈ, поля Π²Π²ΠΎΠ΄Π°, ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΠΈ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ β€” Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π²ΠΈΠ΄ΠΆΠΈΡ‚Π°ΠΌΠΈ.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌ элСмСнтом графичСского интСрфСйса являСтся ΠΎΠΊΠ½ΠΎ. Π’ΠΈΠ΄ΠΆΠΈΡ‚Ρ‹ для размСщСния Π² ΠΎΠΊΠ½Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€. Π’ самом ΠΎΠΊΠ½Π΅ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΆΠΈΡ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ…/Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… боксов ΠΈΠ»ΠΈ ΠΆΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†. Π’Ρ‚ΠΎΡ€ΠΎΠΉ способ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΎΠΊ, хотя ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π²Π°ΠΌ слоТнСС.

Π’ΠΈΠ΄ΠΆΠΈΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° сигналы, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‰Π΅Π»Ρ‡ΠΎΠΊ ΠΌΡ‹ΡˆΡŒΡŽ. ΠŸΡ€ΠΈ этом вызываСтся функция-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события (сигнала), Ссли Π²Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π΅Π΅.

Π Π°Π±ΠΎΡ‚Π° с Π²ΠΈΠ΄ΠΆΠΈΡ‚Π°ΠΌΠΈ происходит ΠΏΠΎ Ρ‚Π°ΠΊΠΎΠΉ схСмС:

1. ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠΈΡ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ GTK;

2. ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ свойств Π²ΠΈΠ΄ΠΆΠΈΡ‚Π°;

3. ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ сигналов Π²ΠΈΠ΄ΠΆΠΈΡ‚Π°, Ссли ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° сигналы;

4. Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠΈΡ‚Π° Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ привязка Π΅Π³ΠΎ ΠΊ ΠΎΠΊΠ½Ρƒ;

5. ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠΈΡ‚Π°.

НуТно ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π²ΠΈΠ΄ΠΆΠΈΡ‚, ΠΈΠ½Π°Ρ‡Π΅ Π΅Π³ΠΎ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚. НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° создаСт Π²ΠΈΠ΄ΠΆΠΈΡ‚ β€” ΠΊΠ½ΠΎΠΏΠΊΡƒ с тСкстом β€” ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π΅Π΅.

GtkWidget *button;


...

/* РисуСм ΠΊΠ½ΠΎΠΏΠΎΡ‡ΠΊΡƒ с надписью Hello, All */

button = gtk_button_new_with_label("Hello, All");


/* ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° функция hello() */

gtk_signal_connect(GTK_OBJECT (button), "clicked",

GTK_SIGNAL_FUNC(hello), NULL);


/* ΠŸΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΡƒ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ */

gtk_container_add(GTK_CONTAINER(window), button);


/* ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΡƒ. */

gtk_widget_show(button);

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ создаСт ΠΊΠ½ΠΎΠΏΠΊΡƒ (button), Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” добавляСт ΠΊΠ½ΠΎΠΏΠΊΡƒ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ являСтся нашС ΠΎΠΊΠ½ΠΎ. Π’ΠΈΠ΄ΠΆΠΈΡ‚ window Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ создан Ρ€Π°Π½ΡŒΡˆΠ΅: нСльзя ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Π±Π΅Π· ΠΎΠΊΠ½Π°. Π’ΠΎΡ‡Π½Π΅Π΅, ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ Ρ‚ΠΎΠ³Π΄Π° ΠΎΠ½Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ привязана ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ-Π»ΠΈΠ±ΠΎ ΠΎΠΊΠ½Ρƒ ΠΈ ΠΌΡ‹ Π΅Π΅ Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ. Ѐункция gtk_widget_show() ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π½Π°ΡˆΡƒ ΠΊΠ½ΠΎΠΏΠΊΡƒ. НС Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΈ само ΠΎΠΊΠ½ΠΎ. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ отобраТСния Π²ΠΈΠ΄ΠΆΠΈΡ‚ΠΎΠ² особой Ρ€ΠΎΠ»ΠΈ Π½Π΅ ΠΈΠ³Ρ€Π°Π΅Ρ‚, Π½ΠΎ рСкомСндуСтся Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π² послСднюю ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ.

23.3.2. Окна

БСйчас ΠΌΡ‹ напишСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая Π±ΡƒΠ΄Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСбольшоС графичСскоС окошко. НачнСм сразу с исходного ΠΊΠΎΠ΄Π° β€” Ρ‚Π°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ.

Листинг 23.2. ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ (Ρ„Π°ΠΉΠ» first.с)

#include <gtk/gtk.h>


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

 GtkWidget *window1;

 gtk_init(&argc, &argv);

 window1 = gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_window_set_title(GTK_WINDOW(window1), "Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ");

 gtk_widget_show(window1);

 gtk_main();

 return 0;

}

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» gtk/gtk.h β€” это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ условиС для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ GTK. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΡ‹ объявляСм наш основной (ΠΈ СдинствСнный Π² этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅) Π²ΠΈΠ΄ΠΆΠΈΡ‚ β€” Π²ΠΈΠ΄ΠΆΠΈΡ‚ основного ΠΎΠΊΠ½Π°:

GtkWidget *window1;

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π²ΠΈΠ΄ΠΆΠΈΡ‚ объявлСн, Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½ΠΈΠΌ ΠΏΠΎΠΊΠ° нСльзя. Π‘Π½Π°Ρ‡Π°Π»Π° (ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ GTK-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ) Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ gtk_init() ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅ΠΉ Π΄Π²Π° Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° β€” Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main(). ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π°, Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ gtk_window_new(), которая создаСт ΠΎΠΊΠ½ΠΎ (напомню, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΠ° ΠΎΠΊΠ½ΠΎ объявлСно, Π½ΠΎ Π½Π΅ создано). Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²ΠΈΠ΄ΠΆΠΈΡ‚ ΠΎΠΊΠ½Π° создан, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ свойства ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ€Π΅Π°ΠΊΡ†ΠΈΡŽ Π½Π° сигналы. Установим свойство Title (Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ) ΠΎΠΊΠ½Π°. Π­Ρ‚ΠΎ дСлаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gtk_window_set_title():

gtk_window_set_title(GTK_WINDOW(window1), "Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ");

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ нашС ΠΎΠΊΠ½ΠΎ:

gtk_widget_show(window1);

Π§Ρ‚ΠΎΠ±Ρ‹ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ³Π»ΠΎ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° события ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ срСды (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‰Π΅Π»Ρ‡ΠΎΠΊ ΠΌΡ‹ΡˆΠΈ), Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ gtk_main(). Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ gtk_init() ΠΈ gtk_main() Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² любой GTK-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Для этого Π²Π²Π΅Π΄Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС:

$ gcc first.с -о first `gtk-config --cflags` `gtk-config --libs`

Π€Π»Π°Π³ΠΈ `gtk config --cflags` `gtk-config --libs` Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ компиляции любой GTK-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Если компиляция Π½Π΅ удаСтся, Ρ‚ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ апострофы (`), Π° Π½Π΅ ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ ('), ΠΈ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° gtk-config Ρƒ вас установлСна.

Запустим Π½Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² эмуляторС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° X Window (ΠΈΠ»ΠΈ ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ срСды GNOME/KDE):

$ ./first

Π’Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΎΠΊΠ½ΠΎ, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½ΠΎΠ΅ Π½Π° рис. 23.1.

Рис. 23.1. ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°ΠΊΡ€ΠΎΠ΅ΠΌ ΠΎΠΊΠ½ΠΎ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρƒ: ΠΎΠΊΠ½ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎ, ΠΌΡ‹ Π΅Π³ΠΎ большС Π½Π΅ Π²ΠΈΠ΄ΠΈΠΌ, Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» Π½Π΅ освобоТдСн. Наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° событиС закрытия ΠΎΠΊΠ½Π°. По ΠΈΠ΄Π΅Π΅, ΠΊΠΎΠ³Π΄Π° графичСская срСда Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠΊΠ½ΠΎ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ. А наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° этого Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚. Π—Π½Π°Ρ‡ΠΈΡ‚, Π½ΡƒΠΆΠ½ΠΎ Β«Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΒ» Π΅Π΅ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° события (сигналы) ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ систСмы. Для этого Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ Ctrl+Π‘ ΠΈ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ исходный тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Листинг 23.3. Π”ΠΎΠ±Π°Π²ΠΈΠΌ Ρ€Π΅Π°ΠΊΡ†ΠΈΡŽ Π½Π° Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΎΠΊΠ½Π°

#include <gtk/gtk.h>


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

 GtkWidget *window1;

 gtk_init(*argc, &argv);

 window1 = gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(window1), "destroy",

  GTK_SIGNAL_FUNC(gtk_main_quit), NULL);

 gtk_widget_show(window1);

 gtk_main();

 return 0;

}

Ѐункция gtk_signal_connect() устанавливаСт Ρ€Π΅Π°ΠΊΡ†ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° window1 Π½Π° сигнал destroy ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ qtk_main_quit() для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

А Ρ‡Ρ‚ΠΎ Ссли Π½Π°ΠΌ ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ спСцифичСскиС дСйствия, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹? Π’ΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ свою Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события destroy (листинг 23.4).

Π­Ρ‚Π° функция Π±ΡƒΠ΄Π΅Ρ‚ называСтся destroy_window1(), ΠΈ ΠΌΡ‹ Β«ΠΏΡ€ΠΎΠΏΠΈΡˆΠ΅ΠΌΒ» Π΅Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gtk_signal_connect() Π² качСствС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° события закрытия ΠΎΠΊΠ½Π° вмСсто gtk_main_quit(). Π”Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ½Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ, просто Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ gtk_main_quit().

Листинг 23.4. ДобавляСм ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹

#include <gtk/gtk.h>


void destroy_window1(GtkWidget *widget, gpointer data);


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

 GtkWidget *window1;

 gtk_init(&argc, &argv);

 window1 = gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(window1), "destroy",

  (GtkSignalFunc)destroy_window1, &window1);

 gtk_widget_show(window1);

 gtk_main();

 return(0);

}


void destroy_window1(GtkWidget *widget, gpointer data) {

 gtk_main_quit();

}

23.3.3. ИзмСнСниС Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΎΠΊΠ½Π°

Π’Π°ΠΌ каТСтся, Ρ‡Ρ‚ΠΎ ΠΎΠΊΠ½ΠΎ слишком малСнькоС ΠΈ Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹? Для измСнСния Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΎΠΊΠ½Π° Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ