首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DirectX调整大小显示边缘的win32背景

DirectX调整大小显示边缘的win32背景
EN

Stack Overflow用户
提问于 2020-07-26 04:53:31
回答 1查看 649关注 0票数 1

在DirectX中向下调整大小时,我注意到在底部/右侧边缘有一个闪烁。

如果您修复了交换链的大小(以红色表示),并将win32背景设置为绿色,您将在调整大小后得到以下结果:

窗口大小似乎滞后于鼠标位置(“拖动矩形”),但DirectX填充的区域(红色和黑色)与拖动矩形匹配,其余部分将用窗口背景色(绿色)绘制。

DirectX实用工具工具包(DXUT)没有这个问题。通过对它们的设置进行实验,我发现设置DXGI_SWAP_CHAIN_DESC::SwapEffect = DXGI_SWAP_EFFECT_DISCARD只会将屏幕涂成绿色(窗口背景色)。我假设,DXUT对win32进入模态大小回路时有自己的特殊处理,以便在大小范围内显示DirectX内容。

DXGI_SWAP_EFFECT_DISCARD旧blit模式表示模型的一部分。值得注意的是,它不能有DXGI_SWAP_CHAIN_DESC1::Scaling = DXGI_SCALING_NONE,缩放必须扩展到窗口的大小。因此,我最好的猜测是,这种行为是由于翻转表示模型的实现(它将矩形翻转得太小(黑色),然后将其余的部分涂成绿色)。

有人知道如何阻止win32背景显示吗?

编辑:

多亏了IInspectable!我可以确认WS_EX_NOREDIRECTIONBITMAP扩展样式的工作:它会阻止win32背景显示的工件

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-29 05:33:30

我在与CreateSwapChainForComposition()一起使用DirectComposition时,复制了与使用CreateSwapChainForHwnd()完全相同的行为。

这意味着像素有两条到达屏幕的路径。绿色像素通过重定向面。因此,显式请求WS_EX_NOREDIRECTIONBITMAP可以防止通过重定向曲面显示任何绘图,从而阻止win32背景显示。

另一条路径是翻转表示行为,这是显示红色和黑色像素的方式。因此,在调整大小时不使用翻转表示也会阻止显示win32背景。

DWM必须有一个bug :当有一个重定向曲面时,阻止交换链内容从窗口延伸到窗口的裁剪比重定向表面要小,允许沿着底部/右边的边缘看到它。

有两点令人感兴趣的意见:

  1. 当使用WS_EX_LAYOUTRTL或使用GetClientRect()手动将IDCompositionVisual定位到屏幕的右侧边缘时,交换链内容的位置是正确的,但仍然是剪裁的。
  2. 当使用WS_EX_NOREDIRECTIONBITMAP时,窗口的非工作区区域与交换链的内容成一行,而不是被裁剪的

这些观察结果暗示,问题的原因是DWM有时使用它更好的窗口大小,有时使用重定向表面的大小。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63096226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档