You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除ImGui DirectX11示例中的默认宿主窗口?

移除ImGui DirectX11示例默认宿主窗口,仅保留自定义红色窗口

核心操作步骤:

  • 删除默认窗口创建代码:直接移除示例中生成"Dear ImGui DirectX11 Example"窗口的全部代码块,包括窗口类注册、CreateWindowW调用:

    // 删掉以下所有代码
    //ImGui_ImplWin32_EnableDpiAwareness();
    WNDCLASSEXW wc = { sizeof(wc), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"ImGui Example", NULL };
    ::RegisterClassExW(&wc);
    HWND hwnd = ::CreateWindowW(wc.lpszClassName, L"Dear ImGui DirectX11 Example", WS_OVERLAPPEDWINDOW, 100, 100, 600, 600, NULL, NULL, wc.hInstance, NULL);
    

    同时清理该窗口对应的WndProc函数(无复用需求时)。

  • 绑定ImGui后端到自定义红色窗口:确保你的红色窗口已完成创建(拥有合法HWND,假设为my_red_hwnd),将ImGui初始化时的窗口句柄替换为自定义窗口的句柄:

    // 原代码
    // ImGui_ImplWin32_Init(hwnd);
    // 修改为
    ImGui_ImplWin32_Init(my_red_hwnd);
    ImGui_ImplDX11_Init(g_pd3dDevice, g_pd3dDeviceContext);
    
  • 适配自定义窗口的消息循环:将消息循环的窗口句柄改为自定义窗口的HWND,确保ImGui能正常接收输入事件:

    MSG msg;
    ZeroMemory(&msg, sizeof(msg));
    while (msg.message != WM_QUIT)
    {
        if (::PeekMessage(&msg, my_red_hwnd, 0U, 0U, PM_REMOVE))
        {
            ::TranslateMessage(&msg);
            ::DispatchMessage(&msg);
            continue;
        }
    
        // ImGui 帧处理流程
        ImGui_ImplDX11_NewFrame();
        ImGui_ImplWin32_NewFrame();
        ImGui::NewFrame();
    
        // 绘制你的红色窗口(示例代码)
        ImGui::Begin("My Red Window");
        ImGui::PushStyleColor(ImGuiCol_WindowBg, IM_COL32(255, 0, 0, 255));
        // 这里添加窗口内的UI元素
        ImGui::PopStyleColor();
        ImGui::End();
    
        ImGui::Render();
        const float clear_color[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
        g_pd3dDeviceContext->OMSetRenderTargets(1, &g_mainRenderTargetView, NULL);
        g_pd3dDeviceContext->ClearRenderTargetView(g_mainRenderTargetView, clear_color);
        ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
    
        g_pSwapChain->Present(1, 0);
    }
    
  • 确保自定义窗口的消息处理支持ImGui:在红色窗口的WndProc中调用ImGui的消息处理函数,否则ImGui无法响应输入:

    LRESULT CALLBACK MyRedWindowWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        if (ImGui_ImplWin32_WndProcHandler(hwnd, msg, wParam, lParam))
            return true;
    
        switch (msg)
        {
            case WM_DESTROY:
                ::PostQuitMessage(0);
                return 0;
            default:
                return ::DefWindowProc(hwnd, msg, wParam, lParam);
        }
    }
    

内容的提问来源于stack exchange,提问作者refrain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:35:15