使用分层窗口时未绘制下方的窗口

Posted

技术标签:

【中文标题】使用分层窗口时未绘制下方的窗口【英文标题】:windows beneath not being painted when using a layered window 【发布时间】:2010-05-16 21:10:54 【问题描述】:

我会尽力解释我的问题,

我正在用 c++ 创建一个分层窗口(使用 windowsXP),一切正常,直到我将创建的窗口拖到 windows 开始按钮附近,然后当我按下 windows 任务栏的星形按钮并再次关闭它时所有 windows我的分层窗口下方没有被绘制(仅在我的窗口上方弹出的开始窗口区域中)。

我的创建窗口是这样的:

CWnd::CreateEx(WS_EX_TOOLWINDOW | WS_EX_LAYERED, AfxRegisterWndClass(0), lpstr_name, WS_POPUP, 0,0,0,0, pc_parent->GetSafeHwnd(), 0);

...

当我使用这种样式创建窗口时,会出现问题,但如果我使用扩展样式 WS_EX_TRANSPARENT 和所有其他样式创建,问题就不会再发生。如果不是 WS_POPUP 窗口是 WS_CHILD 或 WS_OVERLAPPED 那么这也不会发生...

谁能解释一下为什么当我使用 WS_EX_LAYERED 样式创建一个 WS_POPUP 窗口时,所有下面的窗口都没有更新,如果我添加样式 WS_EX_TRANSPARENT 这工作正常。

注意:为什么我不使用 WS_EX_TRANSPARENT 样式,如果它工作正常?如果我使用它,那么我的窗口不能被拖动,我需要它来做它:)

更新: alt text http://img17.imageshack.us/img17/586/clipboard01il.jpg

上图是为了更好地描述正在发生的事情: 图片的第一部分你可以看到我的分层窗口,下面是 vs,在第二张图片中我按下开始按钮,然后在最后一张图片中我已经将分层窗口拖到右侧,你可以看到 vs 窗口不更新受影响的区域。 请注意,到目前为止,这种情况只发生在启动窗口中?!与其他窗口它不会发生!?...

谢谢

【问题讨论】:

【参考方案1】:

仅在我的窗口上方弹出的开始窗口区域中

这是意料之中的。只有那个剪切矩形被开始菜单遮住,所以只有那个区域会被重新绘制。你期待什么行为?如果有窗户被更多的上层窗户覆盖,那么它们也不会被重新粉刷——为什么要重新粉刷一些东西只是为了在上面粉刷?

如果您使用透明,则窗口下方的所有内容都需要重新绘制,因为 GDI 在不知道窗口颜色下方区域的情况下无法计算像素的最终颜色。

【讨论】:

当然可以,但我是如何允许这样做的。我希望所有窗口下方的人都应该收到关于绘画更新的通知,我不希望我的应用程序会在窗口下方绘画,我希望系统会发送某种消息以便让它知道下面的窗口必须重新绘制是自己的内容。我想你不明白我的问题,我只想知道女巫风格或扩展风格允许这种情况发生。 @Nuno:为什么底层窗口要重绘?它们的顶部有一扇窗户!当最顶层的窗户重新粉刷时,他们所涂的任何东西都会被吹走。 是的,我理解,但我能做些什么来避免这种情况? (我更新问题并添加图像,如您所见,底层窗口是否需要重新绘制?!)请注意,如果我添加 WS_EX_TRANSPARENT 扩展样式,这将不会发生......这就是我需要的,但是这种风格我不能拖动我的窗口,因为它会被点击 @Nuno:我的问题是,你为什么要避免这种情况?为什么你下面的窗户会无缘无故地重新粉刷? @Nuno:所以你想提高透明度?如果是这种情况,正是出于这个原因,您需要 WS_EX_TRANSPARENT。通常任何时候只有一个窗口控制屏幕上的任何一个像素。

以上是关于使用分层窗口时未绘制下方的窗口的主要内容,如果未能解决你的问题,请参考以下文章

如何在透明窗口中绘制透明 DirectX 内容?

Visual-C Win32 API 分层窗口闪烁

位图未在 Win32 C++ 中绘制

win32绘制自定义类窗口导致绘制11个窗口的解决办法

JFrame窗口坐标错误

如何使用 GDI 将 RGB 位图绘制到窗口?