Glfw: 在 Windows 上调用两次帧/窗口大小回调

创建于 2019-12-13  ·  4评论  ·  资料来源: glfw/glfw

我注意到在 GLFW3 的 Windows 端口中,无论当前窗口大小如何,都会调用_glfwInputFramebufferSize_glfwInputWindowSize 。 此外,窗口宽度/高度不存储在win32结构中。 这可能会导致重复调用回调。

我建议更改win32_window.c代码如下。

        case WM_SIZE:
        {
            const GLFWbool iconified = wParam == SIZE_MINIMIZED;
            const GLFWbool maximized = wParam == SIZE_MAXIMIZED ||
                                       (window->win32.maximized &&
                                        wParam != SIZE_RESTORED);
            const int width = LOWORD(lParam);
            const int height = HIWORD(lParam);

            if (_glfw.win32.disabledCursorWindow == window)
                updateClipRect(window);

            if (window->win32.iconified != iconified)
                _glfwInputWindowIconify(window, iconified);

            if (window->win32.maximized != maximized)
                _glfwInputWindowMaximize(window, maximized);

            if (window->win32.width != width || window->win32.height != height) {
                _glfwInputFramebufferSize(window, width, height);
                _glfwInputWindowSize(window, width, height);
            }

            if (window->monitor && window->win32.iconified != iconified)
            {
                if (iconified)
                    releaseMonitor(window);
                else
                {
                    acquireMonitor(window);
                    fitToMonitor(window);
                }
            }

            window->win32.iconified = iconified;
            window->win32.maximized = maximized;
            window->win32.width = width;
            window->win32.height = height;
            return 0;
        }
Windows enhancement

最有用的评论

好的,我现在看到 X11 从 a7ff236 和 Cocoa 开始处理这个问题 - 从 1fe319d (#1085) 开始。
我认为 Windows 可以使用相同的技巧。

您是否有任何情况可以在大小未更改时调用此事件?

所有4条评论

这可能会破坏代码,有人可能会依赖这种行为。

这可能会破坏代码,有人可能会依赖这种行为。

您可能是对的,但是由于window结构具有宽度/高度字段并且它们没有在 Windows 移植中初始化,我怀疑这只是一个(次要的)疏忽。

好的,我现在看到 X11 从 a7ff236 和 Cocoa 开始处理这个问题 - 从 1fe319d (#1085) 开始。
我认为 Windows 可以使用相同的技巧。

您是否有任何情况可以在大小未更改时调用此事件?

是的。 事实上,我在我的一个项目中遇到了这个问题,我最初打开一个 1x1 隐藏窗口,然后将其调整为适当的(计算的)大小,最后显示它。

通过这一系列操作,在设置窗口大小后,回调将被调用两次(第一次在调整大小后,第二次在显示时)。

此页面是否有帮助?
0 / 5 - 0 等级