首先可以看看imgui的目录结构:

image-20210804154709131

backends中的文件:

image-20210804154910875

这里举例在一个简单的工程中使用imgui。

首先下图中框中的文件就是从上述的两个图中复制过来的。原本的工程中只有一个Transformation.cpp

image-20210804155115225

  1. 包含头文件

    #include "imgui/imgui.h"
    #include "imgui/imgui_impl_win32.h"
    #include "imgui/imgui_impl_dx11.h"
    
  2. 在进入消息循环之前

        // Setup Dear ImGui context
        IMGUI_CHECKVERSION();
        ImGui::CreateContext();
        ImGuiIO& io = ImGui::GetIO();
        io.ConfigFlags |= ImGuiConfigFlags_NavEnableSetMousePos;
       
        // Setup Dear ImGui style
        ImGui::StyleColorsDark();
       
        // Setup Platform/Renderer backends
        ImGui_ImplWin32_Init(g_hWnd);
        ImGui_ImplDX11_Init(g_pDevice.Get(), g_pContext.Get());
    
  3. 在DX11 Render一帧图像之前

              // Start the Dear ImGui frame
              ImGui_ImplDX11_NewFrame();
              ImGui_ImplWin32_NewFrame();
              ImGui::NewFrame();
              //这里可以使用imgui创建出很多的窗口。。。
    
  4. 在Draw之后Present之前

     ImGui::Render();
     ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
        
     // Present our back buffer to our front buffer
     g_pSwapChain->Present(1, 0);
    

至此,imgui创建的窗口就能显示在界面上了,但是有个问题就是鼠标去拖动这些窗口的时候是没有用的。这是因为imgui没有获取到窗口的拖动消息,所以导致窗口不能拖动。解决这个的办法就是在消息处理函数lpfnWndProc里面加上:

ImGui_ImplWin32_WndProcHandler(hWnd, message, wParam, lParam);

这个函数哪里来的呢?这个是imgui_impl_win32.cpp文件中实现的,但是在头文件里面没有声明,里面注释写的是让我们在使用的地方使用extern 声明一下。

加上这个之后一切就完美了。