设为首页 加入收藏

TOP

使用C++界面框架ImGUI开发一个简单程序(三)
2023-08-26 21:10:34 】 浏览:168
Tags:使用 ImGUI 简单程
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
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇9.1 C++ STL 排序、算数与集合 下一篇c++ 存储区

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目