我试图弄清楚为什么当我在透明窗口上调用 InvalidateRect 时得到一个空的更新矩形。这个想法是我在窗口上绘制了一些东西(它被临时切换为绘图的 alpha 为 1/255),然后我将其切换到完全透明模式(即 alpha 为 0)以便与桌面&能够在桌面顶部的屏幕上移动绘图。
当我尝试移动绘图时,我得到了它的边界矩形并使用它来调用 InvalidateRect,如下所示:
InvalidateRect(m_hTarget, &winRect, FALSE);
我已经确认 winRect 确实是正确的,并且 m_hTarget 是正确的窗口并且它的矩形完全包含 winRect。
我进入与 m_hTarget 对应的类中的 OnPaint 处理程序,该处理程序派生自 CWnd。在那里,我创建了一个 CPaintDC,但是当我尝试访问更新矩形 (dcPaint.m_ps.rcPaint) 时,它始终是空的。这个矩形被传递给一个函数,该函数确定我们是否需要更新屏幕(在透明窗口的情况下使用 UpdateLayeredWindow)。
如果我在这里硬编码一个非空矩形,其余代码可以正常工作并且我可以在屏幕上移动绘图。
我尝试在 InvalidateRect 中将“FALSE”参数更改为“TRUE”,但没有任何效果。我还尝试使用标准 CDC,然后在我的 OnPaint 处理程序中使用 BeginPaint/EndPaint 方法,以确保 CPaintDC 没有做奇怪的事情……但我得到了相同的结果。
我使用的代码最初是为不透明的窗口设计的。如果 m_hTarget 对应于一个不透明的窗口,则同一组函数调用会导致将正确(即非空)矩形传递给 OnPaint。但是,一旦窗口分层,它似乎就不能正常工作。