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

文章目录

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

前言

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


创建窗口的流程

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

  1. 初始化 SDL 库。
  2. 创建一个 SDL 窗口。
  3. 获取与窗口关联的表面(Surface)。
  4. 更新窗口表面以显示内容。
  5. 延迟一定时间,以便窗口保持显示。
  6. 销毁窗口并退出 SDL 库。

需要使用的函数

1. 初始化 SDL 库

函数原型

c 复制代码
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

示例代码

c 复制代码
if (SDL_Init(SDL_INIT_EVERYTHING) == -1)
{
    return -1;
}

2. 创建 SDL 窗口

函数原型

c 复制代码
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

示例代码

c 复制代码
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 会把图像数据存储在一个表面上。这样,你可以对这些图像进行操作,比如缩放、旋转、合并等。

显示内容:你在表面上画好图像之后,可以把它显示在屏幕上,就像把画好的画展示出来一样。

函数原型

c 复制代码
SDL_Surface* SDL_GetWindowSurface(SDL_Window* window);

作用

获取与指定窗口关联的表面,用于在窗口上绘制内容。

参数

  • window:要获取表面的窗口的句柄。

返回值

  • 成功返回 SDL_Surface 的指针,失败返回 NULL

示例代码

c 复制代码
SDL_Surface *surface = SDL_GetWindowSurface(window);

SDL_FillRect 函数介绍

在创建和更新窗口的过程中,有时需要对窗口的表面进行填充,例如填充某种颜色。SDL 提供了 SDL_FillRect 函数来实现这一功能。

函数原型

c 复制代码
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 函数将表面填充为白色:

c 复制代码
SDL_FillRect(surface, NULL, SDL_MapRGB(surface->format, 255, 255, 255));

此代码的解释如下:

surface:目标表面,即需要填充的表面。

NULL:表示填充整个表面。如果要填充部分区域,可以传递一个 SDL_Rect 结构体的指针。

SDL_MapRGB(surface->format, 255, 255, 255):生成一个颜色值,这里是白色。

4. 更新窗口表面

函数原型

c 复制代码
int SDL_UpdateWindowSurface(SDL_Window* window);

作用

更新窗口的表面,以显示最新的内容。

参数

  • window:要更新表面的窗口的句柄。

返回值

  • 成功返回 0,失败返回 -1

示例代码

c 复制代码
SDL_UpdateWindowSurface(window);

5. 延迟一定时间

函数原型

c 复制代码
void SDL_Delay(Uint32 ms);

作用

使程序暂停指定的毫秒数。

参数

  • ms:要延迟的时间,以毫秒为单位。

示例代码

c 复制代码
SDL_Delay(2000);

6. 销毁窗口并退出 SDL 库

函数原型

c 复制代码
void SDL_DestroyWindow(SDL_Window* window);
void SDL_Quit(void);

作用

销毁窗口并清理 SDL 所有初始化的子系统。

参数

  • window:要销毁的窗口的句柄。

示例代码

c 复制代码
SDL_DestroyWindow(window);
SDL_Quit();

示例代码

综合以上所有步骤,下面是完整的示例代码:

c 复制代码
#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 的基础使用有一个初步的了解,为进一步的多媒体编程打下基础。

相关推荐
余额不足121382 小时前
C语言基础十六:枚举、c语言中文件的读写操作
linux·c语言·算法
ue星空3 小时前
Windbg常用命令
windows
ragnwang3 小时前
C++ Eigen常见的高级用法 [学习笔记]
c++·笔记·学习
罗伯特祥4 小时前
C调用gnuplot绘图的方法
c语言·plot
嵌入式科普5 小时前
嵌入式科普(24)从SPI和CAN通信重新理解“全双工”
c语言·stm32·can·spi·全双工·ra6m5
Fre丸子_5 小时前
ffmpeg之播放一个yuv视频
ffmpeg·音视频
9527华安5 小时前
FPGA多路MIPI转FPD-Link视频缩放拼接显示,基于IMX327+FPD953架构,提供2套工程源码和技术支持
fpga开发·架构·音视频
lqqjuly6 小时前
特殊的“Undefined Reference xxx“编译错误
c语言·c++
catmes6 小时前
设置浏览器声音或视频的自动播放策略
chrome·音视频·edge浏览器
泰勒今天不想展开7 小时前
jvm接入prometheus监控
jvm·windows·prometheus