0

是否可以使用覆盖 wm_nccalcsize 的技巧来使用 opengl 绘制整个窗口区域?

我需要保留 Windows 的所有航空功能(在本例中为 win 7),所以我使用 (WS_POPUP | WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_THICKFRAME) 样式

它适用于最大化模式,我可以通过调整 Lparam 将边框留在屏幕之外。

但是一个普通的窗口仍然有 8px 的边框,即使它们应该是客户端矩形的一部分(我用 GetClientRect()

图片:深灰色边框可见

这一切都是在我初始化 opengl 上下文之前完成的。所以我不知道发生了什么。或者如果这甚至可能。我应该只创建无边界并重新实现所有航空功能吗?(我不会那样做的)

upd 2:如果我在初始化 Opengl 上下文之前使用 GDI 绘制一个矩形,这就是我得到的: 一个很好的 (0,0,200,200) 矩形,从非客户区开始 所以这是 opengl 上下文问题。我在 msdn docs 中看到,opengl 只在客户区绘制。它仍然这样做,忽略我将客户端矩形扩展到整个窗口。嗖嗖嗖的。

4

1 回答 1

1

将 Aero 与 OpenGL 结合的常用方法是使用 DWM API 将窗口客户区设置为零。这允许您使用 OpenGL 绘制到整个窗口(包括标题栏)。我有这个测试程序来修补它作为我的 wglarb 包装器的一部分:

https://github.com/datenwolf/wglarb/blob/master/test/layered.c

您可能还对我的 dwm_load 包装器感兴趣,它允许您调用 DWM 函数,而无需将您的程序与 DWM 严格链接(这使得它与旧 Windows 版本不兼容;您不会相信我仍然经常得到“必须在 WinXP 上运行”作为功​​能要求)https://github.com/datenwolf/dwm_load

于 2016-11-05T11:20:42.100 回答