Отправляет email-рассылки с помощью сервиса Sendsay

Практические советы по GTK+

  Все выпуски  

Практические советы по GTK+ Image Viewer 1.5



Image Viewer 1.5

После небольшого праздничного перерыва продолжим изучать GTK на примере разработки реального приложения.

Разберём несколько функций, управляющих состоянием окна приложения. В разных операционных системах возможны небольшие отличия, поскольку основная работа ложится на менеджер окон.

При создании окна мы получаем указатель GtkWindow *window, с которым дальше будем работать. Всё нижесказанное относится также и к диалоговым окнам. Вот некоторые функции для  управления состоянием окна:

Прототип функции

Описание

void gtk_window_iconify(GtkWindow *window); Минимизировать окно, то есть свернуть окно в панель задач
void gtk_window_deiconify(GtkWindow *window); Восстановить окно из панели задач
void gtk_window_maximize(GtkWindow *window); Развернуть окно на весь экран
void gtk_window_unmaximize(GtkWindow *window); Вернуть окну нормальное состояние
void gtk_window_fullscreen(GtkWindow *window); Развернуть окно на весь экран + убрать рамку и заголовок.
void gtk_window_unfullscreen(GtkWindow *window); Отключить состояние 'fullscreen'
void gtk_window_set_keep_above(GtkWindow *window,gboolean setting); Окно поверх всех, если setting=TRUE, иначе нет
void gtk_window_set_keep_below(GtkWindow *window,gboolean setting); Окно позади всех, если setting=TRUE, иначе нет
void gtk_window_present(GtkWindow *window); Представить окно пользователю, то есть это может означать: развернуть его, если было свёрнуто; перенести на текущий экран; дать фокус ввода окну.
void gtk_window_set_resizable(GtkWindow *window,gboolean setting); Если setting=TRUE, то окно можно растягивать, иначе нельзя
void gtk_window_set_decorated(GtkWindow *window,gboolean setting); Если setting=TRUE, то окно окно будет иметь рамку и заголовок, иначе нет.
gboolean gtk_window_get_decorated (GtkWindow *window); Если функция возвращает TRUE, значит окно имеет рамку и заголовок, если FALSE - то нет.
gboolean gtk_window_set_position(GtkWindow *window, GtkWindowPosition position); Переместить окно в положение position, которое может принимать следующие значения:
GTK_WIN_POS_NONE - не менять положение окна
GTK_WIN_POS_CENTER - по центру экрана,
GTK_WIN_POS_MOUSE - в текущей позиции мыши,
GTK_WIN_POS_CENTER_ALWAYS - по центру экрана, даже при изменении размеров окна
GTK_WIN_POS_CENTER_ON_PARENT - в центре родительского окна
void gtk_window_get_position(GtkWindow *window,gint *x,gint *y);

Узнать текущее положение окна, в экранных координатах.
В каком углу находится точка отсчёта можно узнать функцией: GdkGravity gtk_window_get_gravity(GtkWindow *window)

void gtk_window_move(GtkWindow *window,gint *x,gint *y); Установить новое положение окна, двигать окно.
void gtk_window_get_size(GtkWindow *window,gint *width,gint *height); Узнать размеры окна
void gtk_window_resize(GtkWindow *window,gint width,gint height); Установить новые размеры окна.

Разберём на примере. Перемещать окно и менять его размеры довольно просто, можно обойтись и без примера. Добавим в нашем приложение просмотра графических файлов image-viewer возможность перевода в режим Fullscreen. По клавише 'пробел' окно приложения будет расширяться на весь экран, а при повторном нажатии пробела окно будет возвращаться к прежним размерам.

Все изменения будут происходить в файле image_viewer.c
Для начала подключим обработчик нажатия клавиш к главному окну:

// подключаем обработчик нажатия клавиш
gtk_signal_connect( GTK_OBJECT( window ),"key-press-event",GTK_SIGNAL_FUNC(callback_press_key), NULL);

Вот код обработчика:

// обработчик нажатия клавиш
static gboolean callback_press_key(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
{
    // если нажали клавишу 'пробел'
    if(event->keyval==GDK_space)// код независим от раскладки клавиатуры и языка ввода
    {
        // Узнаём состояние окна
        GdkWindowState state = gdk_window_get_state(window->window);
        if(state & GDK_WINDOW_STATE_FULLSCREEN)
            // Если окно на весь экран - сворачиваем к нормальным размерам
            gtk_window_unfullscreen(GTK_WINDOW(window));
        else
            // Если окно не на весь экран - разворачиваем его на весь экран
            gtk_window_fullscreen(GTK_WINDOW(window));
    }
    return FALSE;// разрешаем программе дальше обрабатывать этот сигнал
}

Для макроопределения GDK_space понадобится подключить заголовочный файл #include "gdk/gdkkeysyms.h"
В обработчике первым делом проверяем какую клавишу нажали, если пробел, тогда идём дальше.
Переменная event->keyval содержит  код нажатой клавиши, причём именно код клавиши на клавиатуре, который не зависит ни от регистра,  ни от языка; если требуется узнать нажатую клавишу с учётом языка ввода, проще пользоваться переменной event->string.

Узнаём состояние окна:   GdkWindowState state = gdk_window_get_state(window->window);
При этом пользуемся GDK функцией и поэтому передаём в качастве параметра GdkWindow. (P.S. Любой виджет, в том числе и GtkWindow имеет указатель на GDK окно: GdkWindow *gdk_window = GTK_WIDGET(widget)->window )

Проверяем, развёрнуто ли окно на весь экран:  if(state & GDK_WINDOW_STATE_FULLSCREEN)

Если нет, то разверачиваем:  gtk_window_fullscreen(GTK_WINDOW(window));
иначе - сворачиваем: gtk_window_unfullscreen(GTK_WINDOW(window));

В развёрнутом на весь экран окне изчезают рамки и заголовок, но полоска меню остаётся, мы её трогать не будем, но если хочется и её убрать, тогда нужно будет удалить меню из родительского контейнера через:
 void gtk_container_remove(GtkContainer *container, GtkWidget *widget).
А после восстановления в нормальный режим - снова  упаковать. Причём, чтобы меню не уничтожилось при удалении из контейнера, нужно предварительно увеличить число ссылок на него функцией:
gpointer g_object_ref (gpointer object).

Как вариант, можно просто скрыть меню:
void gtk_widget_hide(GtkWidget *widget),
а потом отобразить:
void gtk_widget_show(GtkWidget *widget)
или
void gtk_widget_show_all(GtkWidget *widget).



Исходные коды приложения доступны по ссылке: image-viewer1.5.tar.gz [22 кб]

Все вопросы, замечания и пожелания можно отсылать по адресу: comp.soft.prog.gtk-owner@subscribe.ru

 


В избранное