PAYATHON 2026

raylib 重新创建窗口后,raygui 按钮文字为何消失?

数据阿明

结论

CloseWindow() 会销毁当前窗口的图形上下文和图形资源。ModeChoice() 关闭窗口后,SizeChoice() 又创建了一个窗口。如果 raygui 仍引用前一个窗口的字体资源,按钮可能还能响应点击,但文字无法正常绘制。

可以在每次调用 InitWindow() 后重新设置 raygui 字体:

uint8_t SizeChoice() {
    uint8_t Size;
    InitWindow(380, 160, "Size choice");
    GuiSetFont(GetFontDefault());

    // 后续按钮绘制代码
}

如果其他界面也会在关闭窗口后重新创建窗口,同样在对应的 InitWindow() 后调用 GuiSetFont(GetFontDefault())。这样 raygui 就会使用当前窗口的默认字体资源。

更稳妥的窗口组织方式

如果两个选择界面属于同一个程序,可以只创建一次窗口,在同一个绘制循环中按当前步骤显示内容。选完模式后切换到尺寸选择,最后再调用一次 CloseWindow():

InitWindow(460, 160, "Choice");

int screen = 0;
while (!WindowShouldClose() && screen < 2) {
    BeginDrawing();
    ClearBackground(WHITE);

    if (screen == 0) {
        if (GuiButton((Rectangle){20, 20, 200, 50}, "All colors")) screen = 1;
        if (GuiButton((Rectangle){240, 20, 200, 50}, "Gray Scale")) screen = 1;
    } else {
        if (GuiButton((Rectangle){20, 20, 100, 50}, "100x100")) screen = 2;
        if (GuiButton((Rectangle){140, 20, 100, 50}, "1000x1000")) screen = 2;
    }

    EndDrawing();
}

CloseWindow();

这段代码演示了界面切换方式。实际程序还需要在按钮点击时保存所选值。使用单窗口流程,也可以避免在两个选择函数中分别创建和销毁图形上下文。

注意事项

  • 不必为了让窗口隐藏而省略 CloseWindow()。程序结束或不再使用窗口时,关闭窗口是正常的资源清理步骤。
  • 调用 GuiSetFont(GetFontDefault()) 后,如果文字仍未显示,可以检查是否加载了自定义 raygui 字体或样式。这些资源也需要在新窗口创建后重新加载或设置。
  • 实际表现可能受 raylib、raygui 版本和自定义样式影响。仅凭这段代码无法确认字体状态是否是唯一原因;重设字体或复用同一个窗口,都是针对该资源生命周期问题的处理方向。

备注:内容仅供参考。