做一个好看的窗口
imGui有个docking分支,支持docking和多窗口功能。本节只有几行代码修改,读者可以直接参考commit修改,不逐行解释了.
docking
docking功能指的是拖动窗口,四边会出现一组响应区域,鼠标拖动子窗口到对应热区,会对齐到该边上。
多窗口
多窗口指的是整个应用可以有多个独立的窗口,即子窗口可以从主窗口中拖出去.
docking&多窗口实现
切换分支
docking和多窗口需要特定的imGui分支,进入Sandbox/Hazel/vendor/imgui目录,切花到docking分支
git checkout docking
如果你不能科学上网,可以手动下载imGui的 docking分支代码
修改imGui初始化的代码
c++
void ImGuiLayer::OnAttach() {
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGui::StyleColorsDark();
ImGuiIO& io = ImGui::GetIO(); (void)io;
io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors;
io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos;
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; // Enable Docking
io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
最重要的就是这两行,打开docking和viewports
c++
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; // Enable Docking
io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
上一节中的代码实现的有点问题ImGuiIO& io = ImGui::GetIO(); io变量的声明少了个&,效果就不对,c++语言真是容易出错。
如果第一次运行出来的效果有问题,考虑删除项目运行目录下的"imgui.ini 文件",该文件会实时记录程序的数据
打开dockspace
程序运行起来,从examples中打开Dockspace,使docking和多窗口生效
本节对应的代码还做了多处调整,使整体结构更为合理。读者可参考commit对比。
完整代码参考 docking&viewports