1

我希望我可以在不发布大量源代码的情况下清楚地传达我遇到的问题。来源都是 ASM,虽然大多数人会理解它,但它仍然不是他们的主要“东西”。

我有一个运行良好的分层窗口——直到调整它的大小。窗口都是每个像素的 alpha。没有透明像素。边框和标题是不透明的(255 alpha);客户区类似于 128 alpha 或任何我放的东西。所以没有透明像素。

我有一个处理重绘的函数——它实际上是为了重建框架以适应新的窗口大小。GetWindowDC 在分层窗口上调用。CreateCompatibleDC 从该 DC 创建。位图是一个 DIB 部分。位图已正确发送到 UpdateLayeredWindow。同样,只要窗口未处于活动调整大小(边框拖动)状态,一切都会完美运行。

我曾尝试使用 DefWindowProc 来处理边框拖动,以及自己完全处理该功能的所有方面。结果是相同的:大量闪烁,但仅超出边框拖动开始之前存在的窗口边界,然后窗口大小最终不会改变 - 有点。原始窗口区域仍然显示没有问题。那里没有闪烁。但是,如果(例如)我将右边框向右拖动,则原始窗口右边缘的所有内容都会快速闪烁然后消失。当我释放鼠标左键时,显示保持在原始大小(拖动边框之前窗口的大小)。我已验证位图已正确重建为新大小。似乎分层窗口的 DC 没有

我什至尝试在手动处理中调整窗口大小之前删除 ws_ex_layered 样式(我尝试过 MoveWindow 和 SetWindowPos),然后在 SetWindowPos / MoveWindow 之后但在拖动之前重置 ex 样式。

当我让 DefWindowProc 处理更新时,我得到了完全相同的结果。所以有迹象表明我的重绘出了点问题。但我什至削减了这个过程(注释掉大量代码进行测试),只是用 0xFF0000FF(任意测试值,蓝色,完全不透明度)填充位图,然后直接跳到 UpdateLayeredWindow。结果相同。

用于 UpdateLayeredWindow 的位图在调用“重建”函数之前被删除,并且在该位图被重新创建为新大小的函数内。我已经广泛验证了新的尺寸——我可以看到新的位图高速闪烁,一切都很好。DC 是来自分层窗口的 GetWindowDC。兼容的 DC 创建该 DC。位图被选择到兼容的 DC 中,并且该兼容的 DC 被传递给 UpdateLayeredWindow。如果这些东西中的任何一个被关闭,我将永远不会看到显示的新位图。它就在那里 - 它只是在调整大小开始之前存在的窗口边界之外高速闪烁。DefWindowProc 产生相同的结果。在该原始区域内,当我将右边框向右拖动时,我的标题按钮向右滑动,进一步验证一切正常。

我不知所措。欢迎任何意见。

4

0 回答 0