【问题标题】:Handle OS window resizing when using Dear ImGui (DX11 backend)使用 Dear ImGui(DX11 后端)时处理操作系统窗口大小调整
【发布时间】:2023-02-10 17:30:29
【问题描述】:

我正在尝试做一个简单的ImGuiWin32 应用程序视觉C++. 我注意到一个问题,当我尝试调整主机窗口大小时, 这ImGui窗口被拉伸并且小部件(还有其他东西,如线条)变形。

一个例子: 我正在画一条从 0, 0 到 200, 200 的线。 理论上,这条线应该始终与窗口底部成 45 度角,但在调整窗口大小时它会四处延伸。

我很确定这不是D3D11 问题,因为我之前已经与D3D11 合作过几次,而且我知道它无需任何额外的工作/代码即可处理窗口大小调整。

几天来我一直在浏览 imgui 文档,但我找不到任何问题的答案。这真的很令人沮丧,因为我认为对于这样一个众所周知的框架来说这将是一件微不足道的事情。

这是渲染代码:

std::optional<int> Window::beginRender() noexcept
{
    if (const auto code = Window::processMessages())
        return *code;

    ImGui_ImplDX11_NewFrame();
    ImGui_ImplWin32_NewFrame();
    ImGui::NewFrame();

    return {};
}

void Window::render(const char* windowTitle) noexcept
{
    ImGui::SetNextWindowPos({ 0, 0 });
    ImGui::SetNextWindowSize({ static_cast<float>(m_width), static_cast<float>(m_height) });

    ImVec2 test{ ImGui::GetWindowSize() };
    ImVec2 test2{ ImGui::GetContentRegionAvail() };

    ImGui::Begin(windowTitle, nullptr, /*ImGuiWindowFlags_NoResize |*/ ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoTitleBar);

    ImGui::ShowDemoWindow();
    ImGui::GetBackgroundDrawList()->AddLine(ImVec2{ 0.0f, 0.0f }, ImVec2{ 200.0f, 200.0f }, 0xFF0000FF);

    ImGui::End();
}

void Window::endRender() noexcept
{
    ImGui::EndFrame();

    ImGui::Render();

    constexpr float color[]{ 0.0f, 0.0f, 0.0f, 0.0f };

    m_pContext->OMSetRenderTargets(1, &m_pRTV, nullptr);
    m_pContext->ClearRenderTargetView(m_pRTV, color);

    updateTargetData();
    MoveWindow(m_hWnd, m_position.x, m_position.y, m_width, m_height, false);

    //ImGuiIO& io{ ::ImGui::GetIO() };
    //io.DisplaySize.x = m_width;
    //io.DisplaySize.y = m_height;

    ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());

    m_pSwapChain->Present(1, 0);
}

(关于应用程序:它正在跟踪另一个窗口(notepad.exe),所以我实际上正在调整目标大小,然后使用MoveWindow() 调整大小。但我想这没有任何区别)

那么我该如何解决这个问题呢?如何正确处理窗口大小调整ImGui

【问题讨论】:

  • 为什么不尝试另一个后端?例如,我从来没有遇到过 SDL 的这些问题。它是跨平台的,具有更简单的 API,并且在下一个 Windows 版本决定弃用 DX11 时不会过时?

标签: c++ c direct3d imgui


【解决方案1】:

在您的窗口过程函数中,当您调整大小时,您需要重新创建渲染目标视图,如下所示:

case WM_SIZE:
    {
        pMainRendertargetView->Release()
        pSwapChain->ResizeBuffers(0, LOWORD(lParam), HIWORD(lParam), DXGI_FORMAT_UNKNOWN, 0);
        ID3D11Texture2D* pBackBuffer;
        pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer));
        pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, pMainRenderTargetView);
        pBackBuffer->Release();
        // Change Viewport Here 
    }

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多