Таблица 16.4
Тип GtkButtonsType |
Описание |
|---|---|
GTK_BUTTONS_OK
|
Кнопка OK |
GTK_BUTTONS_CLOSE
|
Кнопка Close |
GTK_BUTTONS_CANCEL
|
Кнопка Cancel |
GTK_BUTTONS_YES_NO
|
Кнопки Yes и No |
GTK_BUTTONS_OK_CANCEL
|
Кнопки OK и Cancel |
GTK_BUTTONS_NONE
|
Нет кнопок |
Теперь остается только текст диалогового окна, который можно создать из строки подстановки, формируемой так же, как в функции printf. В данном примере вы спрашиваете пользователя, настаивает ли он на своем требовании удалить файл:
GtkWidget *dialog = gtk_message_dialog_new(main_window,
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
"Are you sure you wish to delete %s?", filename);
result = gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
Это диалоговое окно будет отображаться так, как показано на рис. 16.14.
Рис. 16.14
Окно типа GtkMessageDialog — простейший способ обмена информацией или получения ответов на вопросы типа "да/нет". Вы воспользуетесь им в следующем разделе, когда примените полученные знания для создания GUI вашего приложения для работы с базой данных компакт-дисков.
Приложение для работы с базой данных компакт-дисков
В предыдущих главах вы разрабатывали базу данных компакт-дисков с помощью MySQL и интерфейса на языке С. Теперь вы увидите, как просто вставить внешний GUI средствами GNOME/GTK+ и создать пользовательский интерфейс с богатыми функциональными возможностями.
Для проверки примера приложения для работы с базой данных компакт-дисков у вас должны быть установлены СУБД MySQL и библиотеки разработки, т.е. должны выполняться те же самые требования, что и к аналогичному приложению в главе 8.
Из соображений простоты и ясности мы создадим базовый скелетный интерфейс, в котором реализовано лишь подмножество функций — к примеру, вы не сможете добавлять информацию о дорожках в компакт-диски или удалять CD. Но вы увидите в вашем приложении в действии виджеты, обсуждавшиеся в этой главе, и поймете, как они применяются в реальных программах.
Будет написан программный код для следующих ключевых действий:
□ регистрация в базе данных из GUI;
□ поиск компакт-диска;
□ отображение сведений о компакт-диске и его дорожках;
□ вставка компакт-диска в базу данных;
□ создание окна About (О программе);
□ формирование подтверждения при завершении работы пользователя.
Разделим код на три файла, совместно использующие заголовочный файл cdapp_gnome.h. В исходных файлах функции создания окон и диалоговых окон — функции формирования интерфейса — отделены от функций обратного вызова (упражнения 16.11-16.14).
Сначала рассмотрим файл 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);
Первым рассмотрим файл 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;