使用 GLFW 库自带的函数设置窗口置于顶层前端显示。起因:一位群友问到这个问题,在网上查找 GLFW 前端显示窗口和 OpenGL 前端显示窗口无果后翻阅 GLFW 的 docs 找到了解决方案。写个博客记录一下。
起因
群友在群里问有没有会 OpenGL 的,虽然我不会但是肯定要凑热闹假装会啊。它的需求是创建一个窗口,显示在最顶层(即使是有全屏程序的情况下)大概就是类似于录屏工具的样子。
过程
在网上几番搜索没用结果后我干脆直接翻看了 GLFW 的官方文档(果然那玩意才是最好用的)
一开始我以为是在创建窗口glfwCreateWindow()
时候传入参数里面设置置顶。但是并没有相关的参数,倒是发现了全屏的方法。
继续查阅函数列表,希望找到一个能置顶窗口的函数,类似于glfwSetWindowTop()
这样名字的。但是一番查找无果。像glfwShowWindow ( GLFWwindow * window )
显示窗口和void glfwFocusWindow ( GLFWwindow * window )
聚焦窗口都不是我想要的,聚集窗口会把焦点移动到窗口上,如果你打游戏时候干了这怕是要被打死。
最后引起我注意的是函数
|
|
它的意思是设置窗口的属性,我想,置顶不正是一种属性嘛?于是我跳转到了glfwSetWindowAttrib()
的页面,用法很简单,和想象的一样。里面有个链接到Window attributes,及窗口的所有属性列表。在这里我们可以看到一个叫做GLFW_FLOATING
属性,它的介绍是:
GLFW_FLOATING indicates whether the specified window is floating, also called topmost or always-on-top. This can be set before creation with the GLFW_FLOATING window hint or after with glfwSetWindowAttrib.
它可以让窗口浮动,也就是置顶(always-on-top)这正是我们想要的了!
实施
随便打开了以前测试 OpenGL 环境的项目,我的想法是按下T
键置顶,这样可以有一个前后对比。在监听按键的函数里面如下写道:
|
|
启动程序,点击其它程序发现可以覆盖我们的窗口。焦点在窗口时按下T
,然后再将其它程序拖动过去,发现不能覆盖。
全屏播放视频和全屏游戏也不能将我们的窗口覆盖。至此目的达成。
总结
使用如下代码将窗口置顶,其中window
是窗口指针
|
|
使用如下代码取消窗口置顶,其中window
是窗口指针
|
|
参考
GLFW 文档
GLFW 文档 -> 窗口参考
GLFW 文档 -> 窗口参考:glfwSetWindowAttrib
GLFW 文档 -> 窗口导览 -> 窗口属性
GLFW 文档 -> 窗口导览 -> 窗口属性:GLFW_FLOATING