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
相关产品推荐
相关产品推荐

