设为首页 加入收藏

TOP

ImGui界面优化:使用图标字体、隐藏主窗口标题栏(二)
2023-08-26 21:10:31 】 浏览:132
Tags:ImGui
否退出 bool GetMainShouldClose(); //主UI函数,放停靠空间的代码 void RenderUI(); //...其它代码 }

Application.cpp还需要改动RenderUI函数:

bool GetMainShouldClose()
{
    return !MainOpen;
}
void RenderUI()
{
    bool* p_open = &MainOpen;
    static bool opt_fullscreen = false;
    //...其它代码
    ImGui::Begin("演示程序", p_open, window_flags);
    //...其它代码
}

然后再main函数的 App::RenderUI() 后面判断是否退出程序:

//...
App::RenderUI();
if (App::GetMainShouldClose())
{
    //关闭窗口,也可以做一些退出确认操作
    glfwSetWindowShouldClose(window, GLFW_TRUE);
}
//...

改进HideTabBar

原本的HideTabBar有问题,如果有新窗口停靠到中心位置会导致新窗口被覆盖隐藏,只能通过重置布局恢复。所以标题栏最好不隐藏,只隐藏前面的三角符号,这样也能允许用户自己拖动窗口。
优化代码如下:

void HideTabBar()
{
    ImGuiWindowClass window_class;
    window_class.DockNodeFlagsOverrideSet = ImGuiDockNodeFlags_NoWindowMenuButton;
    //window_class.DockNodeFlagsOverrideSet = ImGuiDockNodeFlags_NoTabBar;
    ImGui::SetNextWindowClass(&window_class);
}

窗口最大化

窗口最大化需要知道屏幕的尺寸,这一步涉及到具体的后端代码,需要先在main文件中获取屏幕尺寸。

在main函数前实现GetScreenSize函数,代码如下:

static void GetScreenSize(int &width, int &height)
{
    //屏幕数量
    int monitorCount;
    GLFWmonitor** pMonitor = glfwGetMonitors(&monitorCount);
    int screen_x, screen_y;
    for (int i = 0; i < monitorCount; i++)
    {
        const GLFWvidmode* mode = glfwGetVideoMode(pMonitor[i]);
        //屏幕大小
        screen_x = mode->width;
        screen_y = mode->height;
    }
    width = screen_x;
    height = screen_y;
}

然后在main函数中将主窗口的大小设置为屏幕大小一致,代码如下:

 //获取屏幕尺寸
 int width, height;
 GetScreenSize(width, height);
 glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
 // Create window with graphics context
 GLFWwindow* window = glfwCreateWindow(width, height, "演示程序", nullptr, nullptr);

在App::RenderUI函数中的停靠空间渲染前设置空间大小,并在主题切换代码后加上大小切换的代码,代码如下:

//...其它代码

//设置最大化、最小化
static bool IsMaximized = true;
static bool LastMaximized = true;
ImVec2 screenSize = ImGui::GetIO().DisplaySize;
if (IsMaximized)
{
    if (LastMaximized != IsMaximized)
    {
        LastMaximized = IsMaximized;
    }
    ImGui::SetNextWindowPos(ImVec2(0, 0));
    ImGui::SetNextWindowSize(screenSize);
    //隐藏标题栏
    //window_flags |= ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize;
}
else
{
    if (LastMaximized != IsMaximized)
    {
        LastMaximized = IsMaximized;
        ImGui::SetNextWindowPos(ImVec2(screenSize[0]*0.1, screenSize[1] * 0.1));
        ImGui::SetNextWindowSize(ImVec2(screenSize[0] * 0.8, screenSize[1] * 0.8));
    }
}

ImGui::Begin(ICON_FA_ANCHOR "演示程序", p_open, window_flags);

//...其它代码

//增加主题切换
if (ImGui::BeginMenu(ICON_FA_THERMOMETER "主题(Other)"))
{
    if (ImGui::MenuItem("暗黑(Dark)")) { ImGui::StyleColorsDark(); }
    if (ImGui::MenuItem("明亮(Light)")) { ImGui::StyleColorsLight(); }
    if (ImGui::MenuItem("经典(Classic)")) { ImGui::StyleColorsClassic(); }

    ImGui::EndMenu();
}
//增加窗口切换
if (ImGui::BeginMenu(ICON_FA_TV "窗口(Windows)"))
{
    if (ImGui::MenuItem(ICON_FA_WINDOW_MAXIMIZE "最大(Max)")) { IsMaximized = true; }
    if (ImGui::MenuItem(ICON_FA_WINDOW_RESTORE "默认(Default)")) { IsMaximized = false; }

    ImGui::EndMenu();
}

总结

文中的主要的优化措施就是引入字体图标隐藏主窗口,结合前一篇的文章,ImGui基本的功能都已经涉及到了。

文中还有一些遗留问题,比如:

  • 全屏无法覆盖系统的任务栏
  • 标题栏没有自定义
  • 内存加载字体报错
  • 任务栏窗口图标自定义

目前的内容对于简单的项目来说基本够用,后面应该不会再继续更新ImGui相关的内容了,等项目中遇到问题再说。

项目源码链接:提取码: tv7n

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇5.10 汇编语言:汇编过程与结构 下一篇【Qt6】工具提示以及调色板设置

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目