|
|
楼主 |
发表于 2025-12-14 12:39:30
|
显示全部楼层
本帖最后由 zzz19760225 于 2025-12-14 13:48 编辑
1234567890
需求:一个按钮切换页面,页面内集合容器内容,随着按钮切换而变。就是Five和HOPE帖子里的内容,重新过一遍。
通义:C语言SDL2 linux mint22.2 绘制一个页面显示页面1,上面有一个按钮,点击按钮,页面上显示页面2。
勇士大闯关第1节C语言SDL2.c
- // 引入 SDL2 图形库的主头文件,用于窗口、渲染、事件等操作
- #include <SDL2/SDL.h>
- // 引入标准输入输出库,用于向终端打印错误信息
- #include <stdio.h>
- // 定义屏幕宽度常量,值为 800 像素
- #define 屏幕宽数 800
- // 定义屏幕高度常量,值为 600 像素
- #define 屏幕高数 600
- // 定义一个枚举类型 Page,用于表示当前程序所处的页面状态
- typedef enum {
- 序1, // 枚举值 0:代表第一页(起始页面)
- 序2 // 枚举值 1:代表第二页(切换后的页面)
- } 排序; // 给该枚举类型起一个别名:Page
- // 函数:负责绘制第一页的内容(白色背景 + 绿色按钮)
- void 页面1(SDL_Renderer* 渲染器) {
- // 设置绘图颜色为白色(RGBA: 255,255,255,255)
- SDL_SetRenderDrawColor(渲染器, 255, 255, 255, 255);
- // 使用当前颜色清空整个渲染目标(即绘制白色背景)
- SDL_RenderClear(渲染器);
-
- // 设置绘图颜色为绿色(用于绘制按钮)
- SDL_SetRenderDrawColor(渲染器, 0, 255, 0, 255);
-
- // 定义一个矩形结构体,作为“按钮”的位置和尺寸:
- // x = 屏幕中心横坐标 - 按钮宽的一半(实现水平居中)
- // y = 屏幕中心纵坐标 - 按钮高的一半(实现垂直居中)
- // 宽度 = 100 像素,高度 = 50 像素
- SDL_Rect 按钮变量 = { 屏幕宽数 / 2 - 50, 屏幕高数 / 2 - 25, 100, 50 };
-
- // 填充绘制这个绿色矩形(模拟一个可点击的按钮)
- SDL_RenderFillRect(渲染器, &按钮变量);
- }
- // 函数:负责绘制第二页的内容(纯蓝色背景)
- void 页面2(SDL_Renderer* 渲染器) {
- // 设置绘图颜色为蓝色(RGBA: 0,0,255,255)
- SDL_SetRenderDrawColor(渲染器, 0, 0, 255, 255);
- // 使用当前颜色清空整个屏幕(即绘制蓝色背景)
- SDL_RenderClear(渲染器);
- }
- // 主函数:程序的入口点
- int main(int argc, char* argv[]) {
- // 初始化 SDL 的视频子系统(用于创建窗口和图形渲染)
- if (SDL_Init(SDL_INIT_VIDEO) != 0) {
- // 如果初始化失败,打印错误信息到标准错误流并返回错误码 1
- fprintf(stderr, "无法初始化SDL: %s\n", SDL_GetError());
- return 1;
- }
- // 创建一个窗口:
- // 标题为“页面切换示例”,
- // 初始位置 (100, 100),
- // 宽度 = 屏幕宽数,高度 = 屏幕高数,
- // 标志为 0(普通窗口,无特殊属性)
- SDL_Window* 窗口1 = SDL_CreateWindow("页面切换示例", 100, 100, 屏幕宽数, 屏幕高数, 0);
-
- // 如果窗口创建失败,打印错误信息,退出 SDL 并返回错误码 1
- if (!窗口1) {
- fprintf(stderr, "无法创建窗口: %s\n", SDL_GetError());
- SDL_Quit();
- return 1;
- }
- // 为窗口创建一个硬件加速的渲染器,并启用垂直同步(防止画面撕裂)
- SDL_Renderer* 渲染器 = SDL_CreateRenderer(
- 窗口1, // 关联的窗口指针
- -1, // 使用默认的渲染驱动(-1 表示自动选择)
- SDL_RENDERER_ACCELERATED | // 启用 GPU 硬件加速
- SDL_RENDERER_PRESENTVSYNC // 启用垂直同步(匹配显示器刷新率)
- );
-
- // 如果渲染器创建失败,打印错误信息,销毁窗口,退出 SDL,返回错误码 1
- if (!渲染器) {
- fprintf(stderr, "无法创建渲染器: %s\n", SDL_GetError());
- SDL_DestroyWindow(窗口1); // 释放窗口资源
- SDL_Quit(); // 退出 SDL 子系统
- return 1;
- }
- // 定义一个整型标志变量,用于控制主循环是否继续运行(0 表示继续,1 表示退出)
- int 退出信号 = 0;
- // 定义当前页面状态变量,初始值为第一页(序1)
- 排序 当下页面 = 序1;
- // 声明一个 SDL 事件变量,用于接收和处理各种用户输入或系统事件
- SDL_Event 检测变量;
- // 主应用循环:只要“退出信号”为 0,就持续运行
- while (!退出信号) {
- // 轮询事件队列,处理所有待处理的事件
- while (SDL_PollEvent(&检测变量)) {
- // 如果检测到用户点击了窗口右上角的关闭按钮(SDL_QUIT 事件)
- if (检测变量.type == SDL_QUIT) {
- 退出信号 = 1; // 设置退出标志,使主循环结束
- }
- // 如果检测到鼠标按键按下事件
- else if (检测变量.type == SDL_MOUSEBUTTONDOWN) {
- int 横, 纵; // 声明两个整数变量,用于存储鼠标坐标
- // 获取鼠标在窗口内的当前位置(横 = x, 纵 = y)
- SDL_GetMouseState(&横, &纵);
-
- // 判断:当前是否处于第一页?并且鼠标点击位置是否落在按钮区域内?
- if (当下页面 == 序1 &&
- 横 >= 屏幕宽数 / 2 - 50 && // 鼠标横坐标 ≥ 按钮左边界
- 横 <= 屏幕宽数 / 2 + 50 && // 鼠标横坐标 ≤ 按钮右边界
- 纵 >= 屏幕高数 / 2 - 25 && // 鼠标纵坐标 ≥ 按钮上边界
- 纵 <= 屏幕高数 / 2 + 25) { // 鼠标纵坐标 ≤ 按钮下边界
-
- // 如果满足上述条件,则切换到第二页
- 当下页面 = 序2;
- }
- }
- }
- // 根据当前页面状态,调用对应的页面渲染函数
- if (当下页面 == 序1) {
- 页面1(渲染器); // 渲染第一页(含绿色按钮)
- } else if (当下页面 == 序2) {
- 页面2(渲染器); // 渲染第二页(纯蓝色背景)
- }
- // 将后台渲染缓冲区的内容提交(翻转)到屏幕上显示(双缓冲机制)
- SDL_RenderPresent(渲染器);
- }
- // 程序即将结束,释放所有占用的系统资源
- SDL_DestroyRenderer(渲染器); // 销毁渲染器对象
- SDL_DestroyWindow(窗口1); // 销毁窗口对象
- SDL_Quit(); // 退出 SDL 所有子系统
- // 返回 0,表示程序正常退出
- return 0;
- }
复制代码 出现一个空白页面,有一个绿色长条,按钮点击绿色,就会切换到一个蓝色的页面。
自从使用了中文变量,眼睛就好使多了。 |
|