我有一些图表,当窗口也调整大小时,我需要同时调整大小,但是到目前为止,它在调整大小时完美地改变了轴大小,但是当我放开调整大小(停止单击窗口的角落)时,应用程序的图形限制恢复到完全不正确的东西。
这是显示问题的 MRE:
#include <GL/glew.h>
#ifndef GLFW_INCLUDE_NONE
#define GLFW_INCLUDE_NONE // GLFW including OpenGL headers causes ambiguity or multiple definition errors.
#endif // GLFW_INCLUDE_NONE
#include <GLFW/glfw3.h>
#include "ImGui/imgui.h"
#include "ImGui/implot.h"
#include "ImGui/implot_internal.h"
#include "ImGui/imgui_impl_glfw.h"
#include "ImGui/imgui_impl_opengl3.h"
#include <iostream>
static bool changedWinSize = false;
static int winWidth = 1280;
static int winHeight = 720;
static void MainLoop(GLFWwindow* window)
{
// Start the Dear ImGui frame
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
ImGui::SetNextWindowSize({ (float)winWidth, (float)winHeight });
ImGui::SetNextWindowPos({ 0, 0 });
ImGui::Begin("Window", (bool*)0, ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize);
static bool fitPlot = false;
if (fitPlot) {
fitPlot = false;
ImPlot::SetNextPlotLimits(-10, 80, -3, 20, ImGuiCond_Always);
}
ImPlotStyle& style = ImPlot::GetStyle();
style.PlotDefaultSize.y = ImGui::GetWindowSize().y / 2 - 45 + (style.PlotDefaultSize.y = ImGui::GetWindowSize().y / 3 - 30) / 2 - 60;
style.PlotDefaultSize.x = ImGui::GetWindowSize().x - 150;
if (ImPlot::BeginPlot("Sim", "Range (m)", "Height (m)", { 0, 0 }, ImPlotFlags_NoLegend | ImPlotFlags_Equal)) {
if (ImPlot::BeginItem("Sim"))
{
if (ImPlot::FitThisFrame() || changedWinSize) {
fitPlot = true;
}
}
ImPlot::EndPlot();
}
ImGui::End();
changedWinSize = false;
// Rendering
ImGui::Render();
glClearColor(0.45f, 0.55f, 0.60f, 1.00f);
glClear(GL_COLOR_BUFFER_BIT);
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
glfwSwapBuffers(window);
}
static void window_size_callback(GLFWwindow* window, int width, int height)
{
changedWinSize = true;
winWidth = width;
winHeight = height;
MainLoop(window);
}
int main(int argc, char* argv[])
{
const char* glslVersion = "#version 460";
glfwInit();
// Create window with graphics context
GLFWwindow* window = glfwCreateWindow(1280, 720, "Program", NULL, NULL);
glfwMakeContextCurrent(window);
glfwSwapInterval(0); // vsync
//Initialize GLEW + ImGui
glewInit();
// Setup Dear ImGui context
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImPlot::CreateContext();
// Setup Dear ImGui style
ImGui::StyleColorsLight();
// Setup Platform/Renderer backends
ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL3_Init(glslVersion);
glfwSetWindowSizeCallback(window, window_size_callback);
while (!glfwWindowShouldClose(window))
{
//Events
glfwPollEvents();
MainLoop(window);
}
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImPlot::DestroyContext();
ImGui::DestroyContext();
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
在此示例中,绘图 x 轴标签从 开始-5
并转到75
。当您尝试在一个像素左右缩小窗口后调整窗口大小(缩短宽度)时,绘图标签显示-10
and 80
,这正是我想要的。只有在调整窗口大小而不放手时才会出现这种正确的大小。只有当您放开窗口时,它才会恢复到错误的一侧。我不知道我的代码哪里出错了。
ImPlot::FitThisFrame()
双击绘图时返回真,但是奇怪的是,如果winChangedSize
为真,输入该if
语句,绘图正确拟合,但是当我双击输入它时它不适合绘图正确?