LWJGL/GLFW:通过代码实现窗口最大化(非全屏)


lwjgl/glfw:通过代码实现窗口最大化(非全屏)

本教程将指导开发者如何在LWJGL/GLFW应用中通过代码实现窗口的最大化操作,而非进入全屏模式。文章详细介绍了使用`glfwMaximizeWindow`方法在运行时最大化窗口,以及通过设置`GLFW_MAXIMIZED`窗口提示在窗口创建时即实现最大化的两种策略,确保窗口可见任务栏和标题栏,提供清晰的代码示例。

在开发基于LWJGL和GLFW的桌面应用程序时,经常需要对窗口进行灵活的控制。其中一个常见的需求是程序化地最大化窗口,使其占据屏幕可用空间,但同时保留操作系统的任务栏和窗口边框(即非全屏模式)。传统的Display.setDisplayMode(new DisplayMode(width, height))方法虽然可以改变窗口尺寸,但要精确计算出在保留任务栏和标题栏情况下的最大化尺寸则相对复杂。幸运的是,GLFW提供了更直接、更优雅的解决方案。

1. 运行时最大化窗口

GLFW库提供了一个专门的函数glfwMaximizeWindow来实现窗口的运行时最大化。这个方法非常简单直观,只需要传入目标窗口的句柄即可。

1.1 glfwMaximizeWindow 方法介绍

glfwMaximizeWindow函数定义在org.lwjgl.glfw.GLFW类中,其签名如下:

public static void glfwMaximizeWindow(long window)

其中,window参数是您希望最大化的GLFW窗口的句柄。这个句柄通常在调用glfwCreateWindow创建窗口时返回。

1.2 使用示例

以下是一个简单的LWJGL/GLFW应用程序骨架,演示如何在窗口创建后通过代码最大化它:

import org.lwjgl.glfw.*;
import org.lwjgl.opengl.*;

import static org.lwjgl.glfw.Callbacks.*;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.system.MemoryUtil.*;

public class WindowMaximizationExample {

    private long window; // 窗口句柄

    public void run() {
        init();
        loop();

        // 释放窗口回调和销毁窗口
        glfwFreeCallbacks(window);
        glfwDestroyWindow(window);

        // 终止GLFW并释放错误回调
        glfwTerminate();
        glfwSetErrorCallback(null).free();
    }

    private void init() {
        // 设置错误回调。默认情况下,GLFW会将错误打印到System.err。
        GLFWErrorCallback.createPrint(System.err).set();

        // 初始化GLFW。如果失败,则抛出异常。
        if (!glfwInit()) {
            throw new IllegalStateException("Unable to initialize GLFW");
        }

        // 配置GLFW
        glfwDefaultWindowHints(); // 设置默认窗口提示
        glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); // 窗口创建后不可见
        glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); // 窗口可调整大小

        // 创建窗口
        window = glfwCreateWindow(800, 600, "LWJGL Window Maximization", NULL, NULL);
        if (window == NULL) {
            throw new RuntimeException("Failed to create the GLFW window");
        }

        // 设置按ESC键关闭窗口的回调
        glfwSetKeyCallback(window, (window, key, scancode, action, mods) -> {
            if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE) {
                glfwSetWindowShouldClose(window, true); // 设置窗口关闭标志
            }
        });

        // 获取主显示器的视频模式
        GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());

        // 将窗口居中
        glfwSetWindowPos(
            window,
            (vidmode.width() - 800) / 2,
            (vidmode.height() - 600) / 2
        );

        // 使OpenGL上下文成为当前上下文
        glfwMakeContextCurrent(window);
        // 启用v-sync
        glfwSwapInterval(1);

        // 使窗口可见
        glfwShowWindow(window);

        // 在这里调用 glfwMaximizeWindow 来最大化窗口
        glfwMaximizeWindow(window); // 关键一步:最大化窗口
    }

    private void loop() {
        // 创建OpenGL功能
        GL.createCapabilities();

        // 设置清除颜色
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);

        // 渲染循环直到用户请求关闭窗口
        while (!glfwWindowShouldClose(window)) {
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除帧缓冲

            glfwSwapBuffers(window); // 交换颜色缓冲
            glfwPollEvents(); // 处理窗口事件
        }
    }

    public static void main(String[] args) {
        new WindowMaximizationExample().run();
    }
}

在上述代码中,glfwMaximizeWindow(window); 这一行确保了在窗口显示后立即将其最大化。

Anakin Anakin

一站式 AI 应用聚合平台,无代码的AI应用程序构建器

Anakin 290 查看详情 Anakin

2. 在窗口创建时最大化

如果您希望窗口在程序启动时就以最大化状态显示,而无需在创建后再手动调用glfwMaximizeWindow,可以通过设置GLFW窗口提示来实现。

2.1 GLFW_MAXIMIZED 窗口提示

GLFW提供了一个窗口提示GLFW_MAXIMIZED,可以在调用glfwCreateWindow之前设置。当此提示设置为GLFW_TRUE时,新创建的窗口将立即处于最大化状态。

2.2 使用示例

以下代码演示了如何在创建窗口之前设置GLFW_MAXIMIZED提示:

import org.lwjgl.glfw.*;
import org.lwjgl.opengl.*;

import static org.lwjgl.glfw.Callbacks.*;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.system.MemoryUtil.*;

public class WindowMaximizedOnCreationExample {

    private long window;

    public void run() {
        init();
        loop();

        glfwFreeCallbacks(window);
        glfwDestroyWindow(window);

        glfwTerminate();
        glfwSetErrorCallback(null).free();
    }

    private void init() {
        GLFWErrorCallback.createPrint(System.err).set();

        if (!glfwInit()) {
            throw new IllegalStateException("Unable to initialize GLFW");
        }

        glfwDefaultWindowHints();
        glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
        glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
        // 关键一步:在创建窗口前设置GLFW_MAXIMIZED提示
        glfwWindowHint(GLFW_MAXIMIZED, GLFW_TRUE); 

        window = glfwCreateWindow(800, 600, "LWJGL Window Maximized on Creation", NULL, NULL);
        if (window == NULL) {
            throw new RuntimeException("Failed to create the GLFW window");
        }

        glfwSetKeyCallback(window, (window, key, scancode, action, mods) -> {
            if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE) {
                glfwSetWindowShouldClose(window, true);
            }
        });

        // 窗口将自动最大化,因此无需手动设置位置或大小
        // glfwSetWindowPos(...) 此时可能不再需要,因为最大化会覆盖它

        glfwMakeContextCurrent(window);
        glfwSwapInterval(1);

        glfwShowWindow(window);
    }

    private void loop() {
        GL.createCapabilities();
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);

        while (!glfwWindowShouldClose(window)) {
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

            glfwSwapBuffers(window);
            glfwPollEvents();
        }
    }

    public static void main(String[] args) {
        new WindowMaximizedOnCreationExample().run();
    }
}

在这个例子中,glfwWindowHint(GLFW_MAXIMIZED, GLFW_TRUE); 确保了窗口在被操作系统渲染时就已经处于最大化状态。

3. 注意事项与总结

  • 非全屏模式: glfwMaximizeWindow 和 GLFW_MAXIMIZED 提示实现的都是操作系统的“最大化”行为,这意味着窗口仍然会有标题栏、边框,并且任务栏或其他桌面元素依然可见。这与glfwSetWindowMonitor切换到全屏独占模式是不同的。
  • 兼容性: 这些GLFW函数和提示在大多数现代操作系统(Windows, macOS, Linux)上都得到良好支持。
  • 窗口状态: 您可以使用 glfwGetWindowAttrib(window, GLFW_MAXIMIZED) 来查询窗口当前是否处于最大化状态。
  • 最佳实践: 如果您的应用程序需要根据用户偏好或其他运行时条件来决定是否最大化,那么在运行时调用 glfwMaximizeWindow 更合适。如果应用程序总是以最大化状态启动,则设置 GLFW_MAXIMIZED 提示更为简洁。

通过利用glfwMaximizeWindow方法或GLFW_MAXIMIZED窗口提示,LWJGL/GLFW开发者可以轻松地在应用程序中实现窗口的程序化最大化功能,从而提供更灵活的用户体验。

以上就是LWJGL/GLFW:通过代码实现窗口最大化(非全屏)的详细内容,更多请关注其它相关文章!


# windows  # 专业seo报价表  # 展会前期营销推广策略  # 新建的影视网站如何优化  # 早教营销方案线上推广  # 爱投资 网站推广  # 无锡网站推广收费  # 平凉网站建设推广有哪些  # 莞城公司网站建设  # 百赢销网络营销推广软件  # 来实现  # 环境管理  # 或其他  # 标题栏  # 任务栏  # 回调  # 句柄  # 应用程序  # 全屏  # cos  # win  # macos  # ai  # mac  # 显示器  # 操作系统  # linux  # seo快速上排名壁纸 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 《海贝音乐》均衡器设置方法  泰拉瑞亚水晶无法放置问题  PHP与SQL实践:高效实现数据复制与特定列值修改  冬季去哪个城市旅游更有可能观测到极光  漫蛙漫画官方版直通入口 2025漫蛙漫画免注册访问说明  口腔诊所管理软件推荐  创客贴登录页面入口 创客贴网页版最新网址链接  《崩坏:星穹铁道》3.6版本异相仲裁打法及配队推荐  VS Code如何设置默认配置  使用逻辑应用(Logic Apps)自动处理邮件附件中的XML到Excel  如何查询个人病历记录  济南公交卡手机充值指南  抖音评论无法发送如何修复 抖音评论功能操作指南  动漫之家观看全集库 动漫之家免费资源网地址  邮政快递寄件查询入口 邮政快递收件查询入口  大众点评了却看不到是怎么回事  热血江湖归来医师加点攻略  漫蛙app官方版手机正版入口-漫蛙漫画manwa在线漫画正版入口  在React中正确处理HTML input type="number"的数值类型  掌握Go App Engine项目结构与GOPATH:包管理与导入实践  Python中处理嵌套字典与列表的数据提取与过滤教程  苹果手机聊天记录删除了如何恢复  如何在CSS中实现盒模型多列间距_grid-gap与padding结合  汽水音乐官方网站登录入口_汽水音乐网页版进入链接  《友玩*》创建群聊方法  外卖小程序对接第三方配送  晓晓优选app支付宝绑定方法  猫眼电影app如何设置电影上映提醒_猫眼电影上映提醒设置教程  MacBook Pro词典使用指南  Windows Audio服务启动失败怎么办_电脑没声音的终极服务修复法【修复】  《U校园》学生登录入口2025  J*a里如何处理ArithmeticException并防止除零_算术异常防护策略解析  小米倒班助手添加日历提醒  《气泡星球》兑换码礼包大全  实现可重用自定义Python Range类  视频号视频怎么免费保存到相册?保存到相册需要注意什么?  lol小红书怎么|直播|?lol小红书|直播|是什么意思?  悟空浏览器网页版链接 悟空浏览器网页版最新有效地址  食品生产用水只要符合国家规定的生活饮用水卫生标准就可以吗  Excel怎么用XLOOKUP函数实现双向查找_ExcelXLOOKUP替代VLOOKUP+HLOOKUP的高级用法  《东方航空》添加乘机人方法  解决 Vue 3 组件未定义错误:理解 createApp 与根组件的正确使用  疯狂小鸟微信小游戏入口 疯狂小鸟网页版秒玩  mysql归档数据怎么导出为csv_mysql归档数据导出为csv文件的方法  狙击外星人小游戏在线链接_狙击外星人小游戏网页链接  4399小游戏下装链接 4399小游戏下载链接入口  《单词速记宝》设置学习计划方法  除了Copilot,还有哪些值得一试的VS Code AI插件?  京东快递物流信息不更新怎么办_物流停滞原因与处理方法  Win10如何彻底关闭OneDrive Win10禁用云同步功能【纯净】 

 2025-11-30

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.