1

我有一些图表,当窗口也调整大小时,我需要同时调整大小,但是到目前为止,它在调整大小时完美地改变了轴大小,但是当我放开调整大小(停止单击窗口的角落)时,应用程序的图形限制恢复到完全不正确的东西。

这是显示问题的 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。当您尝试在一个像素左右缩小窗口后调整窗口大小(缩短宽度)时,绘图标签显示-10and 80,这正是我想要的。只有在调整窗口大小而不放手时才会出现这种正确的大小。只有当您放开窗口时,它才会恢复到错误的一侧。我不知道我的代码哪里出错了。

ImPlot::FitThisFrame()双击绘图时返回真,但是奇怪的是,如果winChangedSize为真,输入该if语句,绘图正确拟合,但是当我双击输入它时它不适合绘图正确?

4

0 回答 0