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 版本和自定义样式影响。仅凭这段代码无法确认字体状态是否是唯一原因;重设字体或复用同一个窗口,都是针对该资源生命周期问题的处理方向。
备注:内容仅供参考。
