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

Posted

技术标签:

【中文标题】Imgui创建弹出框删除灰显的焦点屏幕【英文标题】:Imgui create pop up box removing the grayed out focus screen 【发布时间】:2021-06-30 04:31:47 【问题描述】:

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

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

这是我用于创建模态窗口的代码:

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 部分添加某些标志?如果是这样,我应该使用什么标志?

谢谢,感谢您的帮助!

【问题讨论】:

模态通常意味着你不能与其他任何东西交互。也许您只是想要一个常规的弹出窗口? @RetiredNinja 那么我应该使用什么函数来定期弹出?通过使用 ImGui::Begin,我不希望它看起来像一个窗口/选项卡式窗口。所以不知道我应该改用什么功能:)你能告诉我吗?谢谢! 【参考方案1】:

根据imgui.h:659中的文档

弹出窗口、模态框:

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

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

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 文档在标题中很清楚。

【讨论】:

以上是关于Imgui创建弹出框删除灰显的焦点屏幕的主要内容,如果未能解决你的问题,请参考以下文章

在我的自定义按钮中打开 Airplay 弹出框

iPad使用触摸显示弹出框?

在表格视图中选择项目后无法关闭弹出框

有没有办法知道弹出框是从哪里出现的?

自动隐藏引导弹出框[关闭]

UISplitViewController - 主弹出框 - 肖像模式:如何自定义/删除最顶层的边框?