如何移除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
相关产品推荐
相关产品推荐

