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

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

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

  submenu, NULL, NULL, 0, NULL, 0, 0, NULL},

 {GNOME_APP_UI_ENDOFINFO, NULL, NULL, null,

  NULL, NULL, 0, NULL, 0, 0, NULL}

};

static GnomeUIInfo menubar[] = {

 {GNOME_APP_UI_SUBTREE, "Toplevel Item", NULL,

  menu, NULL, NULL, 0, NULL, 0, 0, NULL},

 {GNOME_APP_UI_ENDOFINFO, NULL, NULL, NULL,

  NULL, NULL, 0, NULL, 0, 0, NULL}

};

3. Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main Π²Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ Π΄Π΅Π»ΠΎ с ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ Π·Π°Ρ‚Π΅ΠΌ создаСтС ваш Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ GnomeApp ΠΈ Π·Π°Π΄Π°Π΅Ρ‚Π΅ всС мСню:

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

 GtkWidget *app;

 gnome_program_init("gnome1", "0.1", LIBGNOMEUI_MODULE,

  argc, argv, GNOME_PARAM_NONE);

 app = gnome_app_new("gnome1", "Menus, menus, menus");

 gtk_window_set_default_size(GTK_WINDOW(app), 300, 200);

 g_signal_connect(GTK_OBJECT(app), "destroy",

  GTK_SIGNAL_FUNC(closeApp), NULL);

 gnome_app_create_menus(GNOME_APP(app), menubar);

 gtk_widget_show(app);

 gtk_main();

 return 0;

}

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ menu1 ΠΈ посмотритС Π² дСйствии строку мСню, подмСню ΠΈ мСню GNOME ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π½Π° рис. 16.12.

Рис. 16.12


Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° GnomeUIInfo Π΅Π΄Π²Π° Π»ΠΈ друТСствСнная ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ программисту, Ссли ΡƒΡ‡Π΅ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° состоит ΠΈΠ· 11 элСмСнтов, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π°Π²Π½ΠΎ NULL ΠΈΠ»ΠΈ Π½ΡƒΠ»ΡŽ. ΠŸΡ€ΠΈ ΠΈΡ… Π²Π²ΠΎΠ΄Π΅ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΈ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ»Π΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π² Π΄Π»ΠΈΠ½Π½ΠΎΠΌ массивС элСмСнтов. Для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ слоТившСйся ситуации Π² срСдС GNOME ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ макросы, ΡƒΡΡ‚Ρ€Π°Π½ΡΡŽΡ‰ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ опрСдСлСния структур Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. Π­Ρ‚ΠΈ макросы Ρ‚Π°ΠΊΠΆΠ΅ Π²ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π½Ρ‹Π΅ аксСлСраторы для вас, ΠΈ всС Π΄Π°Ρ€ΠΎΠΌ. На самом Π΄Π΅Π»Π΅ Ρ€Π΅Π΄ΠΊΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹, Π·Π°ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вмСсто Π½ΠΈΡ… Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅.

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π° Π½Π°Π±ΠΎΡ€Π° макросов, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… опрСдСляСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡƒΠ½ΠΊΡ‚Ρ‹ мСню. Π­Ρ‚ΠΈ макросы ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°: ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

#include <libgnomeui/libgnameui.h>

#define GNOMEUIINFO_MENU_OPEN_ITEM(cb, data)

#define GNOMEUIINFO_MENU_SAVE_ITEM(cb, data)

#define GNOMEUIINFO_MENU_SAVE_AS_IΠ’Π•Πœ(cb, data)

#define GNOMEUIINFO_MENU_PRINT_ITEM(cb, data)

#define GNOMEUIINFO_MENU_PRINT_SETUP_ITEM(cb, data)

#define GNOMEUIINFO_MENU_CLOSE_IΠ’Π•Πœ(cb, data)

#define GNOMEUIINFO_MENU_EXIT_IΠ’Π•Πœ(cb, data)

#define GNOMEUIINFO_MENU_QUIT_IΠ’Π•Πœ(cb, data)

#define GNOMEUIINFO_MENU_CUT_ITEM(cb, data)

#define GNOMEUIINFO_MENU_COPY_ITEM(cb, data)

#define GNOMEUIINFO_MENU_PASTE_ITEM(cb, data)

#define GNOMEUIINFO_MENU_SELECT_ALL_ITEM(cb, data)

...

Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π½Π°Π±ΠΎΡ€ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня, Π² Π½Π΅Π³ΠΎ Π²Ρ‹ просто ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅ массив.

#define GNOMEUIINFO_MENU_FILE_TREE     (tree)

#define GNOMEUIINFO_MENU_EDIT_TREE     (tree)

#define GNOMEUIINFO_MENU_VIEW_TREE     (tree)

#define GNOMEUIINFO_MENU_SETTINGS_TREE (tree)

#define GNOMEUIINFO_MENU_FILES_TREE    (tree)

#define GNOMEUIINFO_MENU_WINDOWS_TREE  (tree)

#define GNOMEUIINFO_MENU_HELP_TREE     (tree)

#define GNOMEUIINFO_MENU_GAME_TREE     (tree)

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.10.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.10. МСню с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ макросов GNOME

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ ΡƒΠΆΠ΅ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ мСню ΠΈ посмотритС, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ макросы. ВнСситС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ измСнСния Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ menu1.с ΠΈ Π½Π°Π·ΠΎΠ²ΠΈΡ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ menu2.c. Для простоты Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ для ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² мСню Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС наша Π·Π°Π΄Π°Ρ‡Π° β€” просто ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ удобство примСнСния макросов GNOME, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… мСню.

#include <gnome.h>


static GnomeUIInfo filemenu[] = {

 GNOMEUIINFO_MENU_NEW_ITEM("New", "Menu Hint", NULL, NULL),

 GNOMEUIINFO_MENU_OPEN_ITEM(NULL, NULL),

 GNOMEUIINFO_MENU_SAVE_AS_ITEM(NULL, NULL),

 GNOMEUIINFO_SEPARATOR,

 GNOMEIINFO_MENU_EXIT_ITEM(NULL, NULL),

 GNOMEUUINFO_END

};


static GnomeUUInfo editmenu[] =

 GNOMEUIINFO_MENU_FIND_ITEM(NULL, NULL),

 GNOMEUIINFO_END

};


static GnomeUIInfo menubar[] = {

 GNOMEUIINFO_MENU_FILE_TREE(filemenu),

 GNOMEUIINFO_MENU_EDIT_TREE(editmenu),

 GNOMEUIINFO_END

};


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

 GtkWidget *app, *toolbar;

 gnome_program_init("gnome1", "0.1", LIBGNOMEUI_MODULE,

  argc, argv, GNOME_PARAM_NONE);

 app = gnome_app_new("gnome1", "Menus, menus, menus");

 gtk_window_set_default_size(GTK_WINDOW(app), 300, 200);

 gnome_app_create_menus(GNOME_APP(app), menubar);

 gtk_widget_show(app);

 gtk_main();

 return 0;

}

ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² макросы libgnomeui Π² menu2.c, Π²Ρ‹ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сократили ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ Π½Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ, ΠΈ сдСлали Π΅Π³ΠΎ Π³ΠΎΡ€Π°Π·Π΄ΠΎ понятнСС. ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ экономят вашС врСмя ΠΈ усилия, ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹Π΅ для создания мСню ΠΈ согласования тСкста мСню, ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π½Ρ‹Ρ… аксСлСраторов ΠΈ ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ прилоТСниями GNOME. Π‘Ρ‚Π°Ρ€Π°ΠΉΡ‚Π΅ΡΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ… Π² Π²Π°ΡˆΠΈΡ… прилоТСниях ΠΏΡ€ΠΈ любой возмоТности.

На рис. 16.13 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° menu3.c Π² дСйствии Π½Π° сСй Ρ€Π°Π· со стандартизованными Π² срСдС GNOME ΠΏΡƒΠ½ΠΊΡ‚Π°ΠΌΠΈ мСню.

Рис. 16.13

Π”ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π°

Основная Ρ‡Π°ΡΡ‚ΡŒ любого прилоТСния GUI β€” взаимодСйствиС с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΅Π³ΠΎ ΠΎ Π²Π°ΠΆΠ½Ρ‹Ρ… событиях. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ для этого Π²Ρ‹ создаСтС Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ с ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ OK ΠΈ Cancel ΠΈ, Ссли информация Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π°ΠΆΠ½Π°, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°, Π²Π°ΠΌ приходится Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ доступ ΠΊΠΎ всСм ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠΊΠ½Π°ΠΌ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ сдСлаСт Π²Ρ‹Π±ΠΎΡ€ (Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΠΊΠ½Π° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹ΠΌΠΈ ΠΎΠΊΠ½Π°ΠΌΠΈ).

ΠœΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ описали Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, ΠΈ Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π΅ GTK+ Π΅ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΎΠΊΠΎΠ½, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°ΠΌΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° GtkWindow, Ρ‡Ρ‚ΠΎ сущСствСнно ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚ΡΠΊΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

GtkDialog

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ GtkDialog β€” ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° GtkWindow ΠΈ наслСдуСт всС Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ свойства.

GtkWindow

 +----GtkDialog

GtkDialog Π΄Π΅Π»ΠΈΡ‚ ΠΎΠΊΠ½ΠΎ Π½Π° Π΄Π²Π΅ области, ΠΎΠ΄Π½Π° для содСрТимого Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΈ другая для ΠΊΠ½ΠΎΠΏΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ вдоль Π½ΠΈΠΆΠ½Π΅Π³ΠΎ края ΠΎΠΊΠ½Π°. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π΄Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ Π²Π°ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Π²ΠΎ врСмя Π΅Π³ΠΎ создания.

GtkWidget* gtk_dialog_new_with_buttons(const gchar *title,

 GtkWindow *parent, GtkDialogFlags flags,

 const gchar *first button text, ...);

Π­Ρ‚Π° функция создаСт Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ с Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, parent, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ вашСго прилоТСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚ GTK+ ΠΌΠΎΠ³ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ остаСтся присоСдинСнным ΠΊ Π³Π»Π°Π²Π½ΠΎΠΌΡƒ ΠΎΠΊΠ½Ρƒ ΠΈ минимизируСтся ΠΏΡ€ΠΈ сворачивании Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ flags опрСдСляСт ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ свойств Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°:

β–‘ GTK_DIALOG_MODAL;

β–‘ GTK_DIALOG_DESTROY_WITH_PARENT;

β–‘ GTK_DIALOG_NO_SEPARATOR.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π»Π°Π³ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ поразрядной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ OR; Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, комбинация GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ модальноС ΠΎΠΊΠ½ΠΎ, ΠΈ ΠΎΠΊΠ½ΠΎ Π±Π΅Π· Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ основной ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ ΠΎΠΊΠ½Π° ΠΈ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ ΠΊΠ½ΠΎΠΏΠΎΠΊ.

ΠžΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ β€” это NULL-Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ список ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΈ ΠΊΠΎΠ΄ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ°. Π’Ρ‹ ΠΏΠΎΠΉΠΌΠ΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ этот ΠΊΠΎΠ΄ ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ°, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚Π΅ΡΡŒ с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ gtk_dialog_run. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ ΠΈΠ· Π΄Π»ΠΈΠ½Π½ΠΎΠ³ΠΎ списка Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΊΠ½ΠΎΠΏΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ опрСдСляСт GTK+, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΊΠ½ΠΎΠΏΠΊΠ°Ρ….

Π”Π°Π»Π΅Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ Π±Ρ‹ Π²Ρ‹ создавали Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ с ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ OK ΠΈ Cancel, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ GTK_RESPONSE_ACCEPT ΠΈ GTK_RESPONSE_REJECT ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ этих ΠΊΠ½ΠΎΠΏΠΎΠΊ:

GtkWidget *dialog = gtk_dialog_new_with_buttons("Important question",

 parent_window,

 GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK,

 GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL,

 GTK_RESPONSE_REJECT, NULL);

ΠœΡ‹ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΈΡΡŒ Π½Π° Π΄Π²ΡƒΡ… ΠΊΠ½ΠΎΠΏΠΊΠ°Ρ…, Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ Π½Π° количСство ΠΊΠ½ΠΎΠΏΠΎΠΊ Π² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ Π½Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΈΠ· ряда Ρ„Π»Π°Π³ΠΎΠ² Ρ‚ΠΈΠΏΠ° ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ°. Π€Π»Π°Π³ΠΈ accept (ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ) ΠΈ reject (ΠΎΡ‚Π²Π΅Ρ€Π³Π½ΡƒΡ‚ΡŒ) Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π² стандартС GNOME ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Π²Π°ΡˆΠΈΡ… прилоТСниях ΠΏΠΎ Π²Π°ΡˆΠ΅ΠΌΡƒ ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ. (ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ accept Π² вашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ "ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ".) Π”Ρ€ΡƒΠ³ΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΎΡ‚ΠΊΠ»ΠΈΠΊ OK ΠΈ CANCEL, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² Ρ‚ΠΈΠΏΠ΅ GtkResponseType enum Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

ЕстСствСнно, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ содСрТимоС Π² вашС Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΈ для этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ GtkDialog содСрТит Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ GtkVBox для заполнСния Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ. Π’Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ прямо ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°:

GtkWidget *vbox = GTK_DIALOG(dialog)->vbox;

Π­Ρ‚ΠΎΡ‚ GtkVBox примСняСтся ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ способом с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gtk_box_pack_start ΠΈΠ»ΠΈ Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ.

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ создано, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг β€” ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΈ ΠΆΠ΄Π°Ρ‚ΡŒ ΠΎΡ‚ Π½Π΅Π³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π°. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ двумя способами: Π² модальном Ρ€Π΅ΠΆΠΈΠΌΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ вСсь Π²Π²ΠΎΠ΄ Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, ΠΈΠ»ΠΈ Π² нСмодальном Ρ€Π΅ΠΆΠΈΠΌΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ воспринимаСт Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΊΠ°ΠΊ любоС Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ. Π”Π°Π²Π°ΠΉΡ‚Π΅ сначала рассмотрим запуск модального Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°.