【发布时间】:2012-05-09 09:51:32
【问题描述】:
我有一个不是我写的程序。我没有它的来源,该程序的开发人员正在独立开发。他给了我那个程序的HWND 和HINSTANCE 句柄。
我在他的窗口上创建了一个子窗口,使用win32 api。
我需要做的第一件事是让这个子窗口在某些区域具有透明性,而在其他区域不透明(例如游戏的平视显示器 (HUD)),以便用户可以在两个窗口中看到内容。
我需要的第二件事是将所有输入定向到父窗口。我的子窗口不需要输入。
我知道WS_EX_TRANSPARENT 只会让孩子像画家算法一样在最后绘制。
我不能使用WS_EX_LAYERED,因为它是一个子窗口。
附言
我到处寻找,但没有找到任何解决方案,尽管互联网上有类似的问题。
实际上,这是一款类似于 HUD 的游戏。由于多线程的复杂性以及其他许多原因,我无法直接在父窗口上绘制。
-- 编辑---------------
我仍在努力。我正在尝试不同的方式与你们所有人的建议。有没有办法将directX 和SetWindowRgn() 函数或directx 与BitBlt() 函数结合起来?我认为这会奏效。目前我正在测试所有的东西作为一个子窗口和一个分层窗口。
【问题讨论】:
-
它很难看,但是您可以在窗口上方创建一个顶级框架并跟踪下方窗口的移动。然后设置透明区域:codeguru.com/cpp/w-d/dislog/non-rectangulardialogs/article.php/…
-
如果你让窗口透明,那只会让你看到父窗口。你想在父窗口上打个洞吗?
-
好吧,你至少需要 WS_EX_TRANSPARENT。您必须处理的一个问题是作者将在 WM_ERASEBKGND 消息上擦除他的窗口,这将消除您从样式标志中获得的背景像素。因此,您需要继承他的窗口过程并抑制或替换该消息。使用 WM_PAINT 绘制的内容是否仍然有效是一个悬而未决的问题,您需要自己找出答案。如果它包含任何具有抗锯齿边缘的文本或图形,则几率很低。鉴于成功的几率很低,作为评论发布。
-
@HansPassant,WS_EX_TRANSPARENT 是最令人困惑的窗口样式之一。它不会使窗口透明,它只是改变渲染顺序。
-
是的,它也使命中测试透明..而不是可见性..呵呵