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

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

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

Π‘ΡƒΠ΄Π΅Ρ‚ написан ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… дСйствий:

β–‘ Ρ€Π΅Π³ΠΈΡΡ‚рация Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· GUI;

β–‘ ΠΏΠΎΠΈΡΠΊ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-диска;

β–‘ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ свСдСний ΠΎ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС ΠΈ Π΅Π³ΠΎ Π΄ΠΎΡ€ΠΎΠΆΠΊΠ°Ρ…;

β–‘ Π²ΡΡ‚Π°Π²ΠΊΠ° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-диска Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…;

β–‘ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠΊΠ½Π° About (О ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅);

β–‘ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ подтвСрТдСния ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Π Π°Π·Π΄Π΅Π»ΠΈΠΌ ΠΊΠΎΠ΄ Π½Π° Ρ‚Ρ€ΠΈ Ρ„Π°ΠΉΠ»Π°, совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» cdapp_gnome.h. Π’ исходных Ρ„Π°ΠΉΠ»Π°Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ создания ΠΎΠΊΠΎΠ½ ΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΎΠΊΠΎΠ½ β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ формирования интСрфСйса β€” ΠΎΡ‚Π΄Π΅Π»Π΅Π½Ρ‹ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° (упраТнСния 16.11-16.14).

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.11. Π€Π°ΠΉΠ» cdapp_gnome.h

Π‘Π½Π°Ρ‡Π°Π»Π° рассмотрим Ρ„Π°ΠΉΠ» cdapp_gnome.h ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

1. Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π² исходный тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ срСды GNOME ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ интСрфСйса, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ³ΠΎ Π²Π°ΠΌΠΈ Π² Π³Π»Π°Π²Π΅ 8. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ„Π°ΠΉΠ»Ρ‹ app_mysql.h ΠΈ app_mysql.c ΠΈΠ· Π³Π»Π°Π²Ρ‹ 8 ΠΈ созданная Ρ‚Π°ΠΌ ΠΆΠ΅ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ….

#include <gnome.h>

#include "app_mysql.h"

2. Π’ Ρ‚ΠΈΠΏΠ΅ enum ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Ρ‹ столбцы Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° GtkTreeView, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для отобраТСния свСдСний ΠΎ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дисках ΠΈ ΠΈΡ… Π΄ΠΎΡ€ΠΎΠΆΠΊΠ°Ρ…. 

enum {

 COLUMN_TITLE,

 COLUMN_ARTIST,

 COLUMN_CATALOGUE,

 N_COLUMNS

};

3. Π£ вас Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ создания ΠΎΠΊΠ½Π° Π² Ρ„Π°ΠΉΠ»Π΅ interface.c.

GtkWidget *create_main_window();

GtkWidget *create_login_dialog();

GtkWidget *create_addcd_dialog();

4. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° для ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² мСню, ΠΏΠ°Π½Π΅Π»ΠΈ инструмСнтов, ΠΊΠ½ΠΎΠΏΠΎΠΊ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ поиска находятся Π² Ρ„Π°ΠΉΠ»Π΅ callbacks.с.

/* ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² для Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· прилоТСния */

void quit_app(GtkWidget* window, gpointer data);

/* ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² для подтвСрТдСния Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ */

gboolean delete_event_handler(GtkWidget* window, GdkEvent *event,

 gpointer data);

/* ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ², связанный с сигналом ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° addcd */

void addcd_dialog_button_clicked(GtkDialog * dialog, gint response,

 gpointer userdata);

/* ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² для ΠΊΠ½ΠΎΠΏΠΊΠΈ Add CD мСню ΠΈ ΠΏΠ°Π½Π΅Π»ΠΈ инструмСнтов */

void on_addcd_activate(GtkWidget *widget, gpointer user_data);

/* ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² для ΠΊΠ½ΠΎΠΏΠΊΠΈ мСню About */

void on_about_activate(GtkWidget* widget, gpointer user_data);

/* ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² для ΠΊΠ½ΠΎΠΏΠΊΠΈ поиска */

void on_search_button_clicked(GtkWidget *widget, gpointer userdata);

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.12. Π€Π°ΠΉΠ» interface.c

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ рассмотрим Ρ„Π°ΠΉΠ» interface.c, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΎΠΊΠ½Π° ΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π°, примСняСмыС Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.

1. Π‘Π½Π°Ρ‡Π°Π»Π° нСсколько ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ², Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΡΡΡ‹Π»Π°Π΅Ρ‚Π΅ΡΡŒ Π² Ρ„Π°ΠΉΠ»Π°Ρ… callbacks.c ΠΈ main.c:

#include "app_gnome.h"


GtkWidget* treeview;

GtkWidget* appbar;

GtkWidget* artist_entry;

GtkWidget *title_entry;

GtkWidget *catalogue_entry;

GtkWidget *username_entry;

GtkWidget *password_entry;

2. app β€” глобальная пСрСмСнная, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ:

static GtkWidget *Π°Ρ€Ρ€;

3. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая вставляСт Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚-ΠΌΠ΅Ρ‚ΠΊΡƒ с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ тСкстом:

void add_widget_with_label(GtkContainer *box,

 gchar *caption, GtkWidget *widget) {

 GtkWidget *label = gtk_label_new(caption);

 GtkWidget *hbox = gtk_hbox_new(TRUE, 4);

 gtk_container_add(GTK_CONTAINER(hbox), label);

 gtk_container_add(GTK_CONTAINER(hbox), widget);

 gtk_container_add(box, hbox);

}

4. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ строки мСню, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ для удобства макросы GNOMEUIINFO:

static GnomeUIInfo filemenu[] = {

 GNOMEUIINFO_MENU_NEW_ITEM("_New CD", NULL, on_addcd_activate, NULL),

 GNOMEUIINFO_SEPARATOR,

 GNOMEUIINFO_MENU_EXIT_ITEM(close_app, NULL),

 GNOMEUIINFO_END

};

static GnomeUIInfo helpmenu[] = {

 GNOMEUIINFO_MENU_ABOUT_ITEM(on_about_activate, NULL),

 GNOMEUIINFO_END

};

static GnomeUIInfo menubar[] = {

 GNOMEUIINFO_MENU_FILE_TREE(filemenu),

 GNOMEUIINFO_MENU_HELP_TREE(helpmenu),

 GNOMEUIINFO_END

};

5. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ создаСтС Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, вставляСтС мСню ΠΈ панСль инструмСнтов, Π·Π°Π΄Π°Π΅Ρ‚Π΅ ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€, Ρ†Π΅Π½Ρ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ экрана ΠΈ собираСтС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ интСрфСйс. Π£Ρ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ эта функция Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΎΠΊΠ½ΠΎ Π½Π° экранС, Π° просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠΊΠ½ΠΎ:

GtkWidget *create_main_window() {

 GtkWidget* toolbar;

 GtkWidget* vbox;

 GtkWidget* hbox;

 GtkWidget* label;

 GtkWidget* entry;

 GtkWidget *search_button;

 GtkWidget* scrolledwindow;

 GtkCellRenderer *renderer;

 app = gnome_app_new("GnomeCD", "CD Database");

 gtk_window_set_position(GTK_WINDOW(app), GTK_WIN_POS_CENTER);

 gtk_window_set_defeult_size(GTK_WINDOW(app ), 540, 480);

 gnome_app_create_menus(GNOME_APP(app), menubar);

6. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ панСль инструмСнтов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ стандартных ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌ GTK+ ΠΈ свяТитС с Π½Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°:

 toolbar = gtk_toolbar_new();

 gnome_app_add_toolbar(GNOME_APP(app), GTK_TOOLBAR(toolbar),

  "toolbar", BONOBO_DOCK_ITEM_BEH_EXCLUSIVE,

  BONOBO_DOCK_TOP, 1, 0, 0);

 gtk_container_set_border_width(GTK_CONTAINER(toolbar), 1);

 gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar), "gtk-add", "Add new CD",

  NULL, GTK_SIGNAL_FUNC(on_addcd_activate), NULL, -1);

 gtk_toolbar_insert_space(GTK_TOOLBAR(toolbar), 1);

 gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar), "gtk-quit",

  "Quit the Application", NULL, GTK_SIGNAL_FUNC(on_quit_activate), NULL, -1);

7. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ создаСтС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для поиска ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-диска:

 label = gtk_label_new("Search String:");

 entry = gtk_entry_new();

 search_button = gtk_button_new_with_label("Search");

8. ΠžΠΊΠ½ΠΎ gtk_scrolled_window прСдоставляСт полосы ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ, позволяя Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρƒ (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС GtkTreeView) ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΎΠΊΠ½Π°:

 scrolledwindow = gtk_scrolled_window_new(NULL, NULL);

 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow),

  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);

9. Π”Π°Π»Π΅Π΅ скомпонуйтС интСрфСйс, примСняя стандартным способом Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹:

 vbox = gtk_vbox_new(FALSE, 0);

 hbox = gtk_hbox_new(FALSE, 0);

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

 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);

 gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 6);

 gtk_box_pack_start(GTK_BOX(hbox), search_button, FALSE, FALSE, 5);

 gtk_box_pack_start(GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0);

10. Π—Π°Ρ‚Π΅ΠΌ создайтС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ GtkTreeView, Π²ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Ρ‚Ρ€ΠΈ столбца ΠΈ помСститС Π΅Π³ΠΎ Π² ΠΎΠΊΠ½ΠΎ GtkScrolledWindow:

 treeview = gtk_tree_view_new();

 renderer = gtk_cell_renderer_text_new();

 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview),

  COLUMN_TITLE, "Title", renderer, "text", COLUMN_TITLE, NULL);

 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview),

  COLUMN_ARTIST, "Artist", renderer, "text", CQLUMN_ARTIST, NULL);

 gtk_tree_view_insert_column_with_attrihutes(GTK_TREE_VIEW(treeview),

  COLUMN_CATALOGUE, "Catalogue", renderer, "text", COLUMN_CATALOGUE, NULL);

 gtk_tree_view_set_search_column(GTK_TREE_VIEW(treeview),

  COLUMN_TITLE);

 gtk_container_add(GTK_CONTAINER(scrolledwindow), treeview);

11. Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°ΠΉΡ‚Π΅ содСрТимоС Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, Π²ΡΡ‚Π°Π²ΡŒΡ‚Π΅ строку состояния GnomeApp ΠΈ подсоСдинитС Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹:

 gnome_app_set_contents(GNOMEAPP(app), vbox);

 appbar = gnome_appbar_new(FALSE, TRUE, GNOME_PREFERENCES_NEVER);

 gnome_app_set_statusbar(GNOME_APP(app), appbar);

 gnome_app_install_menu_hints(GNOME_APP(app), menubar);

 g_signal_connect(GTK_OBJECT(search_button), "clicked",

  GTK_SIGNAL_FUNC(on_search_button_clicked), entry);

 g_signal_connect(GTK_OBJECT(app), "delete_event",

  GTK_SIGNAL_FUNC(delete_event_handler), NULL);

 g_signal_connect(GTK_OBJECT(app), "destroy",

  GTK_SIGNAL_FUNC(quit_app), NULL);

 return app;

}

12. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ функция создаСт простоС Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-диск Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…. Оно состоит ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ Π²Π²ΠΎΠ΄Π° для исполнитСля, названия ΠΈ ΠΏΠΎΠ»Π΅ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ½ΠΎΠΏΠΎΠΊ OK ΠΈ Cancel:

GtkWidget *create_addcd_dialog() {

 artist_entry = gtk_entry_new();

 title_entry = gtk_entry_new();

 catalogue_entry = gtk_entry_new();

 GtkWidget* dialog = gtk_dialog_new_with_buttons("Add CD",

  app,

  GTK_DIALOG_DESTROY_WITH_PARENT,

  GTK_STOCK_OK,

  GTK_RESPONSE_ACCEPT,

  GTK_STOCK_CANCEL,

  GTK_RESPONSE_REJECT,

  NULL);

 add_widget_with_label(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),

  "Artist", artist_entry);

 add_widget_with_label(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),

  "Title", title_entry);

 add_widget_with_label(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),

  "Catalogue", catalogue_entry);

 g_signal_connect(GTK_OBJECT(dialog), "response",

  GTK_SIGNAL_FUNC(addcd_dialog_button_clicked), NULL);

 return dialog;

}

13. Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ рСгистрации ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ запросов ΠΊ Π½Π΅ΠΉ, поэтому данная функция создаСт Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ для Π²Π²ΠΎΠ΄Π° ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ пароля:

GtkWidget *create_login_dialog() {

 GtkWidget* dialog = gtk_dialog_new_with_buttons("Database Login",

  app, GTK_DIALOG_MODAL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,

  GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL);

 username_entry = gtk_entry_new();

 password_entry = gtk_entry_new();

 gtk_entry_set_visibility(GTK_ENTRY(password_entry), FALSE);

 add_widget_with_label(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),

  "Username", username_entry);

 add_widget_with_label(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),

  "Password", password_entry);

 gtk_widget_show_all(GTK_WIDGET(GTK_DIALOG(dialog)->vbox));