You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让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

火山引擎 最新活动