3

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

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

我在互联网上搜索过但无济于事。我希望这里的天才可以帮助我解决这个问题。谢谢!

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

4

2 回答 2

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 逐步淡出像素图,每次都会将绘图区域标记为脏,因此会重新绘制越来越淡的像素图。返回主循环,让动画播放出来。

第二个过去后,销毁顶层窗口。

于 2013-04-27T19:15:51.590 回答
2

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

于 2013-04-30T08:57:45.927 回答