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

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

注意:当对话框出现并然后消失时,主顶层窗口应继续工作(因为我在其中运行视频源)。

我在互联网上搜索了很久,但没有结果。我希望这里的天才们能够帮助我解决这个问题。谢谢!

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


你链接的答案适用于C,而不是C#。你尝试过实现它吗? - user4815162342
至少这是标签上说的。但不,因为答案上的信息对我来说还不够让我弄清楚。 - StinkyCat
我试图详细解释答案中的内容。希望有所帮助,但我担心我不能做更多的事情了。 - user4815162342
2个回答

2

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


请注意,我只是试图阐明之前的答案。使用GTK的不透明度功能实际上是更好的解决方案。 - user4815162342

2

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

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

  • Cairo是一个图形API,实现了各种绘图原语,包括透明度。Cairo也用于所有GTK绘图,因此每个GTK应用程序已经依赖于cairo,并且cairo易于与GTK集成。

淡出动画可以分为三个步骤:

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

  2. 删除显示对话框内容的窗口小部件,并替换为从GtkDrawingArea继承并显示你设置在旁边的图像的自定义窗口小部件。

  3. 安排一个超时函数,使用cairo逐步淡化像素图一步一步地进行,每次还会标记绘图区域为脏,以便越来越模糊的像素图被重新绘制。返回主循环,让动画播放。

经过两秒后,销毁顶层窗口。


谢谢你的回答。我大部分都理解了。周一我会尝试一下。一旦我得出一些结论,我会给出一些反馈。 :) - StinkyCat
好的..我猜我已经完成了第一件事。现在我正在努力完成第二件事。因为我想要弹出效果,所以我需要在“空中”绘制快照(没有容器,我猜!)。我正在搜寻cairo的相关内容,但是没有成功。有什么想法吗?谢谢 - StinkyCat
好的,但这是否与您在第二点提出的建议相矛盾? - StinkyCat
@StinkyCat 如果这对你有效,那太好了,你根本不需要cairo。我从来没有在某些设置上使透明度功能正常工作过。 - user4815162342
哦,好的!我以为我必须要摆脱弹出窗口本身。那很有道理。但是,顺便问一下,你能给我一个它不起作用的例子吗?因为这个软件将在许多不同的电脑上使用(mac/win/linux)...所以我想确定我可能会遇到什么问题。感谢反馈! - StinkyCat
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接