外面比较流行的一个UI库,这里介绍下简单的使用方法

引擎Git地址

开发环境

Win10,Directx11 SDK,VS2015,Imgui版本为1.78 WIP

开发准备

工程目录下的examples带有DX11的使用例子,通过查看代码整理后的库文件如图:

其中imgui_impl_dx11.h和imgui_impl_dx11.cpp被博主重新封装了,本文末尾提供打包库下载。

引用库

d3d11.lib,d3dcompiler.lib

代码添加

1、创建D3D设备后,初始化imgui引擎

IMGUI_CHECKVERSION();
ImGui::CreateContext();
//风格
ImGui::StyleColorsDark();	
//设置字体,用于显示中文
ImFontConfig Config;
Config.MergeMode = true;
ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontDefault();
io.Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\simsun.ttc", 
                             16.0f, 
                             &Config, 
                             io.Fonts->GetGlyphRangesChineseSimplifiedCommon());
//初始化imgui引擎 (当前窗口句柄,D3D设备,D3D设备上下文)
ImGui_ImplDX11_Init(m_Wnd, m_pd3dDevice, m_pd3dDeviceContext);
ImGui_ImplDX11_CreateDeviceObjects();

2、主绘制线程内调用(imgui 渲染过程)

ImGui_ImplDX11_NewFrame();
/*用户自定义区域开始*/
BeginDraw();	
//绘制UI
DrawMenu();
//绘制图形
DrawOther();
EndDraw();
/*用户自定义区域结束*/
ImGui::Render();
m_pd3dDeviceContext->OMSetRenderTargets(1, &m_mainRenderTargetView, NULL);
ImGui_ImplDX11_RenderDrawLists(ImGui::GetDrawData());

这里给出用户自定义区域的代码,仅供参考

VOID BeginDraw()
{
	//UI窗体背景色
	ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0.0F, 0.0F, 0.0F, 1.0F));
	//UI窗体创建
	ImGui::Begin(" ", 
                 reinterpret_cast<bool*>(true), 
                 ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoInputs);
	//UI窗体位置,如果需要拖动不要设置
	ImGui::SetWindowPos(ImVec2(0, 0), ImGuiCond_Always);
	//UI窗体大小
	ImGui::SetWindowSize(ImVec2(ImGui::GetIO().DisplaySize.x, 
                                ImGui::GetIO().DisplaySize.y), 
                         ImGuiCond_Always);
	//UI窗体风格
	ImGuiStyle& style = ImGui::GetStyle();
	//窗体边框圆角
	style.WindowRounding = 0.0f;
}

VOID EndDraw()
{
	ImGuiWindow* window =  ImGui::GetCurrentWindow();
	window->DrawList->PushClipRectFullScreen();
	ImGui::End();
	ImGui::PopStyleColor();
}

void DrawMenu(){
	//UI窗体尺寸
	ImGui::SetNextWindowSize(ImVec2(200,500));
	ImGuiWindowFlags window_flags = 0;
	window_flags |= ImGuiWindowFlags_NoCollapse;
	window_flags |= ImGuiWindowFlags_NoResize;
	//临时用于保存控件值
	bool bTestCheckBox = false;
	if (ImGui::Begin("  ", reinterpret_cast<bool*>(true), window_flags)){
		if (ImGui::CollapsingHeader(u8"Root 根")) {
			if (ImGui::TreeNode(u8"分类>>")) {
				ImGui::Checkbox(u8"测试1", &bTestCheckBox); ImGui::SameLine();
				ImGui::Checkbox(u8"AAAA", &bTestCheckBox); 
				ImGui::TreePop();
			}

			if (ImGui::TreeNode(u8"About2>>")) {
				ImGui::Checkbox(u8"BBBB", &bTestCheckBox); ImGui::SameLine();
				ImGui::Checkbox(u8"BBBB", &bTestCheckBox); 
				ImGui::TreePop();
			}
		}
		ImGui::End();
	}
}

void DrawOther() {
    //颜色
	ImVec4 colf = ImVec4(1.0f, 1.0f, 0.4f, 1.0f);
	const ImU32 col = ImColor(colf);

	//绘制图形
	ImDrawList* draw_list = ImGui::GetWindowDrawList();
	//画线
	draw_list->AddLine(ImVec2(0, 20), ImVec2(500, 500), col, 3.0f);
	//画文字
	draw_list->AddText(ImVec2(30, 500), col, string_to_utf8("显示中文").c_str());
	//画矩形
	draw_list->AddRect(ImVec2(50, 100), ImVec2(150, 230), col, 0.0f, 0, 3.0f);
}

3、窗口消息回调内(用于响应UI控件)

if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) {
		return 0;
	}

4、释放代码

//释放引擎
ImGui_ImplDX11_Shutdown();
ImGui::DestroyContext();

以上为初步使用框架,后续深入使用另外再发博文了。

PS. 打包库 下载地址: