我正在使用GTK + v2.24制作跨平台程序,经过很多工作,我遇到了一个问题。这就是我要做的事情:
1)按下输入GtkEntry,触发事件(使用“激活”信号完成);
2)显示一个带有简单消息但没有按钮的对话框;
3)在1秒后使对话框以淡出效果消失。
注意:当对话框出现然后淡出时,主顶级窗口应继续工作(因为我在其中运行了视频源)。
我在互联网上搜索但无济于事。我希望周围的天才可以帮助我解决这个问题。谢谢!
编辑:我已经找到了this question,但它是关于GTK#而我无法将其转换为GTK +。答案 0 :(得分:1)
我将尝试详细说明the linked answer。一些基础知识:
gtk_widget_get_snapshot
将实时窗口小部件转换为包含窗口小部件内容的图片。这张照片就是你要淡出的。
Cairo是一个图形API,可实现各种绘图基元including transparency。开罗也用于所有GTK绘图,因此每个GTK应用程序都依赖于cairo,而cairo很容易挂钩到GTK。
淡出动画可以分三步进行:
弹出一个带有GTK_WINDOW_POPUP
的顶级窗口,在里面插入内容并旋转主循环以便绘制它。使用gtk_widget_get_snapshot
获取小部件的图像并将其存储在一边。
删除显示对话框内容的小部件,并将其替换为继承自GtkDrawingArea
的自定义小部件,并显示您在侧面设置的图像。
安排一个超时功能,它使用cairo逐步逐渐淡出像素图,每次也将绘图区域标记为脏,这样就会重新绘制更加褪色的像素图。返回主循环,让动画播出。
第二次过后,销毁顶级窗口。
答案 1 :(得分:1)
虽然我正在回答自己的问题(因此不接受@ 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!)。