当前位置: 首页 > news >正文

【音视频SDL2入门】创建第一个窗口

文章目录

  • 前言
    • 创建窗口的流程
    • 需要使用的函数
      • 1. 初始化 SDL 库
      • 2. 创建 SDL 窗口
      • 3. 获取与窗口关联的表面
      • SDL_FillRect 函数介绍
      • 4. 更新窗口表面
      • 5. 延迟一定时间
      • 6. 销毁窗口并退出 SDL 库
      • 示例代码
      • 总结


前言

SDL2(Simple DirectMedia Layer)是一个跨平台的开发库,旨在为多媒体应用程序(如游戏和视频播放软件)提供低级别的访问接口。SDL2 提供了创建窗口、处理输入、播放音频等多种功能,非常适合初学者入门音视频编程。本篇文章将介绍如何使用 SDL2 创建一个简单的窗口,并对相关的流程和函数进行详细讲解。


创建窗口的流程

创建一个 SDL2 窗口的基本流程包括以下几个步骤:

  1. 初始化 SDL 库。
  2. 创建一个 SDL 窗口。
  3. 获取与窗口关联的表面(Surface)。
  4. 更新窗口表面以显示内容。
  5. 延迟一定时间,以便窗口保持显示。
  6. 销毁窗口并退出 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&#xff08;Simple DirectMedia Layer&#xff09;是一个跨平台的…...

《置身事内:中国政府与经济发展》生活过得好一点,比大多数宏伟更宏伟

《置身事内&#xff1a;中国政府与经济发展》生活过得好一点&#xff0c;比大多数宏伟更宏伟 兰小欢&#xff0c;复旦大学中国社会主义市场经济研究中心、经济学院副教授&#xff0c;上海国际金融与经济研究院研究员。美国弗吉尼亚大学经济学博士。 上海人民出版社 文章目录 《…...

MongoDB教程(十八):MongoDB MapReduce

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、MapRed…...

HTML前端面试题之<iframe>标签

面试题&#xff1a;iframe 标签的作用是什么?有哪些优缺点 ? 讲真&#xff0c;刷这道面试题之前我根本没有接触过iframe&#xff0c;网课没讲过&#xff0c;项目实战没用过&#xff0c;但却在面试题里出现了&#xff01;好吧&#xff0c;我只能说&#xff1a;前端路漫漫&…...

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的库&#xff0c;特别是使用显卡的库&#xff0c;大多需要单独安装 大概率是重装了pytorch&#xff0c;可以使用jetson官网的pytorch&#xff01; 下面是官网的链接 PyTorch for Jetson - Announcements - NVIDIA Developer Forums 安装完成之后先使用命令查看是否安…...

Linux下如何安装配置Fail2ban防护工具

Fail2ban是一款在Linux服务器上用于保护系统免受恶意攻击的防护工具。它通过监视系统日志&#xff0c;检测到多次失败的登录尝试或其他恶意行为后&#xff0c;会自动将攻击源的IP地址加入防火墙的黑名单&#xff0c;从而阻止攻击者进一步访问服务器。本文将介绍如何在Linux系统…...

js的深浅拷贝

深浅拷贝是编程中对数据复制的两种不同方式&#xff0c;它们在处理对象和数组等复合数据结构时尤为重要。下面将详细解释这两种拷贝方式。 浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝创建了原始对象的一个新实例&#xff0c;但这个新实例的属性只是原始对象属性的引…...

实验八: 彩色图像处理

目录 一、实验目的 二、实验原理 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、自己准备训练语料文件 根据自己的业务场景准备训练数据&#xff0c;比如用户在商城上的同购行为序列或同浏览行为序列。 我们希望通过自己训练业务相关的语料word2vec模型来获得词嵌入、词相关性查询等。 1.1 准备语料库文件 # 示例&#xff1a;准备自己的一个大规模的语…...

华三路由器开启web访问

配置路由器&#xff1a; # 配置Web用户名为admin&#xff0c;认证密码为admin&#xff0c;服务类型为http&#xff0c;用户角色为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

更换原因&#xff1a;node-sass经常会出现node版本问题&#xff0c;就很麻烦 卸载项目中的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&#xff08;虚拟IP&#xff09;&#xff0c;环境是 8.83 绑定了两个LVS实例&#xff0c;然后LVS实例转发到后端的nginx 静态资源&#xff1b;整个流程是&#xff0c;客户端发起对VIP的请求&#xff0c;LVS将请求转发到后端实例…...

类和对象(四)

构造函数中的初始化列表 之前在实现构造函数时&#xff0c;主要是在函数体内进行赋值&#xff0c;而构造函数还有另一种初始化方式&#xff0c;通过初始化列表进行初始化。 初始化列表的使⽤⽅式是以⼀个冒号开始&#xff0c;接着是⼀个以逗号分隔的数据成员列表&#xff0c;…...

<PLC><HMI><汇川>在汇川HMI画面中,如何为UI设置全局样式?

前言 汇川的HMI软件是使用了Qt来编写的,因此在汇川的HMI程序编写过程,是支持使用qt的样式来自定义部件样式的,即qss格式。 概述 汇川的软件本身提供三个系统的style样式,我们可以直接使用,但是,如果系统提供的样式不符合你的需求,那么你可以对其进行修改,或者自己新建…...

在Git项目中添加并应用“.gitignore”文件

在Git项目中添加并应用.gitignore文件 创建或修改.gitignore文件&#xff1a; 在项目的根目录下创建一个名为.gitignore的文件。如果已经有此文件&#xff0c;可以直接修改。 在文件中添加您希望Git忽略的文件和目录。例如&#xff1a; # 忽略所有的log文件 *.log# 忽略所有的…...

LeetCode Hot100 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...