FLTK - FLTK1.4.1 - demo - animgifimage-play

文章目录

    • FLTK - FLTK1.4.1 - demo - animgifimage-play
    • 概述
    • 笔记
    • END

FLTK - FLTK1.4.1 - demo - animgifimage-play

概述

看的官方demo越多,在每个新demo中能看到的新增知识点越少。这是好事。
不可能一次将细节都记住,只要知道每个官方demo能干啥,有些啥新增知识点,这就够了。
就像一本好书一样,至少也要看几遍。
再不济,翻一遍,知道有啥,等需要的时候,再来拿。

// 播放多张gif, 并能控制(缩放,速度,正反向播放, 下一张图片)

// 新增知识点
// gif图像切换当前帧
// 所有的新窗体,都是作为当前窗体的子窗体存在, 所以fltk的窗体不用指定父窗体是谁

笔记

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPWSTR    lpCmdLine,_In_ int       nCmdShow)
{UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);char* argv[4] = {};argv[0] = (char*)"app-name";argv[1] = (char*)"003_ over_rest.gif";argv[2] = (char*)"004_no_contact.gif";argv[3] = (char*)"005_bonded.gif";return fl_demo_main(4, argv);// return 0;
}
// FLTK - FLTK1.4.1 - demo - animgifimage-play// 播放多张gif, 并能控制(缩放,速度,正反向播放, 下一张图片)// 新增知识点
// gif图像切换当前帧
// 所有的新窗体,都是作为当前窗体的子窗体存在, 所以fltk的窗体不用指定父窗体是谁#include "fltk_test.h"// 如果要将fl demo的实现搬过来测试,就注释掉下面的宏
// #define DONT_USE_FL_DEMO#ifdef DONT_USE_FL_DEMO
int fl_demo_main(int argc, char** argv)
{return 0;
}#else#endif // TEST_FL_DEMO//
//  Demonstrates how to play an animated GIF file
//  under application control frame by frame if
//  this is needed.
//  Also demonstrates how to use a single animation
//  object to load multiple animations.
//
//  animgifimage <file> [-r] [-s speed_factor]
//
//  Multiple files can be specified e.g. testsuite/*
//
//  Use keys '+'/'-'/Enter to change speed, ' ' to pause.
//  Right key changes to next frame in paused mode.
//  'n' changes to next file, 'r' toggles reverse play.
//
#include <FL/Fl_Anim_GIF_Image.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl.H>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>static double speed_factor = 1.; // slow down/speed up playback by factor
static bool reverse = false;  // true = play animation backwards
static bool paused = false;  // flag for paused animation
static bool frame_info = true; // flag to update current frame info in title
static Fl_Anim_GIF_Image animgif; // the animation object
static char** Argv = 0; // copy of main() argv[]
static int Argc = 0;    // copy of main() argc
static int current_arg = 0; // current index in argv[]static int next_arg() {while (1) {current_arg++;if (current_arg >= Argc) {current_arg = 1;}if (Argv[current_arg]) break;}return current_arg;
}static const char* next_file() {while (Argv[next_arg()][0] == '-');return Argv[current_arg];
}static void set_title() {char buf[200];char fi[50];if (frame_info)snprintf(fi, sizeof(fi), "frame %d/%d", animgif.frame() + 1, animgif.frames());elsesnprintf(fi, sizeof(fi), "%d frames", animgif.frames());snprintf(buf, sizeof(buf), "%s (%s) x %3.2f %s%s",Argv[current_arg], fi,speed_factor, reverse ? "reverse" : "",paused ? " PAUSED" : "");Fl::first_window()->copy_label(buf);
}static void cb_anim(void* d_) {Fl_Anim_GIF_Image* animgif = (Fl_Anim_GIF_Image*)d_;int frame{ animgif->frame() };// switch to next/previous frameif (reverse) {animgif->canvas()->window()->redraw();frame--;if (frame < 0) {frame = animgif->frames() - 1;}}else {frame++;if (frame >= animgif->frames()) {frame = 0;}}// set the frame (and update canvas)// gif图像切换当前帧animgif->frame(frame);// setup timer for next frameif (!paused && animgif->delay(frame)) {Fl::repeat_timeout(animgif->delay(frame) / speed_factor, cb_anim, d_);}if (frame_info)set_title();
}static void next_frame() {cb_anim(&animgif);
}static void toggle_pause() {paused = !paused;set_title();if (paused)Fl::remove_timeout(cb_anim, &animgif);elsenext_frame();set_title();
}static void toggle_info() {frame_info = !frame_info;set_title();
}static void toggle_reverse() {reverse = !reverse;set_title();
}static void zoom(bool out) {int W = animgif.w();int H = animgif.h();// Note: deliberately no range check (use key 'N' to reset)static const double f = 1.05;// 设置图像在画布上的大小if (out)animgif.resize(int(W / f), int(H / f));elseanimgif.resize(int(f * W), int(f * H));
}static void change_speed(int dir_) {if (dir_ > 0) {speed_factor += (speed_factor < 1) ? 0.01 : 0.1;if (speed_factor > 100)speed_factor = 100.;}else if (dir_ < 0) {speed_factor -= (speed_factor > 1) ? 0.1 : 0.01;if (speed_factor < 0.01)speed_factor = 0.01;}else {speed_factor = 1.;}set_title();
}static void load_next() {Fl::remove_timeout(cb_anim, &animgif);paused = false;animgif.load(next_file());animgif.canvas()->window()->redraw();// check if loading succeededprintf("valid: %d frames: %d\n", animgif.valid(), animgif.frames());if (animgif.valid()) {printf("play '%s'%s with %3.2f x speed\n", animgif.name(),(reverse ? " reverse" : ""), speed_factor);animgif.frame(reverse ? animgif.frames() - 1 : 0);// setup first timeout, but check for zero-delay (normal GIF)!if (animgif.delay(animgif.frame())) {Fl::add_timeout(animgif.delay(animgif.frame()) / speed_factor, cb_anim, &animgif);}}set_title();
}static int events(int event_) {if (event_ == FL_SHORTCUT && Fl::first_window()) {switch (Fl::event_key()) {case '+': change_speed(1); break;case '-': change_speed(-1); break;case FL_Enter: change_speed(0); break;case 'n': load_next(); break;case 'z': zoom(Fl::event_shift()); break;case 'i': toggle_info(); break; // Note: this can raise cpu usage considerably!case 'r': toggle_reverse(); break;case ' ': toggle_pause(); break;case FL_Right:if (paused && Fl::get_key(FL_Right)) next_frame();break;default:return 0;}Fl::first_window()->redraw();return 1;}return 0;
}int fl_demo_main(int argc, char* argv[]) {// setup play parameters from argsArgv = argv;Argc = argc;int n = 0;for (int i = 1; i < argc; i++) {if (!strcmp(argv[i], "-r"))reverse = !reverse;else if (!strcmp(argv[i], "-s") && i + 1 < argc) {i++;speed_factor = atof(argv[i]);argv[i] = 0;}else if (argv[i][0] != '-') {n++;continue;}else {printf("Invalid argument: '%s'\n", argv[i]);exit(1);}}if (!n) {fprintf(stderr, "Test program for application controlled GIF animation.\n");fprintf(stderr, "Please specify one or more image files!\n");exit(0);}if (speed_factor < 0.01 || speed_factor > 100)speed_factor = 1.;Fl_Double_Window win(800, 600);// prepare a canvas for the animation// (we want to show it in the center of the window)Fl_Box canvas(0, 0, win.w(), win.h());// 所有的新窗体,都是作为当前窗体的子窗体存在, 所以fltk的窗体不用指定父窗体是谁Fl_Box help(0, win.h() - 20, win.w(), 20, "Keys: N=next file, I=toggle info, R=play reverse, +/-/Enter/Space=change speed, Z=Zoom");win.resizable(win);win.end();win.show();Fl::add_handler(events);// use the 'DONT_RESIZE_CANVAS' flag to tell the animation// not to change the canvas size (which is the default).unsigned short flags = Fl_Anim_GIF_Image::DONT_RESIZE_CANVAS;//  flags |= Fl_Anim_GIF_Image::DEBUG_FLAG|Fl_Anim_GIF_Image::LOG_FLAG;animgif.canvas(&canvas, flags);load_next();return Fl::run();
}

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/67297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenEuler学习笔记(八):安装OpenEuler

在VMware Workstation中安装OpenEuler 准备工作 下载并安装VMware Workstation虚拟机软件。前往OpenEuler官网下载OpenEuler系统镜像文件。 创建虚拟机 打开VMware Workstation&#xff0c;点击“创建新的虚拟机”&#xff0c;选择“自定义”&#xff0c;点击“下一步”。选择…

Leetcode::119. 杨辉三角 II

119. 杨辉三角 II 已解答 简单 相关标签 相关企业 给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0…

让Android adb支持互联网调试脱离局域网

某些特殊场景下由于不方便&#xff0c;手机不在身边&#xff0c;但需要进行adb调试。 首先可以先开启adb的无线调试模式&#xff0c;我使用的是第二种方式。 在Android手机上安装一个终端模拟器&#xff0c;并赋予root权限&#xff0c;随后执行&#xff1a; setprop service.…

Dest1ny漏洞库:用友 U8-CRM 系统 ajaxgetborrowdata.php 存在 SQL 注入漏洞

用友U8-CRM系统ajaxgetborrowdata.php存在SQL注入漏洞&#xff0c;文件多个方法存在SQL注入漏洞&#xff0c;未经身份验证的攻击者通过漏洞执行任意SQL语句&#xff0c;调用xp_cmdshell写入后门文件&#xff0c;执行任意代码&#xff0c;从而获取到服务器权限。 hunter app.n…

能说说MyBatis的工作原理吗?

大家好&#xff0c;我是锋哥。今天分享关于【Redis为什么这么快?】面试题。希望对大家有帮助&#xff1b; 能说说MyBatis的工作原理吗&#xff1f; MyBatis 是一款流行的持久层框架&#xff0c;它通过简化数据库操作&#xff0c;帮助开发者更高效地与数据库进行交互。MyBatis…

DeepSeek崛起:中国AI新星如何撼动全球资本市场格局

引言 近期&#xff0c;中国人工智能实验室DeepSeek发布的两款开源模型——DeepSeek V3和DeepSeek R1——以其优异的性能和低廉的成本迅速爆火&#xff0c;引发了全球资本市场的震动&#xff0c;尤其对美国资本市场产生了显著影响。DeepSeek R1更是能够在数学、代码和推理任务上…

将5分钟安装Thingsboard 脚本升级到 3.9

稍微花了一点时间&#xff0c;将5分钟安装Thingsboard 脚本升级到最新版本 3.9。 [rootlab5 work]# cat one-thingsboard.shell echo "test on RHEL 8.10 " source /work/java/install-java.shell source /work/thingsboard/thingsboard-rpm.shell source /work/po…

算法刷题Day30

题目链接 描述 解题思路 考点&#xff1a;动态规划 dp[i][j]表示当前坐标的最小路径和dp初始化状态转移&#xff1a; dp[i][j] matrix[i][j] min(dp[i-1][j],dp[i][j-1]) 比较正上方和正左方的路径和哪个小。取小的那条路 代码 import copy class Solution:def minPathS…

大数据Hadoop入门2

目录 第三部分&#xff08;Hadoop MapReduce和Hadoop YARN&#xff09; 1.课程内容-大纲-学习目标 2.理解先分再合、分而治之的思想 3.hadoop团队针对MapReduce的设计构思 4.Hadoop MapReduce介绍、阶级划分和进程组成 5.Hadoop MapReduce官方示例-圆周率PI评估 6.Hadoo…

基于ESP8266的多功能环境监测与反馈系统开发指南

项目概述 本系统集成了物联网开发板、高精度时钟模块、环境传感器和可视化显示模块&#xff0c;构建了一个智能环境监测与反馈装置。通过ESP8266 NodeMCU作为核心控制器&#xff0c;结合DS3231实时时钟、DHT11温湿度传感器、光敏电阻和OLED显示屏&#xff0c;实现了环境参数的…

开发环境搭建-3:配置 JavaScript 开发环境 (fnm+ nodejs + pnpm + nrm)

在 WSL 环境中配置&#xff1a;WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 node 官网&#xff1a;https://nodejs.org/zh-cn/download 点击【下载】&#xff0c;选择想要的 node 版本、操作系统、node 版本管理器、npm包管理器 根据下面代码提示依次执行对应代码即可 基本概…

npm:升级自身时报错:EBADENGINE

具体报错信息如下&#xff1a; 1.原因分析 npm和当前的node版本不兼容。 // 当前实际版本: Actual: {"npm":"10.2.4","node":"v20.11.0"}可以通过官网文档查看与自己 node 版本 兼容的是哪一版本的npm&#xff0c;相对应进行更新即可…

WPS数据分析000005

目录 一、数据录入技巧 二、一维表 三、填充柄 向下自动填充 自动填充选项 日期填充 星期自定义 自定义序列 1-10000序列 四、智能填充 五、数据有效性 出错警告 输入信息 下拉列表 六、记录单 七、导入数据 ​编辑 八、查找录入 会员功能 Xlookup函数 VL…

翼星求生服务器搭建【Icarus Dedicated Server For Linux】

一、前言 本次搭建的服务器为Steam平台一款名为Icarus的沙盒、生存、建造游戏,由于官方只提供了Windows版本服务器导致很多热爱Linux的小伙伴无法释怀,众所周知Linux才是专业服务器的唯一准则。虽然Github上已经有大佬制作了容器版本但是容终究不够完美,毕竟容器无法与原生L…

机器学习-线性回归(参数估计之经验风险最小化)

给定一组包含 &#x1d441; 个训练样本的训练集 我们希望能够 学习一个最优的线性回归的模型参数 &#x1d498; 现在我们来介绍线性回归的一种模型参数估计方法&#xff1a;经验风险最小化。 我们前面说过&#xff0c;对于标签 &#x1d466; 和模型输出都为连续的实数值&…

前部分知识复习02

一、物体的屏幕UV坐标 float2 ScreenUV i.pos.xy / _ScreenParams.xy; 二、抓取屏幕图像 GrabPass{" _A "} //_A为贴图图像名称 之后需在Pass中声明该贴图才能在Pass中引用此贴图 三、屏幕抓取并制作热效应代码 Shader"unity/HeatDistort 07" {Pr…

【MQ】探索 Kafka

高性能 消息的顺序性、顺序写磁盘 零拷贝 RocketMQ内部主要是使用基于mmap实现的零拷贝&#xff0c;用来读写文件 减少cpu的拷贝次数和上下文切换次数&#xff0c;实现文件的高效读写操作 Kafka 零拷贝 Kafka 使用到了 mmap 和 sendfile 的方式来实现零拷贝。分别对应 Jav…

VMware 和本机(Win10)安装共享文件

1. 安装VM-tools, sudo apt-get install open-vm-tools-desktop -y 2. VMware->设置-> 选项中启动共享文件夹. 3. 本机设置共享文件夹(文件目录为data)&#xff0c;右键属性设置: VMware&#xff0c; Other Locations->Computer->mnt->data 即可。 ps: 还有个…

2025美赛MCM数学建模A题:《石头台阶的“记忆”:如何用数学揭开历史的足迹》(全网最全思路+模型)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ 《石头台阶的“记忆”&#xff1a;如何用数学揭开历史的足迹》 目录 《石头台阶的“记忆”&#xff1a;如何用数学揭开历史的足迹》 ✨摘要✨ ✨引言✨ 1. 引言的结构 2. 撰写步骤 &#xff08;1&#xff09;研究背景 &#…

SpringBoot-Vue整合百度地图

文章目录 一、Spring Boot整合百度地图的步骤1. 申请百度地图的AK值2. 创建实体类3. 创建Controller层4. 前端集成百度地图4.1 在Vue项目中安装百度地图Vue组件库4.2 在Vue项目中引入百度地图API4.3 创建地图组件 二、实现功能说明1. 前端部分&#xff1a;2. 后端部分&#xff…