【音视频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 。…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
