Imgui 创建弹出框删除灰色焦点屏幕

Imgui create pop up box removing the grayed out focus screen

在 ImGui 中创建弹出模式时,我注意到应用程序的其余部分出现了一个灰色覆盖层(我认为是为了将焦点放在弹出窗口上)。

但是,我想知道是否有办法删除那个灰色的覆盖屏幕,这样即使弹出该模式,我仍然可以与应用程序的其余部分进行交互。因此,模式会弹出,但它不会干扰应用程序的其余部分 - 只会弹出一个信息来反映当前速度,直到用户单击“确定”以使弹出窗口消失。

这是我创建模态 window 的代码:

if (ImGui::BeginPopupModal("Speed Adjustment")) {
        std::string speed_text = "You're adjusting the speed";
        speed_text += "\n";
        ImGui::Text(speed_text.c_str());
        //list the current speed
        std::string currSpeed= "This is the current speed: " + std::to_string(databse->camSpeed);
        ImGui::Text(currSpeed.c_str());


        ImGui::Spacing();
        ImGui::NextColumn();

        ImGui::Columns(1);
        ImGui::Separator();

        ImGui::NewLine();

        ImGui::SameLine(GetWindowWidth() - 270);
        //click ok when finished adjusting
        if (ImGui::Button("OK finished adjusting", ImVec2(200, 0))) {
            speedpopup= false;
            ImGui::CloseCurrentPopup();
        }

        ImGui::EndPopup();
    }

我需要为 beginPopupModal 部分添加某些标志吗?如果是这样,我应该使用什么标志?

谢谢,如有任何帮助,我们将不胜感激!

根据 imgui.h:659

中的文档

弹出窗口、模式:

  • 它们阻止了正常的鼠标悬停检测(因此也阻止了大多数鼠标交互)。
  • 如果不是模态:可以通过单击它们之外的任意位置或按 ESCAPE 来关闭它们。
  • 它们的可见性状态 (~bool) 在内部保存,而不是像我们习惯的常规 Begin*() 调用那样由程序员保存。

如果您想要与应用程序的其余部分进行交互,即使在显示弹出窗口时,最好使用常规 ImGui::Begin() 调用。即使您可以根据需要使用适当的标志使 window 居中。

static bool speedpopup = true;
if (speedpopup) {
    if (ImGui::Begin("mypicker"))
    {
        std::string speed_text = "You're adjusting the speed";
        speed_text += "\n";
        ImGui::Text(speed_text.c_str());
        //list the current speed
        std::string currSpeed = "This is the current speed: ";
        ImGui::Text(currSpeed.c_str());

        ImGui::Spacing();
        ImGui::NextColumn();

        ImGui::Columns(1);
        ImGui::Separator();

        ImGui::NewLine();

        ImGui::SameLine(270);
        //click ok when finished adjusting
        if (ImGui::Button("OK finished adjusting", ImVec2(200, 0))) {
            speedpopup = false;
        }

        ImGui::End();
    }
}

像这样的辅助函数可以定义自定义Begin()

bool BeginCentered(const char* name)
{
    ImGuiIO& io = ImGui::GetIO();
    ImVec2 pos(io.DisplaySize.x * 0.5f, io.DisplaySize.y * 0.5f);
    ImGui::SetNextWindowPos(pos, ImGuiCond_Always, ImVec2(0.5f, 0.5f));
    ImGuiWindowFlags flags = ImGuiWindowFlags_NoMove
        | ImGuiWindowFlags_NoDecoration
        | ImGuiWindowFlags_AlwaysAutoResize
        | ImGuiWindowFlags_NoSavedSettings;
    return ImGui::Begin(name, nullptr, flags);
}

imgui 文档在 headers.

中很清楚