de)", "", (dockspace_flags & ImGuiDockNodeFlags_NoDockingInCentralNode) != 0)) {ockspace_flags ^= ImGuiDockNodeFlags_NoDockingInCentralNode; }
if (ImGui::MenuItem("标志:自动隐藏选项卡栏(Flag: AutoHideTabBar)", "", (dockspace_flags & ImGuiDockNodeFlags_AutoHideTabBar) != 0)) { dockspace_flags= ImGuiDockNodeFlags_AutoHideTabBar; }
if (ImGui::MenuItem("标志:中心节点筛选器(Flag: PassthruCentralNode)", "", (dockspace_flags & ImGuiDockNodeFlags_PassthruCentralNode) != 0,pt_fullscreen)) { dockspace_flags ^= ImGuiDockNodeFlags_PassthruCentralNode; }
ImGui::Separator();
//不关闭菜单
/* if (ImGui::MenuItem("Close", NULL, false, p_open != NULL))
*p_open = false;*/
ImGui::EndMenu();
}
//增加主题切换
if (ImGui::BeginMenu("主题(Other)"))
{
if (ImGui::MenuItem("暗黑(Dark)")) { ImGui::StyleColorsDark(); }
if (ImGui::MenuItem("明亮(Light)")) { ImGui::StyleColorsLight(); }
if (ImGui::MenuItem("经典(Classic)")) { ImGui::StyleColorsClassic(); }
ImGui::EndMenu();
}
//HelpMarker 不需要
ImGui::EndMenuBar();
}
/**添加自己的窗口**/
ShowTreeView();
ShowMainView();
ImGui::End();
}
创建页面
先在Application.h文件中定义需要用到的一些函数:
#pragma once
#include "imgui.h"
namespace App
{
//主UI函数,放停靠空间的代码
void RenderUI();
//隐藏窗口的TabBar
void HideTabBar();
//导航页面
void ShowTreeView();
//内容页面
void ShowMainView();
/*
* 内容页面0-5
*/
void ShowPageView0();
void ShowPageView1();
void ShowPageView2();
void ShowPageView3();
void ShowPageView4();
}
隐藏窗口标签栏
正常情况下窗口创建后会有一个标签栏,这个很影响界面外观需要去掉,参考github上面的issues:以编程方式完成停靠和隐藏选项卡栏。
没次创建窗口时,需要在ImGui::Begin前面调用,代码如下:
#include <imgui_internal.h>
void HideTabBar()
{
ImGuiWindowClass window_class;
window_class.DockNodeFlagsOverrideSet = ImGuiDockNodeFlags_NoTabBar;
ImGui::SetNextWindowClass(&window_class);
}
创建导航页面
导航页面本质上就是一个树控件,使用ImGui自带的控件样式即可,代码也是从demo里面拷贝到Application.cpp的,如下所示:
//一级索引
int FirstIdx = 0;
//二级索引
int SecondIdx = 0;
//导航页面
void ShowTreeView()
{
HideTabBar();
ImGui::Begin("导航窗口");
if (ImGui::TreeNode("功能选项"))
{
for (int i = 0; i < 5; i++)
{
if (i == 0)
ImGui::SetNextItemOpen(true, ImGuiCond_Once);
if (ImGui::TreeNode((void*)(intptr_t)i, "功能 %d", i))
{
ImGui::Text("图标");
ImGui::SameLine();
if (ImGui::SmallButton("按钮1")) { FirstIdx = i; SecondIdx = 0; }
ImGui::Text("图标");
ImGui::SameLine();
if (ImGui::SmallButton("按钮2")) { FirstIdx = i; SecondIdx = 1; }
ImGui::TreePop();
}
}
ImGui::TreePop();
}
if (ImGui::TreeNode("其它选项"))
{
ImGui::Text("图标");
ImGui::SameLine();
if (ImGui::SmallButton("按钮")) { }
ImGui::TreePop();
}
ImGui::End();
}
注:上面的“图标”使用图标字体就可以显示真正的图标,图标字体的加载留到后续的文章再说。
创建内容页面
内容页面根据导航的索引确定需要渲染的内容,为了避免页面关于单调,里面加了一个表格控件和选项卡控件的示例,代码如下:
//内容页面
void ShowMainView()
{
HideTabBar();
// 清除之前的内容
ImGui::Begin("页面窗口");
switch (FirstIdx)
{
case 0:
ShowPageView0();
break;
case 1:
ShowPageView1();
break;
case 2:
ShowPageView2();
break;
case 3:
ShowPageView3();
break;
case 4:
ShowPageView4();
break;
default:
break;
}
ImGui::End();
}
void ShowPageView0()
{
ImGui::Text("功能%d -> 按钮%d -> 页面0&q