如何让ImGui菜单栏固定在SDL窗口顶部?
如何让ImGui菜单栏固定在SDL窗口顶部?
嘿,我来帮你搞定这个问题!你现在遇到的情况是:代码里创建了一个带菜单栏的普通ImGui窗口,所以它才会是一个独立的、可拖动的窗口,而不是附着在SDL主窗口顶部。其实ImGui本身就提供了专门的主菜单栏功能,直接用它就能实现你想要的效果。
解决方法
你只需要把原来创建独立窗口的代码,替换成ImGui的BeginMainMenuBar()函数即可——这个函数会自动生成一个横跨SDL窗口顶部的固定菜单栏,不需要额外的窗口容器。
修改前的代码片段:
ImGui::Begin("My Menu Bar", NULL, ImGuiWindowFlags_MenuBar ); if (ImGui::BeginMenuBar()) { if (ImGui::BeginMenu("File")) { if (ImGui::MenuItem("Open..", "Ctrl+O")) { } if (ImGui::MenuItem("Save", "Ctrl+S")) { } if (ImGui::MenuItem("Close", "Ctrl+W")) { } ImGui::EndMenu(); } ImGui::EndMenuBar(); } ImGui::End();
修改后的代码片段:
if (ImGui::BeginMainMenuBar()) { if (ImGui::BeginMenu("File")) { if (ImGui::MenuItem("Open..", "Ctrl+O")) { } if (ImGui::MenuItem("Save", "Ctrl+S")) { } if (ImGui::MenuItem("Close", "Ctrl+W")) { } ImGui::EndMenu(); } // 这里还可以添加其他菜单,比如Edit、Help之类的 ImGui::EndMainMenuBar(); }
为什么这样有效?
BeginMainMenuBar()是ImGui专门为全局主菜单栏设计的函数:
- 它会自动适配当前ImGui视口(也就是你的SDL窗口)的宽度,窗口大小变化时也会自动调整
- 菜单栏默认固定在窗口顶部,不能拖动或调整大小
- 不需要额外创建窗口容器,直接就能在里面添加菜单选项
另外,你原来的渲染顺序是对的:先渲染游戏内容,再渲染ImGui,这样菜单栏会显示在游戏画面的上方,完全符合预期。
备注:内容来源于stack exchange,提问作者kilcat




