在DX11项目中初始化imgui

一、手动导入流程

1.创建你自己的项目

首先生成imgui的库文件,可以在imgui官网下载相应的文件,然后找到头文件和源文件的位置。
打开vs新建一个空项目,这里我将项目命名为ImGui。

2.添加头文件和源文件

接着打开解决方案资源管理器,按照 头文件->添加->现有项 然后会弹出文件窗口,将imgui头文件和源文件的路径复制粘贴,先将头文件选中后确认,添加好头文件 。再按照 源文件->添加->现有项 以相似的方式把源文件添加进项目里。像下面这样就是添加成功了:
在这里插入图片描述

3.设置项目属性

以上两步完成后,就要生成库文件了。首先在属性窗口中的 配置属性->常规 里面设置如下:
在这里插入图片描述
需要修改成图中格式的属性有 输出目录 中间目录 配置类型 。

当以上这些设置好以后,右键创建的项目,生成即可。
生成成功后,在创建项目的路径中可以找到相应的Debug和Release版本的静态库,也就是
项目名称.lib,在我这里是ImGui.lib。
两个版本的库文件路径分别为:
ImGui/x64/Debug/ImGui.lib
ImGui/x64/Release/ImGui.lib

4.在DX11项目中配置imgui文件

这里我以Xjun教程项目中的02 Rendering a Triangle项目为例
首先设置好项目属性:
在 VC++目录中,在包含目录中添加imgui头文件的路径
库目录中添加你生成的库文件的路径
在C/C++ -> 常规 中的附加包含目录添加你创建的imgui项目的目录
然后在 链接器->输入 里面的附加依赖项里面添加你的库文件名称,例如我这里生成的库文件名称是ImGui.lib。
最后在项目中的源文件里添加imgui的cpp文件,添加完记得检查有没有漏添加哪一个文件,少了的话会报错。

二、用cmake快速构建imgui的方式

在Xjun教程项目文件夹中有一个名为ImGui的文件夹,里面包含了imgui的头文件,源文件和配置文件,要使用cmake构建imgui的话,首先要将这个文件夹复制到你要构建的项目路径里。

这里我以Project 01-09文件夹为例,首先将ImGui文件夹复制到Project 01-09的项目路径内
在这里插入图片描述
接着我们需要修改CMakeLists,确保cmake配置不会出错
在这里插入图片描述
只需多添加一条语句

add_subdirectory("ImGui")

接着使用cmake-gui构建后,在你想要使用imgui的项目的CMakeLists.txt文件中添加下面的语句:

target_link_libraries(项目名称 ImGui)
file(COPY imgui.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

二 初始化imgui

首先在DX11项目中的D3DApp.h中添加下面三个预编译指令

#include <imgui.h>
#include <imgui_impl_dx11.h>
#include <imgui_impl_win32.h>

在D3DApp.cpp中添加外部函数

extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

然后添加InitImGui函数(不要忘记在头文件中声明函数)

bool D3DApp::InitImGui()
{
    IMGUI_CHECKVERSION();
    ImGui::CreateContext();
    ImGuiIO& io = ImGui::GetIO();
    io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;     // 允许键盘控制
    io.ConfigWindowsMoveFromTitleBarOnly = true;              // 仅允许标题拖动

    // 设置Dear ImGui风格
    ImGui::StyleColorsDark();

    // 设置平台/渲染器后端
    ImGui_ImplWin32_Init(m_hMainWnd);
    ImGui_ImplDX11_Init(m_pd3dDevice.Get(), m_pd3dImmediateContext.Get());

    return true;

}

接着在D3DApp.cpp中的Init函数中添加以下语句

 if (!InitImGui())
        return false;

然后再同一文件中的MsgProc函数添加如下语句,使得gui窗口能够接收我们的操作并处理

if (ImGui_ImplWin32_WndProcHandler(m_hMainWnd, msg, wParam, lParam))
        return true;

最后再同一文件中的Run函数中调用三个函数,分别对应的是对direct3d,windows和imgui的操作

int D3DApp::Run()
{
    MSG msg = { 0 };

    m_Timer.Reset();

    while (msg.message != WM_QUIT)
    {
        if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            m_Timer.Tick();

            if (!m_AppPaused)
            {
                CalculateFrameStats();
                // 这里添加函数
                ImGui_ImplDX11_NewFrame();     
                ImGui_ImplWin32_NewFrame();
                ImGui::NewFrame();
                // --------
                UpdateScene(m_Timer.DeltaTime());
                DrawScene();
            }
            else
            {
                Sleep(100);
            }
        }
    }

    return (int)msg.wParam;
}

再到GameApp.cpp里面的DrawScene函数中调用以下函数

void GameApp::DrawScene()
{  
    // 可以在这之前调用ImGui的UI部分
    // Direct3D 绘制部分 
    ImGui::Render();
    // 下面这句话会触发ImGui在Direct3D的绘制
    // 因此需要在此之前将后备缓冲区绑定到渲染管线上
    ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());

    HR(m_pSwapChain->Present(0, 0));
}

至此,imgui的基本属性已经配置好了,现在我们就可以调用imgui库里的函数来制作自己的ui界面了。

这里可以再GameApp.cpp里面的UpdateScene函数里调用下面三个函数:

void GameApp::UpdateScene(float dt)
{
    // ImGui内部示例窗口
    ImGui::ShowAboutWindow();//展示一个“关于”窗口示例
    ImGui::ShowDemoWindow();//展示一个示例窗口
    ImGui::ShowUserGuide();//展示一个“用户说明”示例
}

效果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hunnybub

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值