我希望我能够在没有发布大量源代码的情况下清楚地传达这个问题。来源是所有ASM,虽然大多数人都理解它,但它仍然不是他们的主要因素。"
我有一个完美的分层窗口 - 直到调整它的大小。该窗口是所有每像素alpha。没有透明像素。边框和标题是不透明的(255 alpha);客户区域就像是128 alpha或我所说的任何东西。所以没有透明像素。
我有一个处理重绘的功能 - 它实际上是为了重建新窗口大小的帧。在分层窗口上调用GetWindowDC。 CreateCompatibleDC创建该DC。位图是DIB部分。位图已正确发送到UpdateLayeredWindow。同样,只要窗口没有处于活动调整大小(边框拖动),一切都会完美。
我尝试过使用DefWindowProc来处理边框拖动,以及自己完全处理该功能的所有方面。结果是相同的:巨大的闪烁,但只有在边界拖动开始之前存在的窗口边界之外,然后窗口大小最终不会改变 - 排序。原始窗口区域仍然显示没有问题。那里没有闪烁。但是,如果(例如)我向右拖动右边框,原始窗口右边缘的所有内容都会快速闪烁然后消失。当我松开鼠标左键时,显示屏保持原始大小(拖动边框前窗口的大小)。我已验证位图已正确重建为新大小。看起来分层窗口的DC并不想调整大小,因为原始窗口大小的整个区域是完全稳定的,但是出现调整大小后闪烁的任何新区域都会隐藏。
我甚至尝试删除ws_ex_layered样式,然后在我的手动处理中调整窗口大小(我已尝试过MoveWindow和SetWindowPos),然后在SetWindowPos / MoveWindow之后但在拖动之前重置ex样式。
当我让DefWindowProc处理更新时,我得到了完全相同的结果。因此有迹象表明我的重新粉刷有问题。但我甚至削弱了这个过程(评出了大量的代码进行测试),只是用0xFF0000FF(任意测试值,蓝色,完全不透明度)填充位图,然后直接跳转到UpdateLayeredWindow。结果相同。
在调用" rebuild"之前删除用于UpdateLayeredWindow的位图。函数和函数内的位图重新创建为新的大小。我已经广泛验证了新的尺寸 - 我可以看到新的位图,因为它是高速闪烁而且它都很好。 DC是分层窗口中的GetWindowDC。兼容的DC会产生DC。位图被选择到兼容的DC中,并且该兼容的DC被传递给UpdateLayeredWindow。如果这些东西中的任何一个关闭,我将永远不会看到显示新的位图。它就在那里 - 它只是高速闪烁,只能超出调整大小开始之前存在的窗口界限。 DefWindowProc产生相同的结果。在原始区域内,当我向右拖动右边框时,我的标题按钮向右滑动,进一步验证一切正常。
我不知所措。欢迎提出任何意见。