You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SDL3中无边框可调整大小窗口失效问题求助

SDL3无边框窗口无法调整大小的问题解决

问题现象

在SDL3里,当你把窗口设为无边框(SDL_WINDOW_BORDERLESS),再调用SDL_SetWindowResizable(window, true)开启可调整大小后,窗口确实会变成无边框状态,但没法用鼠标拖动调整尺寸。哪怕加了自定义命中测试函数(想只允许从右下角调整),问题还是存在。

问题原因

SDL3中,无边框窗口默认不会触发系统原生的窗口调整交互,仅靠SDL_SetWindowResizable没法让系统识别可调整区域。另外原代码还有两个明显问题:

  • isRunning初始值设为false,程序直接退出,根本没法测试窗口调整功能;
  • 命中测试函数不管鼠标在窗口哪个位置,都返回SDL_HITTEST_RESIZE_BOTTOMRIGHT,逻辑不符合预期。

解决方案

  1. 修正主循环启动逻辑:把isRunning初始值改成true,确保程序能进入事件循环;
  2. 完善命中测试函数:判断鼠标是否处于窗口右下角的指定像素范围内,再返回对应的调整标识,其他位置返回普通区域;
  3. 明确窗口创建属性:创建窗口时直接同时传入SDL_WINDOW_BORDERLESS和SDL_WINDOW_RESIZABLE标志,避免后续设置的兼容性问题。

修正后的代码

#include <SDL3/SDL.h>

// 定义边缘检测的阈值(单位:像素)
const int EDGE_THRESHOLD = 10;

static SDL_HitTestResult SDLCALL hitTest(SDL_Window* window, const SDL_Point* pt, void* data)
{
    int windowWidth, windowHeight;
    SDL_GetWindowSize(window, &windowWidth, &windowHeight);

    // 仅当鼠标在右下角阈值范围内时,允许调整大小
    if ((pt->x >= windowWidth - EDGE_THRESHOLD) && (pt->y >= windowHeight - EDGE_THRESHOLD)) {
        return SDL_HITTEST_RESIZE_BOTTOMRIGHT;
    }

    // 其他位置返回普通区域,不触发调整
    return SDL_HITTEST_NORMAL;
}

int main(int argc, char* argv[])
{
    SDL_Window* window;
    SDL_Renderer* renderer;
    bool isRunning = true; // 修正:初始化为true,让循环正常运行

    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL初始化失败: %s", SDL_GetError());
        return 1;
    }

    // 创建窗口时同时指定无边框和可调整大小属性
    window = SDL_CreateWindow("Test Window", 800, 800, SDL_WINDOW_BORDERLESS | SDL_WINDOW_RESIZABLE);
    if (!window) {
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "创建窗口失败: %s", SDL_GetError());
        SDL_Quit();
        return 1;
    }

    renderer = SDL_CreateRenderer(window, NULL);
    if (!renderer) {
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "创建渲染器失败: %s", SDL_GetError());
        SDL_DestroyWindow(window);
        SDL_Quit();
        return 1;
    }

    SDL_SetWindowHitTest(window, hitTest, NULL); // 无需额外数据,传入NULL即可

    while (isRunning)
    {
        SDL_Event event;
        while (SDL_PollEvent(&event))
        {
            switch (event.type)
            {
            case SDL_EVENT_QUIT:
                isRunning = false;
                break;
            // 可选:监听窗口大小变化事件,做对应处理
            case SDL_EVENT_WINDOW_RESIZED:
                SDL_Log("窗口大小变为: %dx%d", event.window.data1, event.window.data2);
                break;
            }
        }

        SDL_SetRenderDrawColor(renderer, 0x20, 0x20, 0x20, 0xFF);
        SDL_RenderClear(renderer);
        SDL_RenderPresent(renderer);
    }

    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;
}

额外说明

如果按上述修改后仍无法正常调整窗口大小,可能是SDL3的版本bug,建议尝试更新到最新的SDL3开发版本,确认问题是否已被修复。

内容的提问来源于stack exchange,提问作者DozingDuckling

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:52:26