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


前言

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

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在使用SDL2创建窗口时,可以使用`SDL_CreateWindow()`函数来指定要在哪个显示器上创建窗口。具体做法是在调用该函数时,使用`SDL_WindowFlags`枚举类型中的`SDL_WINDOW_FULLSCREEN_DESKTOP`标志,并将其作为第二个参数传入。同时,还需要指定显示器的索引,可以使用`SDL_GetNumVideoDisplays()`和`SDL_GetDisplayName()`函数获取显示器数量和名称。 以下是示例代码: ```c #include <SDL2/SDL.h> #include <stdio.h> int main(int argc, char* argv[]) { // 初始化SDL if (SDL_Init(SDL_INIT_VIDEO) < 0) { printf("SDL初始化失败: %s\n", SDL_GetError()); return -1; } // 获取第二个显示器的名称 int numDisplays = SDL_GetNumVideoDisplays(); if (numDisplays < 2) { printf("没有检测到第二个显示器!\n"); SDL_Quit(); return -1; } const char* displayName = SDL_GetDisplayName(1); // 创建窗口并指定显示器 SDL_Window* window = SDL_CreateWindow("在指定显示器上创建窗口", SDL_WINDOWPOS_UNDEFINED_DISPLAY(1), SDL_WINDOWPOS_UNDEFINED_DISPLAY(1), 640, 480, SDL_WINDOW_FULLSCREEN_DESKTOP); if (!window) { printf("创建窗口失败: %s\n", SDL_GetError()); SDL_Quit(); return -1; } // 进入消息循环 SDL_Event e; bool quit = false; while (!quit) { while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { quit = true; } } } // 清理资源 SDL_DestroyWindow(window); SDL_Quit(); return 0; } ``` 在上面的示例代码中,我们使用`SDL_GetNumVideoDisplays()`和`SDL_GetDisplayName()`函数获取第二个显示器的名称,并将其作为参数传入`SDL_CreateWindow()`函数中。最后,我们进入消息循环等待用户关闭窗口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人才程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值