Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 535|回复: 0

GLFW窗口在WINDOWS上的边框透明

[复制链接]

6

主题

6

帖子

4万

积分

超级版主

Rank: 8Rank: 8

积分
40040
发表于 2018-1-9 17:01:56 | 显示全部楼层 |阅读模式
    研究这个问题是因为在SRLILY编辑器的opengl窗口中,需要有和UI系统风格统一的标题栏,这时候WINDOWS上常用的手段作用比较有限。

    此文记录的实现方式意义在于,当不想使用WINDOWS固定的窗口风格的时候(通常是自定义的OPGL绘制的边框),且不用MPC,QT之类的框架,这时候这个方式很有用,不需要处理WINDOWS的系列窗口重绘相关消息。

    注意,目的是实现边框部分透明。而不是“窗口透明”,跟MFC和GDI+中的异形窗口不一个概念。这里的窗口还是方方正正的矩形。常用的窗口透明手段如DwmEnableBlurBehindWindow(此接口在新版GLFW库中,当窗口被设置透明样式时使用)会使客户区所有子控件绘制的时候颜色直接和窗口背景RGB(0,0,0,0)混合, 这时候控件ALPHA小于阈值的部分将能够直接看得见WINDOWS桌面。所以,实际上不能整个窗口都透明。只需要在绘制边框的时候能像WINDOWS高级边框样式一样就可以了。

1.初始化glfw、创建窗口

                glfwInit();
                srcpchar pv = glfwGetVersionString();
                Width = p->windowwidth;
                Height = p->windowheight;
                // open a window with GLFW
                glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
                glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
                glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
                glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
                glfwWindowHint(GLFW_RESIZABLE, GL_TRUE); // 这个样式很重要,有这个样式后可以很方便的通过WINDOWS消息修改实现拉伸窗口的功能
                glfwWindowHint(GLFW_DECORATED, GL_FALSE); // 这个样式实际上去掉了系统提供的默认标题栏。所有窗口区域都为客户区
                CurrentWindow = glfwCreateWindow((srint32)Width, (srint32)Height, p->windowtitle, 0, 0);


2.设置边框样式
                // 要求窗口绘制范围在四个方向都收缩5个像素,这个相当于取了个巧,精髓就在这两行代码了
                // 这时候边框的实际已经不显示了,厚度为0。这两行的执行效果是要求DWM将窗口边缘的5个像素区域内按照边框样式绘制
                // 所以,这时候自定义边框的ALPHA,阴影,模糊等所有边框的样式都可以有,并且边框可以有自己的颜色,不会影响系统中窗口皮肤的颜色。
                MARGINS margins = { 5, 5, 5, 5 };
                DwmExtendFrameIntoClientArea(hWnd, &margins);


3.清空窗口背景颜色
                glClearColor(0, 0, 0, 0);// alpha 0....
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|sairengame  

GMT+8, 2018-11-19 02:13 , Processed in 0.071284 second(s), 4 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表