Я делаю кроссплатформенную программу с GTK + v2.24, и после многих вещей я столкнулся с проблемой. Вот что я пытаюсь сделать:
1) Нажав Enter в GtkEntry, запустите событие (выполняется с помощью сигнала «активировать»);
2) Сделать диалоговое окно с простым сообщением и без кнопок;
3) Заставьте диалог исчезнуть с эффектом затухания через 1 секунду.
Примечание. Пока диалоговое окно появляется, а затем исчезает, главное окно верхнего уровня должно продолжать работать (так как в нем работает видеопоток).
Я искал по всему интернету, но безрезультатно. Я надеялся, что гении здесь помогут мне в этом. Спасибо!
РЕДАКТИРОВАТЬ: я уже нашел этот вопрос, но речь идет о GTK #, и я не могу преобразовать его в GTK +.
Я постараюсь уточнить связанный ответ. Некоторые основы:
gtk_widget_get_snapshot
преобразует живой виджет в изображение, содержащее содержимое виджета. Эта картина — то, что вы будете исчезать.
Каир это графический API, который реализует различные примитивы рисования, в том числе прозрачность. Cairo также используется для всех рисунков GTK, поэтому каждое приложение GTK уже зависит от cairo, и cairo легко подключить к GTK.
Анимация затухания может идти в три этапа:
Всплывающее окно верхнего уровня с GTK_WINDOW_POPUP
, вставьте содержимое внутрь и вращайте основной цикл, чтобы он был нарисован. использование gtk_widget_get_snapshot
чтобы получить изображение виджета и сохранить его в стороне.
Удалите виджет, который показывает содержимое диалога, и замените его на пользовательский виджет, который наследуется от GtkDrawingArea
и показывает изображение, которое вы установили на стороне.
Запланируйте функцию тайм-аута, которая использует cairo для постепенного затухания растрового изображения по одному шагу за раз, каждый раз также помечая область рисования как грязную, так что растущее растровое растровое изображение перерисовывается. Вернитесь в основной цикл и дайте анимации поиграть.
После того, как пройдет второе, уничтожьте окно верхнего уровня.
Хотя я отвечаю на свой собственный вопрос (таким образом, не принимаю вопрос @ 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!).