Читать книгу 📗 "Основы программирования в Linux - Мэтью Нейл"
Сначала рассмотрим файл cdapp_gnome.h и функции, которые вы должны реализовать.
1. Включите в исходный текст программы заголовочные файлы среды GNOME и заголовочный файл для функций интерфейса, разработанного вами в главе 8. В данном примере программы используются файлы app_mysql.h и app_mysql.c из главы 8 и созданная там же база данных.
#include <gnome.h>#include "app_mysql.h"2. В типе
enumGtkTreeViewenum { 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;GtkWidget *password_entry;2.
appstatic 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. Определения строки меню, использующие для удобства макросы
GNOMEUIINFOstatic 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);