拓冰建站拓冰建站
首页 / 资讯中心 / 正文

GLFW 怎么设置窗口的最小与最大尺寸限制用户缩放?

GLFW 怎么设置窗口的最小与最大尺寸限制用户缩放【免费下载链接】glfwA multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input项目地址: https://gitcode.com/GitHub_Trending/gl/glfw在 GLFW 应用里用户拖动窗口边缘可以随意缩放窗口有时会把窗口拖到太小导致界面不可用或拖得过大超出你的设计范围。GLFW 3.2 及以上版本提供了glfwSetWindowSizeLimits可以对窗口化windowed mode窗口内容区域的最小和最大尺寸做强制限制把用户的缩放行为约束在你设定的范围内。本文给出完整的设置方法、立即生效的行为、验证方式和几个常见的平台限制。环境前提在动手之前确认以下条件均来自项目文档GLFW 版本为 3.2 及以上。glfwSetWindowSizeLimits是 3.2 新增的接口见 glfw3.h 中该函数的since Added in version 3.2说明。目标窗口是窗口化模式窗口并且是可由用户缩放的。如果窗口不可用户缩放调用该函数不会有任何效果GLFW 文档中GLFW_RESIZABLE提示的默认值是GLFW_TRUE即默认创建出的窗口化窗口就是可缩放的见 docs/window.md 的 Supported and default values 表格。需要用 CMake 构建 GLFW 或链接已构建好的 GLFW 库。标准流程为cmake -S . -B build cmake --build build其中-S . -B build是 docs/compile.md 中推荐的 out-of-tree 构建模式源目录为.构建产物放在build目录。如果你从其他位置构建 GLFW把.换成 GLFW 源码目录路径即可。设置最小与最大尺寸在glfwInit()成功并创建窗口之后调用glfwSetWindowSizeLimits传入内容区域的最小宽、最小高、最大宽、最大高单位是屏幕坐标不是像素GLFWwindow* window glfwCreateWindow(640, 480, My Title, NULL, NULL); if (!window) { glfwTerminate(); return -1; } // 限制内容区域在 200x200 到 400x400 之间 glfwSetWindowSizeLimits(window, 200, 200, 400, 400);window是glfwCreateWindow返回的句柄创建失败时会返回NULL必须先检查再使用。参数约束来自 glfw3.h 中的接口注释最大尺寸必须大于或等于最小尺寸四个值都必须大于或等于零否则会产生GLFW_INVALID_VALUE错误该函数还可能在库未初始化时产生GLFW_NOT_INITIALIZED或在平台层出错时产生GLFW_PLATFORM_ERROR。如果只想限制最小值或只想限制最大值把另一对参数设为GLFW_DONT_CARE// 只限制最小尺寸 640x480不限制最大尺寸 glfwSetWindowSizeLimits(window, 640, 480, GLFW_DONT_CARE, GLFW_DONT_CARE);想彻底移除已设置的限制时把四个参数全部设为GLFW_DONT_CARE即可。确认限制是否生效文档说明了限制生效的时机可以据此验证对窗口化窗口限制立即生效而且可能触发一次窗口重新调整大小例如当前窗口比最小值还小时。设置之后用glfwGetWindowSize读取当前内容区域尺寸确认它落在你设定的区间内int width, height; glfwGetWindowSize(window, width, height);全屏窗口例外如果窗口当前处于全屏尺寸限制要等它被切回窗口化之后才生效。切回窗口化用glfwSetWindowMonitor(window, NULL, xpos, ypos, width, height, 0)见 docs/window.md 的 Window monitor 一节。Wayland 平台例外在 Wayland 上尺寸限制要等窗口实际被调整大小之后由用户或合成器触发才会应用这一点来自glfw3.h中该函数的remark wayland说明。参数错误检查如果怀疑传入了非法值比如最大值小于最小值可以用glfwGetError检查是否返回GLFW_INVALID_VALUE。仓库自带的测试程序 tests/window.c 提供了带 Minimum Size / Maximum Size 输入框和复选框的界面内部就是按上述方式调用glfwSetWindowSizeLimits未勾选时对应项传GLFW_DONT_CARE可以编译运行它来直观观察限制效果glfwSetWindowSizeLimits(window, limit_min_size ? min_width : GLFW_DONT_CARE, limit_min_size ? min_height : GLFW_DONT_CARE, limit_max_size ? max_width : GLFW_DONT_CARE, limit_max_size ? max_height : GLFW_DONT_CARE);该函数只能在主线程调用接口注释中的thread_safety说明。容易踩到的限制以下行为都直接来自 docs/window.md 和 glfw3.h 的文档说明不可缩放的窗口上调用无效如果窗口设为了不可用户缩放GLFW_RESIZABLE为GLFW_FALSEglfwSetWindowSizeLimits什么都不做。程序自己仍然可以用glfwSetWindowSize改变窗口大小。GLFW_RESIZABLE对全屏和无装饰窗口被忽略无装饰undecorated窗口本来就无法被用户缩放GLFW_RESIZABLE提示对全屏和 undecorated 窗口不起作用。尺寸限制与宽高比冲突时结果未定义如果同时设置了尺寸限制和glfwSetWindowAspectRatio的宽高比两者冲突时结果是未定义的两个限制只能保证满足其中一个时同时使用。GLFW_RESIZABLE可以创建前设置提示或创建后设置属性创建后用glfwSetWindowAttrib(window, GLFW_RESIZABLE, GLFW_FALSE)可以直接禁止用户缩放这比把最小值和最大值设成一样更彻底。如果需求是锁定比例而不是锁定上下界用glfwSetWindowAspectRatio(window, 16, 9)设置宽高比分子对应宽、分母对应高两项都传GLFW_DONT_CARE则解除比例限制想保持窗口当前比例可以先用glfwGetWindowSize取当前尺寸再作为比例传入。完整可运行的主流程骨架#include GLFW/glfw3.h #include stdio.h int main(void) { if (!glfwInit()) return -1; GLFWwindow* window glfwCreateWindow(640, 480, My Title, NULL, NULL); if (!window) { glfwTerminate(); return -1; } // 内容区域限制在 200x200 400x400用户拖拽缩放不会超出这个范围 glfwSetWindowSizeLimits(window, 200, 200, 400, 400); while (!glfwWindowShouldClose(window)) { glfwSwapBuffers(window); glfwPollEvents(); } glfwDestroyWindow(window); glfwTerminate(); return 0; }运行后让用户拖拽窗口边缘窗口会停在最小 200x200 与最大 400x400 之间不会再被拖出这个范围用glfwGetWindowSize打印出的内容区域尺寸也应始终落在该区间内注意内容区域尺寸是屏幕坐标若窗口尺寸变化后 OpenGL 视口要更新应使用glfwGetFramebufferSize返回的像素值传给glViewport见 docs/window.md 的 Window size 一节末尾注意事项。进一步的窗口属性调整标题、位置、图标、最大化、透明等可参考 docs/window.md 各小节构建与平台相关的选项如-D GLFW_BUILD_X110见 docs/compile.md。【免费下载链接】glfwA multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input项目地址: https://gitcode.com/GitHub_Trending/gl/glfw创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门