Reputation: 1956
I am using ImGui with the aim of creating a Windows Application.
One thing I have noticed and is troubling me a lot is when resizing the Window, it doesn't update the contents (buffers?) correctly, see the attached image:
The black area was captured whilst I was resizing the window to make it larger.
Here is the exact code I am using that produced the image above:
#include "imgui.h"
#include "imgui_impl_glfw.h"
#include "imgui_impl_opengl3.h"
#include <stdio.h>
#define GL_SILENCE_DEPRECATION
#if defined(IMGUI_IMPL_OPENGL_ES2)
#include <GLES2/gl2.h>
#endif
#include <GLFW/glfw3.h>
#if defined(_MSC_VER) && (_MSC_VER >= 1900) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS)
#pragma comment(lib, "legacy_stdio_definitions")
#endif
GLFWwindow* window = nullptr;
static void glfw_error_callback(int error, const char* description)
{
fprintf(stderr, "GLFW Error %d: %s\n", error, description);
}
void updateBuffers()
{
ImGui::Render();
int display_w, display_h;
glfwGetFramebufferSize(window, &display_w, &display_h);
glViewport(0, 0, display_w, display_h);
glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
glfwSwapBuffers(window);
}
void frame_buffer_size_callback(GLFWwindow* window, int width, int height)
{
}
int main(int, char**)
{
glfwSetErrorCallback(glfw_error_callback);
if (!glfwInit())
return 1;
const char* glsl_version = "#version 130";
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+OpenGL3 example", nullptr, nullptr);
if (window == nullptr)
return 1;
glfwMakeContextCurrent(window);
glfwSetFramebufferSizeCallback(window, frame_buffer_size_callback);
glfwSwapInterval(1);
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
ImGui::StyleColorsDark();
ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL3_Init(glsl_version);
while (!glfwWindowShouldClose(window))
{
glfwPollEvents();
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
ImGui::Begin("Window");
ImGui::Text("Hello World!");
ImGui::End();
updateBuffers();
}
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
In the above code I have included the framebuffer_size_callback()
in order to capture the window during its resize event, but I am unsure what other changes to make. I have come close where I was able to get the Window to resize more nicely simply by calling my draw logic inside the frame_buffer_size_callback
:
void frame_buffer_size_callback(GLFWwindow* window, int width, int height)
{
updateBuffers();
}
but the ImGui widgets were getting cut off (this occurs when the widget is slightly offscreen and resizing the window bigger):
How can I get the Window to resize nicely keeping the ImGui and OpenGL contents drawn correctly too?
Upvotes: 1
Views: 569