当DPI感知,全屏和无边框时,在WM_NCACTIVATE上删除了客户区域

问题描述 投票:0回答:1

我正在编写一个程序,该程序需要DPI感知的无边界全屏顶级OpenGL窗口。该程序只有99%的时间具有此主窗口。

我遇到的问题是,当窗口变为非活动状态时,窗口的工作区会被窗口擦除。仅当DPI感知,全屏无边界(即非客户区域为零)时才会发生这种情况。

我通过捕获WM_NCACTIVATE并返回0来防止该窗口处理NC重绘,从而找到了解决方法。如果非客户区域为零,则Windows非客户重绘过程似乎会擦除客户区域。

但是,当我创建一个DialogBox(主hWnd的子级)时,它会使主窗口变为非活动状态(显然)。如果我从WM_NCACTIVATE返回0,则鼠标和键盘事件不会传递给对话框proc,因此程序被锁定。使用全局标志,我可以在创建对话框之前停用替代方法,然后在WM_INITDIALOG上重绘我的主GL屏幕,但这会导致我试图防止屏幕闪烁。

所以我的问题是:如何在不抑制WM_NCACTIVATE的情况下防止Windows擦除客户端的工作,这是主要的工作?

或者:如何避免窗口擦除,延迟,然后重画在创建对话框时出现的闪烁?

FYI,我用来创建主窗口,运行消息循环并绘制GL场景的代码本质上是从HeNe示例中提取的。我知道这些文件过时了,但我发现它们很容易构建。

我将HeNe代码更改为WinMain(),并且仅在程序需要时(在主循环之外和WM_PAINT外部)执行我的OpenGL绘图。在WM_PAINT和WM_NCPAINT内部重绘场景和SwapBuffers()不能解决问题。

要使窗口全屏显示,我使用Raymond Chen的代码:https://devblogs.microsoft.com/oldnewthing/20100412-00/?p=14353我还尝试了c-smile的代码进行全屏显示,其行为与Raymond Chen的相同:Windows 10, DPI scaling and fullscreen

为了记录,我正在使用PerMonitor V2,但似乎与我使用哪种模式无关。我尝试使用API​​和清单文件进行设置。

VS2019 v142; SDK 10.0.18362.0

我正在编写一个程序,该程序需要DPI感知的无边界全屏顶级OpenGL窗口。程序只有99%的时间具有此主窗口。我遇到的问题是...

c++ windows opengl fullscreen highdpi
1个回答
0
投票

我为Win10上的Qt应用程序解决了这个问题。我的程序可以识别DPI并且无边界,但不是全屏显示。但是,我在以下地方遇到了同样的问题:

© www.soinside.com 2019 - 2024. All rights reserved.