0

我试图弄清楚为什么当我在透明窗口上调用 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。但是,一旦窗口分层,它似乎就不能正常工作。

4

1 回答 1

0

我想我已经弄明白了——这是 Windows 的限制 + 我正在使用的内部框架中的一些奇怪代码的组合。我必须忽略空矩形并改用整个屏幕的矩形 - 它似乎工作正常。

抱歉,如果我最初的问题不够清楚 - 下次我会尝试更准确。

于 2010-06-09T21:40:52.397 回答