在GTK+ 2.24中,创建带有淡出效果的临时对话框

In GTK+ 2.24, create temporary dialog with fade out effect

本文关键字:淡出 对话框 GTK+ 创建      更新时间:2023-10-16

我正在用GTK+ v2.24制作一个跨平台程序,在做了很多事情之后,我遇到了一个问题。这就是我想要做的:
1)在GtkEntry中按enter键,触发一个事件(用"activate"信号完成);
2)让一个对话框出现一个简单的消息,没有按钮;
3)使对话框在1秒后消失。

注意:当对话框出现然后淡出时,主顶层窗口应该继续工作(因为我有一个视频馈送在里面运行)。

我在网上找遍了,但是一无所获。我希望这里的天才们能帮我解决这个问题。谢谢你!

编辑:我已经发现了这个问题,但它是关于GTK#的,我无法将其转换为GTK+。

我将尽量详细说明链接的答案。一些基础知识:

  • gtk_widget_get_snapshot将活动的小部件转换为包含该小部件内容的图片。这张图片是你要淡出的。

  • Cairo是一个图形API,它实现了各种绘图原语,包括透明度。Cairo还用于所有GTK绘图,因此每个GTK应用程序都已经依赖于Cairo,并且Cairo很容易与GTK挂钩。

淡出动画可以分三步完成:

  1. 弹出GTK_WINDOW_POPUP的顶层窗口,插入内容并旋转主循环,使其被绘制。使用gtk_widget_get_snapshot获取小部件的图像并将其存储在一边

  2. 删除显示对话框内容的小部件,并将其替换为继承自GtkDrawingArea的自定义小部件,并显示您在一侧设置的图像。

  3. 调度一个超时函数,该函数使用cairo一步一步地逐渐淡出像素图,每次也将绘图区域标记为脏,以便重新绘制越来越褪色的像素图。返回到主循环,让动画播放。

第二个窗口结束后,销毁顶层窗口

虽然我在回答我自己的问题(因此不接受@user4815162342的一个),但并不意味着他是错的,它不适合我,我的答案也更好。由于缺乏技能和时间,我无法解决这个问题(实际上我从@user4815162342的建议中得到了我的结果!)。我是这样做的:
1)使用GTK_WINDOW_POPUP;
创建弹出窗口2)设置弹出框的位置居中,使用不同的背景颜色、不透明度级别和大小;
3)创建一个标签并添加到CONTAINER(popup);
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!)。