【音视频SDL2入门】创建第一个窗口
文章目录
- 前言
- 创建窗口的流程
- 需要使用的函数
- 1. 初始化 SDL 库
- 2. 创建 SDL 窗口
- 3. 获取与窗口关联的表面
- SDL_FillRect 函数介绍
- 4. 更新窗口表面
- 5. 延迟一定时间
- 6. 销毁窗口并退出 SDL 库
- 示例代码
- 总结
前言
SDL2(Simple DirectMedia Layer)是一个跨平台的开发库,旨在为多媒体应用程序(如游戏和视频播放软件)提供低级别的访问接口。SDL2 提供了创建窗口、处理输入、播放音频等多种功能,非常适合初学者入门音视频编程。本篇文章将介绍如何使用 SDL2 创建一个简单的窗口,并对相关的流程和函数进行详细讲解。
创建窗口的流程
创建一个 SDL2 窗口的基本流程包括以下几个步骤:
- 初始化 SDL 库。
- 创建一个 SDL 窗口。
- 获取与窗口关联的表面(Surface)。
- 更新窗口表面以显示内容。
- 延迟一定时间,以便窗口保持显示。
- 销毁窗口并退出 SDL 库。
需要使用的函数
1. 初始化 SDL 库
函数原型:
int SDL_Init(Uint32 flags);
作用:
初始化 SDL 库及其子系统。
参数:
flags:初始化标志,可以是以下值的组合:SDL_INIT_TIMER:初始化定时器子系统。SDL_INIT_AUDIO:初始化音频子系统。SDL_INIT_VIDEO:初始化视频子系统。SDL_INIT_JOYSTICK:初始化摇杆子系统。SDL_INIT_HAPTIC:初始化触觉反馈子系统。SDL_INIT_GAMECONTROLLER:初始化游戏控制器子系统。SDL_INIT_EVENTS:初始化事件子系统。SDL_INIT_EVERYTHING:初始化所有的子系统。
返回值:
- 成功返回
0,失败返回-1。
示例代码:
if (SDL_Init(SDL_INIT_EVERYTHING) == -1)
{return -1;
}
2. 创建 SDL 窗口
函数原型:
SDL_Window* SDL_CreateWindow(const char* title, int x, int y, int w, int h, Uint32 flags);
作用:
创建一个窗口并返回窗口的句柄。
参数:
title:窗口的标题。x:窗口的初始 x 坐标。SDL_WINDOWPOS_UNDEFINED:由系统决定窗口位置。
y:窗口的初始 y 坐标。SDL_WINDOWPOS_UNDEFINED:由系统决定窗口位置。
w:窗口的宽度。h:窗口的高度。flags:窗口标志,可以是以下值的组合:SDL_WINDOW_FULLSCREEN:创建一个全屏窗口。SDL_WINDOW_OPENGL:创建一个支持 OpenGL 的窗口。SDL_WINDOW_SHOWN:创建一个可见的窗口。SDL_WINDOW_HIDDEN:创建一个隐藏的窗口。SDL_WINDOW_BORDERLESS:创建一个无边框的窗口。SDL_WINDOW_RESIZABLE:创建一个可调整大小的窗口。SDL_WINDOW_MINIMIZED:创建一个最小化的窗口。SDL_WINDOW_MAXIMIZED:创建一个最大化的窗口。SDL_WINDOW_INPUT_GRABBED:创建一个抓取输入的窗口。SDL_WINDOW_ALLOW_HIGHDPI:创建一个支持高 DPI 的窗口。
返回值:
- 成功返回
SDL_Window的指针,失败返回NULL。
示例代码:
SDL_Window *window = SDL_CreateWindow("My First SDL2 Window", 100, 100, 500, 500, SDL_WINDOW_SHOWN);if (!window)
{printf("Error: %s\n", SDL_GetError());return -1;
}
3. 获取与窗口关联的表面
SDL2 表面(Surface)是一个用于存储图像数据的结构,在使用 SDL2 进行图形编程时非常常见。可以把它简单理解为一个画布或画板,用来绘制和显示图像。
想象一下你在画一幅画:
画布:SDL2 表面就像是你的画布。它是一个空白的地方,你可以在上面画图、写字、添加颜色等。
图像存储:当你把图像加载到程序中,SDL2 会把图像数据存储在一个表面上。这样,你可以对这些图像进行操作,比如缩放、旋转、合并等。
显示内容:你在表面上画好图像之后,可以把它显示在屏幕上,就像把画好的画展示出来一样。
函数原型:
SDL_Surface* SDL_GetWindowSurface(SDL_Window* window);
作用:
获取与指定窗口关联的表面,用于在窗口上绘制内容。
参数:
window:要获取表面的窗口的句柄。
返回值:
- 成功返回
SDL_Surface的指针,失败返回NULL。
示例代码:
SDL_Surface *surface = SDL_GetWindowSurface(window);
SDL_FillRect 函数介绍
在创建和更新窗口的过程中,有时需要对窗口的表面进行填充,例如填充某种颜色。SDL 提供了 SDL_FillRect 函数来实现这一功能。
函数原型
int SDL_FillRect(SDL_Surface *dst, const SDL_Rect *rect, Uint32 color);
作用
SDL_FillRect 函数用于填充一个矩形区域,可以是整个表面,也可以是指定的部分区域。它通常用于设置背景颜色或在表面上绘制矩形。
参数
dst:目标表面,即要填充的表面。
rect:指向一个 SDL_Rect 结构体的指针,表示要填充的矩形区域。如果为 NULL,则填充整个表面。
x:矩形左上角的 x 坐标。
y:矩形左上角的 y 坐标。
w:矩形的宽度。
h:矩形的高度。
color:要填充的颜色,用 SDL_MapRGB 或 SDL_MapRGBA 函数生成。
返回值
成功返回 0。
失败返回 -1,并设置错误信息。
示例代码
以下示例展示了如何使用 SDL_FillRect 函数将表面填充为白色:
SDL_FillRect(surface, NULL, SDL_MapRGB(surface->format, 255, 255, 255));
此代码的解释如下:
surface:目标表面,即需要填充的表面。
NULL:表示填充整个表面。如果要填充部分区域,可以传递一个 SDL_Rect 结构体的指针。
SDL_MapRGB(surface->format, 255, 255, 255):生成一个颜色值,这里是白色。
4. 更新窗口表面
函数原型:
int SDL_UpdateWindowSurface(SDL_Window* window);
作用:
更新窗口的表面,以显示最新的内容。
参数:
window:要更新表面的窗口的句柄。
返回值:
- 成功返回
0,失败返回-1。
示例代码:
SDL_UpdateWindowSurface(window);
5. 延迟一定时间
函数原型:
void SDL_Delay(Uint32 ms);
作用:
使程序暂停指定的毫秒数。
参数:
ms:要延迟的时间,以毫秒为单位。
示例代码:
SDL_Delay(2000);
6. 销毁窗口并退出 SDL 库
函数原型:
void SDL_DestroyWindow(SDL_Window* window);
void SDL_Quit(void);
作用:
销毁窗口并清理 SDL 所有初始化的子系统。
参数:
window:要销毁的窗口的句柄。
示例代码:
SDL_DestroyWindow(window);
SDL_Quit();
示例代码
综合以上所有步骤,下面是完整的示例代码:
#include <SDL.h>
#include <stdio.h>int main(int argc, char* argv[]) {if (SDL_Init(SDL_INIT_EVERYTHING) == -1){return -1;}SDL_Window *window = SDL_CreateWindow("My First SDL2 Window", 100, 100, 500, 500, SDL_WINDOW_SHOWN);if (!window){printf("Error: %s\n", SDL_GetError());return -1;}SDL_Surface *surface = SDL_GetWindowSurface(window);SDL_FillRect(surface, NULL, SDL_MapRGB(surface->format, 255, 255, 255));SDL_UpdateWindowSurface(window);SDL_Delay(2000);SDL_DestroyWindow(window);SDL_Quit();return 0;
}
总结
SDL2 是一个强大的跨平台开发库,通过它可以方便地创建和管理窗口。本文介绍了使用 SDL2 创建一个简单窗口的基本流程和相关函数。希望通过这篇文章,您能对 SDL2 的基础使用有一个初步的了解,为进一步的多媒体编程打下基础。
相关文章:
【音视频SDL2入门】创建第一个窗口
文章目录 前言创建窗口的流程需要使用的函数1. 初始化 SDL 库2. 创建 SDL 窗口3. 获取与窗口关联的表面SDL_FillRect 函数介绍4. 更新窗口表面5. 延迟一定时间6. 销毁窗口并退出 SDL 库示例代码总结 前言 SDL2(Simple DirectMedia Layer)是一个跨平台的…...
《置身事内:中国政府与经济发展》生活过得好一点,比大多数宏伟更宏伟
《置身事内:中国政府与经济发展》生活过得好一点,比大多数宏伟更宏伟 兰小欢,复旦大学中国社会主义市场经济研究中心、经济学院副教授,上海国际金融与经济研究院研究员。美国弗吉尼亚大学经济学博士。 上海人民出版社 文章目录 《…...
MongoDB教程(十八):MongoDB MapReduce
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、MapRed…...
HTML前端面试题之<iframe>标签
面试题:iframe 标签的作用是什么?有哪些优缺点 ? 讲真,刷这道面试题之前我根本没有接触过iframe,网课没讲过,项目实战没用过,但却在面试题里出现了!好吧,我只能说:前端路漫漫&…...
Docker-Compose实现MySQL之主从复制
1. 主服务器(IP:192.168.186.77) 1.1 docker-compose.yml services:mysql-master:image: mysql:latest # 使用最新版本的 MySQL 镜像container_name: mysql-master # 容器的名称environment:MYSQL_ROOT_PASSWORD: 123456 # MySQL root 用户的密码MYSQL_DATABASE: masterd…...
jetson显卡没有加速,而是在用cpu推理?
jetson的库,特别是使用显卡的库,大多需要单独安装 大概率是重装了pytorch,可以使用jetson官网的pytorch! 下面是官网的链接 PyTorch for Jetson - Announcements - NVIDIA Developer Forums 安装完成之后先使用命令查看是否安…...
Linux下如何安装配置Fail2ban防护工具
Fail2ban是一款在Linux服务器上用于保护系统免受恶意攻击的防护工具。它通过监视系统日志,检测到多次失败的登录尝试或其他恶意行为后,会自动将攻击源的IP地址加入防火墙的黑名单,从而阻止攻击者进一步访问服务器。本文将介绍如何在Linux系统…...
js的深浅拷贝
深浅拷贝是编程中对数据复制的两种不同方式,它们在处理对象和数组等复合数据结构时尤为重要。下面将详细解释这两种拷贝方式。 浅拷贝(Shallow Copy) 浅拷贝创建了原始对象的一个新实例,但这个新实例的属性只是原始对象属性的引…...
实验八: 彩色图像处理
目录 一、实验目的 二、实验原理 1. 常见彩色图像格式 2. 伪彩色图像 3. 彩色图像滤波 三、实验内容 四、源程序和结果 (1) 主程序(matlab (2) 函数FalseRgbTransf (3) 函数hsi2rgb (4) 函数rgb2hsi (5) 函数GrayscaleFilter (6) 函数RgbFilter 五、结果分析 1. …...
Python酷库之旅-第三方库Pandas(048)
目录 一、用法精讲 171、pandas.Series.nlargest方法 171-1、语法 171-2、参数 171-3、功能 171-4、返回值 171-5、说明 171-6、用法 171-6-1、数据准备 171-6-2、代码示例 171-6-3、结果输出 172、pandas.Series.nsmallest方法 172-1、语法 172-2、参数 172-3、…...
springboot爱宠屋宠物商店管理系统-计算机毕业设计源码52726
目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能…...
自训练和增量训练word2vec模型
1、自己准备训练语料文件 根据自己的业务场景准备训练数据,比如用户在商城上的同购行为序列或同浏览行为序列。 我们希望通过自己训练业务相关的语料word2vec模型来获得词嵌入、词相关性查询等。 1.1 准备语料库文件 # 示例:准备自己的一个大规模的语…...
华三路由器开启web访问
配置路由器: # 配置Web用户名为admin,认证密码为admin,服务类型为http,用户角色为network-admin。 [Sysname] local-user admin [Sysname-luser-manage-admin] service-type http [Sysname-luser-manage-admin] authorization…...
C++软件开发值得推荐的十大高效软件分析工具
目录 1、概述 2、高效软件工具介绍 2.1、窗口查看工具SPY 2.2、Dependency Walker 2.3、剪切板查看工具Clipbrd 2.4、GDI对象查看工具GDIView 2.5、Process Explorer 2.6、Prcoess Monitor 2.7、API Monitor 2.8、调试器Windbg 2.9、反汇编工具IDA 2.10、抓包工具…...
vue2老项目中node-sass更换dart-sass
更换原因:node-sass经常会出现node版本问题,就很麻烦 卸载项目中的node-sass sass-loader npm uninstall sass-loader sass 安装dart-sas sass-loader 推荐安装sass1.26.2 sass-loader7.3.1 npm install sass-loader7.3.1 sass1.26.2 从新配置vue.…...
源/目的检查开启导致虚拟IP背后的LVS无法正常访问
情况描述 近期发现48网段主机无法访问8.83这个VIP(虚拟IP),环境是 8.83 绑定了两个LVS实例,然后LVS实例转发到后端的nginx 静态资源;整个流程是,客户端发起对VIP的请求,LVS将请求转发到后端实例…...
类和对象(四)
构造函数中的初始化列表 之前在实现构造函数时,主要是在函数体内进行赋值,而构造函数还有另一种初始化方式,通过初始化列表进行初始化。 初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成员列表,…...
<PLC><HMI><汇川>在汇川HMI画面中,如何为UI设置全局样式?
前言 汇川的HMI软件是使用了Qt来编写的,因此在汇川的HMI程序编写过程,是支持使用qt的样式来自定义部件样式的,即qss格式。 概述 汇川的软件本身提供三个系统的style样式,我们可以直接使用,但是,如果系统提供的样式不符合你的需求,那么你可以对其进行修改,或者自己新建…...
在Git项目中添加并应用“.gitignore”文件
在Git项目中添加并应用.gitignore文件 创建或修改.gitignore文件: 在项目的根目录下创建一个名为.gitignore的文件。如果已经有此文件,可以直接修改。 在文件中添加您希望Git忽略的文件和目录。例如: # 忽略所有的log文件 *.log# 忽略所有的…...
LeetCode Hot100 搜索二维矩阵
给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式
pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图,如果边框加在dom上面,pdf-lib导出svg的时候并不会导出边框,所以只能在echarts图上面加边框 grid的边框是在图里…...
深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学
一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件,其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时,价带电子受激发跃迁至导带,形成电子-空穴对,导致材料电导率显著提升。…...
项目进度管理软件是什么?项目进度管理软件有哪些核心功能?
无论是建筑施工、软件开发,还是市场营销活动,项目往往涉及多个团队、大量资源和严格的时间表。如果没有一个系统化的工具来跟踪和管理这些元素,项目很容易陷入混乱,导致进度延误、成本超支,甚至失败。 项目进度管理软…...
