В GTK + 2.24 создайте временный диалог с эффектом затухания

Я делаю кроссплатформенную программу с GTK + v2.24, и после многих вещей я столкнулся с проблемой. Вот что я пытаюсь сделать:
1) Нажав Enter в GtkEntry, запустите событие (выполняется с помощью сигнала «активировать»);
2) Сделать диалоговое окно с простым сообщением и без кнопок;
3) Заставьте диалог исчезнуть с эффектом затухания через 1 секунду.

Примечание. Пока диалоговое окно появляется, а затем исчезает, главное окно верхнего уровня должно продолжать работать (так как в нем работает видеопоток).

Я искал по всему интернету, но безрезультатно. Я надеялся, что гении здесь помогут мне в этом. Спасибо!

РЕДАКТИРОВАТЬ: я уже нашел этот вопрос, но речь идет о GTK #, и я не могу преобразовать его в GTK +.

2

Решение

Я постараюсь уточнить связанный ответ. Некоторые основы:

  • gtk_widget_get_snapshot преобразует живой виджет в изображение, содержащее содержимое виджета. Эта картина — то, что вы будете исчезать.

  • Каир это графический API, который реализует различные примитивы рисования, в том числе прозрачность. Cairo также используется для всех рисунков GTK, поэтому каждое приложение GTK уже зависит от cairo, и cairo легко подключить к GTK.

Анимация затухания может идти в три этапа:

  1. Всплывающее окно верхнего уровня с GTK_WINDOW_POPUP, вставьте содержимое внутрь и вращайте основной цикл, чтобы он был нарисован. использование gtk_widget_get_snapshot чтобы получить изображение виджета и сохранить его в стороне.

  2. Удалите виджет, который показывает содержимое диалога, и замените его на пользовательский виджет, который наследуется от GtkDrawingArea и показывает изображение, которое вы установили на стороне.

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

После того, как пройдет второе, уничтожьте окно верхнего уровня.

1

Другие решения

Хотя я отвечаю на свой собственный вопрос (таким образом, не принимаю вопрос @ user4815162342), это не значит, что он не прав, что он не работает для меня, и мой ответ не лучше. Я просто не мог понять это из-за нехватки навыков и времени (и я действительно получил свой результат из советов @ user4815162342!).
Вот как я это сделал:
1) Создать всплывающее окно с GTK_WINDOW_POPUP;
2) Установите положение всплывающего окна по центру, с другим цветом фона и уровнем и размером непрозрачности;
3) Создать ярлык и добавить его в КОНТЕЙНЕР (всплывающее окно);
4) Подключил всплывающее окно к тайм-ауту с gtk_timeout_add(timeInMS, fadeOutCallback, popup);
5) Создайте обратный вызов, как это:

int MyClass::fadeOutCallback(gpointer caller)
{
gtk_window_set_opacity(GTK_WINDOW(caller), gtk_window_get_opacity(GTK_WINDOW(caller)) - 0.03);  //The 0.03 makes the rate at fading out

if(gtk_window_get_opacity(GTK_WINDOW(caller)) == 0) //When the popup is completly opaque
{
gtk_widget_hide(GTK_WIDGET(caller));
gtk_widget_destroy(GTK_WIDGET(caller));
return false; //stop the timer
}
return true; //Keeps on calling the callback until the timer reaches timeInMS
}

Вероятно, есть гораздо лучшие способы делать то, что я хочу, но это работает очаровательно, даже с фоновым воспроизведением видео.
Надеюсь, что это может помочь любому. (и еще раз спасибо за ваш ввод @ user4815162342!).

1

По вопросам рекламы [email protected]