GTK 窗口运动动画?

2024-03-28

我想自动在屏幕上移动我的 GTK_WINDOW 。目前我将它置于绘制/移动循环中,但这非常不稳定。我对 GTK 编程(以及一般的 gui 编程)非常陌生。我缺少什么?


您还没有说您希望窗口遵循什么样的路径。如果路径是时间的一些简单函数——也就是说,如果您有办法计算窗口在任何给定时间的位置——您可以尝试以下代码中所示的方法。对于示例中相当简单的菜单,它在我的 Linux 系统上工作正常,并且产生相当平滑的运动。

该方法的关键在于,它不是在每次计时器事件时将窗口移动给定的距离,而是找出当前时间并将窗口移动到当时应该位于的位置。因此,运动速度的时间导数应该是恒定的,即使计时器事件不规则地发生,这也可以避免不规则或断断续续的运动。 (如中所述g-timeout-add() 说明 http://developer.gnome.org/glib/unstable/glib-The-Main-Event-Loop.html#g-timeout-add,很容易出现不规则现象。)

在此示例中,路径是从窗口左上角到左下角并反复返回。 timerEvent() 中的常量“HalfTime”控制从一个角移动到另一个角所需的时间。 g_timeout_add() 调用中的常量 3 将计时器间隔设置为 0.003 秒,即每秒约 333 次移动 (MPS)。 (您可能想尝试更合理的费率,例如20、30、40等MPS;我使用数字3,因为我没有查g-超时-add() http://developer.gnome.org/glib/unstable/glib-The-Main-Event-Loop.html#g-timeout-add在使用它之前,假设延迟是数百秒,大约 33 MPS,而不是毫秒,大约 333 MPS。)如果您的窗口内容相当复杂,则实用的 MPS 会更少。另外,我尝试了一些较慢的速率,并得到了更多波动的印象。

/* $Id: app12.c $
 Re: animating position of a top-level Gtk window
 jiw July 2011 -- Offered without warranty under GPL v3
 terms per http://www.gnu.org/licenses/gpl.html  */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <gtk/gtk.h>
typedef struct DATA { GTimer *timer; GtkWidget *window; int w, h; }
  DataStruct;

gboolean timerEvent(void *dataset) {
  enum { HalfTime=8, CycTime=2*HalfTime };
  gulong micros;
  DataStruct *data =dataset;
  double t = fabs(fmod (g_timer_elapsed (data->timer, &micros), CycTime));
  int x = (t*data->w)/HalfTime, y = (t*data->h)/HalfTime;
  gtk_window_move (GTK_WINDOW(data->window),
       t<HalfTime? x : 2*data->w-x, t<HalfTime? y : 2*data->h-y);
  return TRUE; /* Keep timeout running */
}

int main(int argc, char **argv) {
  GtkWidget *vbox, *b;
  GdkScreen *gds;
  DataStruct data;
  data.timer = g_timer_new();
  gtk_init (&argc, &argv);
  data.window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_default_size (GTK_WINDOW(data.window), 200, 150);
  g_signal_connect (G_OBJECT(data.window), "destroy",
            G_CALLBACK(gtk_main_quit), NULL);
  vbox = gtk_vbox_new (FALSE, 0);
  gtk_container_add (GTK_CONTAINER(data.window), vbox);
  b = gtk_button_new_with_label ("Click to Exit");
  gtk_box_pack_start (GTK_BOX(vbox), b, TRUE, TRUE, TRUE);
  g_signal_connect (b, "clicked", G_CALLBACK(gtk_main_quit), NULL);
  gtk_widget_show_all (data.window);

  gds = gdk_screen_get_default ();  /* Get pointer to screen  */
  data.w = gdk_screen_get_width (gds);  /* Find out screen width  */
  data.h = gdk_screen_get_height (gds); /* Find out screen height */
  printf ("Screen size = %d by %d\n", data.w, data.h); fflush(stdout);
  g_timeout_add(3, timerEvent, &data);  /* Create .003 sec timer   */
  gtk_main();
  return (0);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GTK 窗口运动动画? 的相关文章

  • 通过动画将视图的可见性从消失变为可见

    我有一个观点是invisible默认情况下 只是第一次 现在我需要将可见性切换为VISIBLE有了这个animation if myView getVisibility View INVISIBLE myView setVisibility
  • Linux 消息队列 - 多个接收者

    我最近一直在研究和研究 Linux 消息队列 并遇到了一些我不太明白为什么会发生的事情 如果我们运行两个程序 它们都在无限 for 循环中使用 msgrcv 来检查消息 然后发送两条消息 那么第一个运行的程序将收到第一条消息 第二个程序将收
  • 如何在Linux中使用C或shell检查密码?

    我有一个用 C 编写的程序 运行在嵌入式 Linux 上 有时它想检查系统用户的密码 如果我能得到地穴盐 etc 密码 我可以使用 crypt 检查用户密码的正确性 有没有shell脚本可以帮助我检查密码 比如check passwd用户名
  • 更改时为 UITableView 动画重新加载数据

    我有一个有两种模式的 UITableView 当我们在模式之间切换时 我有不同数量的部分和每个部分的单元格 理想情况下 当表格增大或缩小时 它会执行一些很酷的动画 这是我尝试过的代码 但它没有执行任何操作 CGContextRef cont
  • CMake错误:本项目中使用了以下变量,但它们被设置为NOTFOUND

    我正在尝试配置whalebot带有 tar 文件的爬虫whalebot 0 02 00 tar gz 我已正确提取它 root Admin1 dls tar xvzf whalebot 0 02 00 tar gz 之后我想对其进行配置 r
  • 使用 Shell 脚本自动安装 R-Studio

    有没有办法在 Linux 系统上自动安装 R Studio 它应该自动检测操作系统并安装具有所需依赖项的 R 和 R Studio 谢谢 我准备了以下 shell 脚本来使安装完全自动化 bin bash Program R Studio
  • 如何从 Linux 和 Solaris 上的挂载中提取 NFS 信息?

    我需要使用提取 NFS 挂载信息mount在 Linux RHEL 4 5 和 Solaris Solaris 10 系统上 由于这是 SSH 命令的一部分 因此提取需要在一行中进行 不幸的是 Linux 和 Solaris 在该行的不同部
  • 如何从 USB 加载 LUKS 密码,然后返回键盘?

    我想设置一台具有全磁盘加密功能的无头 Linux Debian Wheezy PC 能够使用 USB 驱动器或通过键盘输入密码来解锁磁盘 我的起点是使用 Debian 安装程序中基本的整个磁盘加密选项进行全新安装 该安装程序将 boot 之
  • 服务器启动时 Java 运行时环境 SIGSEGV 错误

    我正在使用 java 版本 1 7 0 45 和 eclipse kepler 在服务器启动时我收到以下错误日志 虽然我发现了几个帖子 1 https stackoverflow com questions 19332489 how to
  • 使用 libjpeg 编写 jpeg(段错误)

    尝试使用 libjpeg 从一些原始数据写入 jpeg 文件 它会触发分段错误jpeg start compress 这是代码的相关部分 void write sub image char filename int start int en
  • OpenSSL 和 CryptoJS SHA256 加密转换

    我的问题是 OpenSSL 的新版本与 CryptoJS 的默认设置不兼容 openssl enc 用于基于密码的密钥派生的默认哈希值 1 1 0 中更改为 SHA256 而较低版本中更改为 MD5 https unix stackexch
  • 开始/停止图像视图旋转动画

    我有一个开始 停止按钮和一个我想要旋转的图像视图 当我按下按钮时 我希望图像开始旋转 当我再次按下按钮时 图像应该停止旋转 我目前正在使用UIView动画 但我还没有找到停止视图动画的方法 我希望图像旋转 但是当动画停止时 图像不应返回到起
  • Linux C 如何打开目录并获取文件描述符

    include
  • Nvcc 的版本与 CUDA 不同

    我安装了 cuda 7 但是当我点击 nvcc version 时 它打印出 6 5 我想在 GTX 960 卡上安装 Theano 库 但它需要 nvcc 7 0 我尝试重新安装cuda 但它没有更新nvcc 当我运行 apt get i
  • 请求失败的错误:GLXBadDrawable (C++ bgfx)

    我试图用 glfw 和 bgfx 创建一个紫色窗口作为我的游戏引擎的起点 但是在启动二进制文件时它会抛出一个错误 我正在尝试创建紫色窗口 如下图所示 我正在使用 cmake 错误是 anuj fedora D C C c o build g
  • 为什么链接器要修改--defsym“绝对地址”

    目标 一个使用可执行文件中的函数 不导出符号 的共享库 Means gcc Wl defsym function 0x432238 手册页指出 defsym symbol expression Create a global symbol
  • 与 grep 类似地突出显示文本,但不过滤掉文本[重复]

    这个问题在这里已经有答案了 使用 grep 时 它将突出显示与正则表达式匹配的行中的任何文本 如果我想要这种行为 但同时让 grep 打印出所有行怎么办 快速浏览完 grep 手册页后 我发现一无所获 使用确认 看看它的 passthru此
  • Alsa:如何在 2 个输出上复制流并保存系统配置?

    我的声卡是 Audigy SE SB0570 我想不仅在扬声器上而且在耳机上同时播放相同的立体声流 我在空的 asoundrc 上尝试这个配置 pcm quad type multi slaves a pcm hw 0 0 green ho
  • 如何在 Docker 容器中运行 Nginx 而不停止?

    我在 Docker 容器上安装了 Nginx 并尝试像这样运行它 docker run i t p 80 80 mydockerimage usr sbin nginx 问题是 Nginx 的工作方式是 初始进程立即生成一个 Nginx 主
  • Gnu 时间和格式化输出

    我想使用 gnu time 来测量一些小 c 程序的运行时间 人 中写道 f FORMAT format FORMAT Use FORMAT as the format string that controls the output of

随机推荐

  • NetNamedPipeBinding 安全吗?

    我想知道 netNamedPipeBinding 是否被认为是安全的 一方面 NetNamedPipeBinding 仅在传输层上实现安全性 并且它使用 NTLM source http msdn microsoft com en us l
  • .NET 中的 .CSV 到 .MDB 转换

    我已使用 ado net 将 mdb 文件转换为 CSV 格式 然后循环记录集并将数据写入 csv 文件中 现在我需要做相反的事情 我必须将 CSV 文件转换为 mdb 文件 具体来说是访问表 有没有任何编程代码可以帮助我解决这个问题 由于
  • 以测试驱动方式开发的开源项目有哪些好的例子?

    I found 具有良好质量测试的开源项目 https stackoverflow com questions 2893841 open source projects with good quality tests但我想问一些不同的问题
  • AJAX 将多个数据发送到 ASP.Net MVC

    我在通过 ajax jquery 将多个对象发布到 MVC 4 控制器时遇到问题 已经过去几周了 但我似乎找不到解决方案 我尝试了几种方法 有时filterModel对象为空 有时字符串参数为空 即使我对是否指定contentType进行字
  • 尝试在 Android 上运行我的 React Native 应用程序时出错

    我已经构建了我的 React Native 应用程序 并使用我的 iOS 设备进行了几个月的测试和故障排除 现在我第一次尝试在 Android 上构建和测试该应用程序 问题是 我在尝试运行 Android 版本的应用程序时不断遇到错误 经过
  • 如何在 matplotlib 中根据 x、y、z 坐标绘制等高线图? (plt.contourf 或 plt.contour)

    These meshgrid对我来说使用起来有点混乱 我正在尝试用以下内容绘制散点图x and y坐标与覆盖在散点图上的等值线图 并具有连续分布z坐标 类似于高程图 如果我使用meshgrid使用 x y 和 z 坐标 然后我得到每个的 3
  • 如何确定 VB6 应用程序和使用 CreateObject() 实例化的 exe 之间的关联

    我们需要弄清楚服务如何查看正在运行的 VB6 应用程序和 或其 DCOM 生成的 exe 并找出哪个 VB6 应用程序与哪个 DCOM exe 配合使用 VB6 应用程序和生成的 exe 均位于同一服务器上 我们有一个 VB6 应用程序 它
  • UINavigationController 和 viewWillDisappear

    因此 我的应用程序中有一个 UINavController 并尝试在用户按下后退按钮时执行一个方法 我到处搜索 只能找到断章取义的零碎内容 有没有办法实现某种检查 当用户按下后退按钮以关闭当前视图时进行捕获 出于某种原因 弹出视图的 vie
  • try/catch/finally 在 groovy 编译器异常的情况下屏蔽 Jenkinsfile 问题

    我的 Jenkinsfile 中有类似于以下代码的代码 node checkout scm do some stuff try do some maven magic catch error stage Cleanup after fail
  • 用于接收 UDP 数据包的可变大小缓冲区

    我有一个 UDP 套接字 它将接收一些可能不同大小的数据包 并且我异步处理它 socket async receive from boost asio buffer buffer 65536 senderEndpoint handler 这
  • Espresso 测试调用视图按钮单击等待调用 api 响应数据进度对话框退出

    我使用 via espresso 库开发自动化测试 有时我 运行测试时曾经收到错误消息 无法启动意图 Intent 在 api 响应数据进度对话框退出后 我调用 view btn click 很长时间 请帮助我为那些有使用浓缩咖啡技术进行自
  • Angular http.get() url 作为原始 HTML

    我正在为作业创建一个网站 我想在其中动态加载一些数据 问题是 数据仅来自网站 没有 API 或任何东西 有什么方法可以使用 http get 来将整个网站作为原始 HTML 来提取 然后我可以解析它以获取信息吗 Thanks 您可以设置re
  • 在 AS7 中转换查找的 EJB 视图时出现 ClassCastException

    我正在将 2 个 EAR 部署到 JBoss AS 7 1 0 Alpha1 SNAPSHOT 7 0 1 Final 版本之后 两者都部署得很好 我有一个 EJB Singleton 类打包在一个 JAR 中 位于其中一个 EAR 中 S
  • PHP cURL 上传文件到 Node JS 服务器

    我有一个 PHP 前端项目和 Node JS API 我需要将文件发送到 API 但我必须使用 cURL 因为表单发送到 PHP 而 PHP 通过 cURL 发送到 Node JS 我尝试了很多不同的方法 但我无法让它发挥作用 在我正在使用
  • 未显示视图的屏幕截图

    我试图在显示 MyFirstViewController 时截取 MySecondViewController view 的屏幕截图 我不希望 MySecondViewController 随时出现在屏幕上 那可能吗 这是我当前在 MyFi
  • HashMap 分组依据 (Java)

    有没有一种方法可以在Java中按Key分组并将值添加到HashMap中 HashMap
  • 理解这部分手臂的汇编代码

    syntax unified thumb cpu cortex m4 arch armv7e m fpu fpv4 sp d16 Changes from unprivileged to privileged mode thumb func
  • constexpr 可以和 volatile 结合使用吗?

    以下代码片段在 Clang 3 5 中工作正常 但在 GCC 4 9 2 中不行 int main constexpr volatile int i 5 有错误 错误 此处不能使用 挥发性 和 constexpr 如果我检查 Clang 生
  • 将新的提交添加到现有的 Git 标签

    我创建了一个 Git 标签v1 1 using git tag a v1 1 m my version 1 1 我推了那个标签 后来我做了一些相关的修改v1 1 现在 当我推送新的更改并使用检查 git 标签时git describe它向我
  • GTK 窗口运动动画?

    我想自动在屏幕上移动我的 GTK WINDOW 目前我将它置于绘制 移动循环中 但这非常不稳定 我对 GTK 编程 以及一般的 gui 编程 非常陌生 我缺少什么 您还没有说您希望窗口遵循什么样的路径 如果路径是时间的一些简单函数 也就是说