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

Raylib+Raygui中第二个窗口按钮文本不显示的问题

Raylib+Raygui中第二个窗口按钮文本不显示的问题

嗨,我来帮你搞定这个问题!你已经精准定位到了关键——CloseWindow()就是导致按钮文本消失的元凶。Raylib在调用CloseWindow()时,会把当前窗口关联的所有资源(包括Raygui默认依赖的内置字体)全部释放掉。当你第二次调用InitWindow()创建新窗口时,Raygui并不会自动重新加载字体资源,所以按钮的文本没法渲染出来,但按钮的点击逻辑不受影响,因为区域判定和字体无关。

给你两个实用的解决办法:

方法一:重新加载字体(保留多窗口逻辑)

如果想继续用多窗口的方式,只需要在每个窗口初始化完成后,手动让Raygui重新加载默认字体就行。修改你的SizeChoice()函数,在InitWindow()之后添加一行字体设置代码:

uint8_t SizeChoice() {
    uint8_t Size;
    InitWindow(380, 160, "Size choice");
    // 重新加载默认字体并设置给Raygui
    GuiSetFont(LoadFontDefault());

    bool size[6] = {0,0,0,0,0,0};

    while (!WindowShouldClose() && !size[0] && !size[1] && !size[2] && !size[3] && !size[4] && !size[5]) {
        BeginDrawing();
        ClearBackground(WHITE);
        if (GuiButton((Rectangle){20, 20, 100, 50}, "100x100")) size[0] = true;
        if (GuiButton((Rectangle){140, 20, 100, 50}, "1000x1000")) size[1] = true;
        if (GuiButton((Rectangle){260, 20, 100, 50}, "HD")) size[2] = true;
        if (GuiButton((Rectangle){20, 90, 100, 50}, "FHD")) size[3] = true;
        if (GuiButton((Rectangle){140, 90, 100, 50}, "QHD")) size[4] = true;
        if (GuiButton((Rectangle){260, 90, 100, 50}, "4K")) size[5] = true;
        EndDrawing();
    }
    CloseWindow();
    if (size[0]) Size = 0xAA;
    if (size[1]) Size = 0xBB;
    if (size[2]) Size = 0xCC;
    if (size[3]) Size = 0xDD;
    if (size[4]) Size = 0xEE;
    if (size[5]) Size = 0xFF;
    return Size;
}

这样修改后,第二个窗口的按钮文本就能正常显示,同时你也能保留关闭窗口的逻辑。

方法二:改用单窗口切换界面(更符合Raylib设计思路)

其实Raylib的设计更偏向单窗口应用,频繁创建销毁窗口不仅容易引发资源问题,效率也不高。你可以只初始化一次窗口,在同一个窗口内切换不同的界面(模式选择、尺寸选择),从根源上避免资源释放的问题。给你一个简化的示例:

#include <raylib.h>
#define RAYGUI_IMPLEMENTATION
#include <raygui.h>
#include <random>
#include <fstream>
#include <cstdint>
#include <iomanip>
#include <iostream>

#define RGB 0xFF
#define GS 0x00

enum Screen { SCREEN_MODE, SCREEN_SIZE, SCREEN_DONE };

int main() {
    InitWindow(460, 160, "Noise Generator Setup");
    GuiSetFont(LoadFontDefault());
    
    Screen currentScreen = SCREEN_MODE;
    uint8_t Mode = 0, Size = 0;
    bool bRGB = false, bGS = false;
    bool size[6] = {0};

    while (!WindowShouldClose() && currentScreen != SCREEN_DONE) {
        BeginDrawing();
        ClearBackground(WHITE);

        switch(currentScreen) {
            case SCREEN_MODE:
                if (GuiButton((Rectangle){20, 20, 200, 50}, "All colors")) {
                    Mode = RGB;
                    currentScreen = SCREEN_SIZE;
                }
                if (GuiButton((Rectangle){240, 20, 200, 50}, "Gray Scale")) {
                    Mode = GS;
                    currentScreen = SCREEN_SIZE;
                }
                break;
            
            case SCREEN_SIZE:
                if (GuiButton((Rectangle){20, 20, 100, 50}, "100x100")) { Size = 0xAA; currentScreen = SCREEN_DONE; }
                if (GuiButton((Rectangle){140, 20, 100, 50}, "1000x1000")) { Size = 0xBB; currentScreen = SCREEN_DONE; }
                if (GuiButton((Rectangle){260, 20, 100, 50}, "HD")) { Size = 0xCC; currentScreen = SCREEN_DONE; }
                if (GuiButton((Rectangle){20, 90, 100, 50}, "FHD")) { Size = 0xDD; currentScreen = SCREEN_DONE; }
                if (GuiButton((Rectangle){140, 90, 100, 50}, "QHD")) { Size = 0xEE; currentScreen = SCREEN_DONE; }
                if (GuiButton((Rectangle){260, 90, 100, 50}, "4K")) { Size = 0xFF; currentScreen = SCREEN_DONE; }
                break;
            
            default:
                break;
        }

        EndDrawing();
    }

    CloseWindow();
    std::cout << std::hex << std::setw(2) << std::uppercase << std::setfill('0') << static_cast<int>(Mode) << static_cast<int>(Size);
    std::cin.clear();
    std::cin.get();
    return 0;
}

这种方式不仅解决了按钮文本的问题,还避免了重复创建窗口带来的资源浪费,代码结构也更清晰规范。

你提到内存管理的问题,单窗口的方式本身就更优化,也能降低资源泄漏的风险。如果只是想快速解决当前的按钮文本问题,方法一足够用;如果想让代码更专业,方法二更值得推荐。

备注:内容来源于stack exchange,提问作者Bl4zej

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 18:23:07