上两节课的例子中,我们每次用vs打开项目,都显示了两个窗口,一个是命令行,一个是主窗口。但是我们希望只显示主窗口。
去掉黑色命令行

像上面这样,有两个窗口,一个命令行,一个主窗口,如何关闭命令行。
首先在代码的代码的顶部,头文件的上方,增加
#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")Code language: C++ (cpp)

如果不增加,后面会报错的。增加后,右键解决方案窗口中的项目名,然后选择属性


然后,在 屬性 (Configuration Properties) -> 连接器 (Linker) -> 系統 (System)
子系統 (SubSystem) 中设置为Windows
然后,再次运行,你会发现,黑色命令行窗口终于不见了。更加像我们的GUI程序了。

但是现在我们的控件都集中在中间这个Control Panel中,如何显示到窗口中呢。
设置控件占满主窗口
我们需要在如下代码
ImGui::Begin("Control Panel");Code language: PHP (php)
改为如下
// 如下是一些主要设置
// 强制子窗口铺满整个GLFW窗口
// 1. 设置窗口位置与尺寸(每一帧都和外层GLFW窗口同步)
ImGui::SetNextWindowPos(ImVec2(0, 0));
ImGui::SetNextWindowSize(io.DisplaySize);
// 2. 移除各类装饰:边框、拖动、缩放、保存窗口配置
ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDecoration
| ImGuiWindowFlags_NoMove
| ImGuiWindowFlags_NoResize
| ImGuiWindowFlags_NoSavedSettings;
// 3. 取消窗口圆角与边框线条,贴合窗口边缘
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
// 4. 传入标识创建窗口(窗口标题会被隐藏)
ImGui::Begin("Control Panel", nullptr, window_flags);Code language: C++ (cpp)
主要是设置窗口占满GLFW窗口,还有一些其他的设置,目的就是让我们的imgui窗口铺满整个GLFW窗口。
然后在
ImGui::End();Code language: CSS (css)
的下方 增加如下代码
ImGui::PopStyleVar(2);Code language: CSS (css)
把临时修改的界面样式压入栈中,临时覆盖全局样式
上面是PushStyleVar了两个样式
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);Code language: CSS (css)
这里则是出栈,相当于恢复。
完整代码如下:
#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")
#include <GLFW/glfw3.h>
#include "imgui.h"
#include "backends/imgui_impl_glfw.h"
#include "backends/imgui_impl_opengl3.h"
#include <cstdio>
int main()
{
// Initialize GLFW
if (!glfwInit())
{
printf("GLFW initialization failed\n");
return -1;
}
// OpenGL 3.3
const char* glsl_version = "#version 330";
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// Create window
GLFWwindow* window = glfwCreateWindow(1000, 600, "ImGui Minimal Demo (VS2022)", nullptr, nullptr);
if (!window)
{
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
glfwSwapInterval(1); // VSync enable
// Initialize ImGui
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
ImGui::StyleColorsDark();
// Bind GLFW + OpenGL3 backend
ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL3_Init(glsl_version);
// UI state variables
float slider_value = 0.5f;
int click_count = 0;
bool show_full_demo = false;
// Main render loop
while (!glfwWindowShouldClose(window))
{
glfwPollEvents();
// Start new ImGui frame
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
// 如下是一些主要设置
// 强制子窗口铺满整个GLFW窗口
// 1. 设置窗口位置与尺寸(每一帧都和外层GLFW窗口同步)
ImGui::SetNextWindowPos(ImVec2(0, 0));
ImGui::SetNextWindowSize(io.DisplaySize);
// 2. 移除各类装饰:边框、拖动、缩放、保存窗口配置
ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDecoration
| ImGuiWindowFlags_NoMove
| ImGuiWindowFlags_NoResize
| ImGuiWindowFlags_NoSavedSettings;
// 3. 取消窗口圆角与边框线条,贴合窗口边缘
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
// 4. 传入标识创建窗口(窗口标题会被隐藏)
ImGui::Begin("Control Panel", nullptr, window_flags);
ImGui::Text("Hello ImGui + VS2022");
ImGui::SliderFloat("Slider Value", &slider_value, 0.f, 1.f);
if (ImGui::Button("Click to Count"))
click_count++;
ImGui::SameLine();
ImGui::Text("Click Count: %d", click_count);
ImGui::Checkbox("Show Full ImGui Demo Window", &show_full_demo);
ImGui::End();
// 5. 出栈前面的两个入栈PushStyleVar 恢复原来的配置,避免重复
ImGui::PopStyleVar(2);
// 【修改部分結束】
if (show_full_demo)
ImGui::ShowDemoWindow(&show_full_demo);
// Render ImGui draw data
ImGui::Render();
int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);
glClearColor(0.12f, 0.12f, 0.12f, 1.f);
glClear(GL_COLOR_BUFFER_BIT);
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
glfwSwapBuffers(window);
}
// Cleanup resources
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
Code language: PHP (php)
再次运行,变成下面这个

很接近我们的平常的GUI窗体了。
Previous: 上一篇Imgui例子逐行解析
Next: 使用Imgui实现一个简单加法计算器