在分层窗口上调用InvalidateRect后,在OnPaint中获取空更新矩形

时间:2010-06-04 16:47:40

标签: c++ onpaint layered-windows

当我在透明窗口调用InvalidateRect时,我试图找出为什么我得到一个空的更新矩形。我的想法是我在窗口上绘制了一些东西(它暂时切换为绘图的1/255的alpha值),然后我将其切换到完全透明模式(即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。但是,一旦窗口分层,它似乎无法正常工作。

1 个答案:

答案 0 :(得分:0)

我想我已经弄清楚了 - 它是Windows +的一个限制组合我正在使用的内部框架中的一些奇怪的代码。我不得不忽略空矩形&使用整个屏幕的矩形 - 似乎工作正常。

很抱歉,如果我对我的初步问题不够清楚 - 我会在下次尝试更精确。