在不透明的父窗口顶部创build一个透明子窗口(win 32)

我有一个不是由我写的程序。 我没有它的来源,该程序的开发者正在独立开发。 他给了我该程序的HWNDHINSTANCE句柄。 我使用win32 api在他的窗口上创build了一个子窗口。 首先,我需要的是使这个子窗口在某些区域具有透明度,在其他区域(例如游戏的平视显示器(HUD))上不透明,以便用户可以在两个窗口中看到事物。

第二件事,我需要的是将所有的input指向父窗口。 我的孩子窗口不需要input。

我知道WS_EX_TRANSPARENT只是使得子画在画家algorithm的末尾。 我不能使用WS_EX_LAYERED因为它的一个子窗口。

提前致谢 :)

ps我到处都找,但没有find任何解决scheme,虽然有类似的问题在互联网上。 其实这是一个HUD就像那个游戏的东西。 我不能直接在父窗口上绘制,因为multithreading复杂的任何其他许多原因。

– 编辑—————————嘿家伙,我仍然在努力。 尝试不同的方式与你所有的build议。 有没有办法将directXSetWindowRgn()函数或directxBitBlt()函数结合起来。 我认为这将会诀窍。 目前我正在testing所有的东西作为一个子窗口和分层窗口。

Solutions Collecting From Web of "在不透明的父窗口顶部创build一个透明子窗口(win 32)"

好朋友,最后我做了一些疯狂的事情,使之发生。 但是像直接使用x直接绘制效率不是很高。

我做了什么,

  • 使用(WS_EX_ TRANSPARENT | WS_EX_LAYERED | WS_EX_ TOOLWINDOW)和()在CreateWindowEx
  • 创建窗口后,从窗口样式中删除(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE | WS_EX_APPWINDOW)从扩展窗口样式中删除(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE | WS_EX_APPWINDOW)
    • 这给了我一个没有边界的窗口,现在也显示在任务栏中。 最关键的是传递给我窗口后面的东西。
  • 将其他窗口的窗口过程分类并得到
    • WM_CLOSEWM_DESTROY ,将WM_CLOSEWM_DESTROY分别发送到我的窗口
    • WM_SIZEWM_MOVE ,根据另一个窗口调整窗口大小并移动窗口
    • WM_LBUTTONUPWM_RBUTTONUPWM_MBUTTONUP ,使我的窗口到达顶部,并仍然关注其他窗口,以便我的窗口不会隐藏在其他窗口的后面
  • 使directx设备有两个通行证,
    • 在第一遍中,它将所有黑色的元素绘制在白色背景之上,并将后台数据复制到另一个表面(所以​​它给出黑白的二进制图像)
    • 在第二遍中,它正常地绘制事物。
  • 通过使用SetWindowRgn函数读取黑白表面,创建另一个线程来保持窗口透明度。

这是完美的工作,唯一的事情是它不是很透明。 另一个问题是给绘制的对象赋予alpha混合。 但是您可以使用SetLayeredWindowAttributes函数轻松设置产品alpha(透明度)。

感谢你们所给予的所有帮助,所有你们所说的东西都被使用了,他们引导着我。 :)可悲的是我们决定不使用这种方法,因为效率问题:(但我学到了很多东西,这是一个很棒的经验。这就是所有重要的我:)谢谢:)

您可以使用WS_EX_LAYERED从Windows 8及更高WS_EX_LAYERED的子窗口 。

为了支持早期版本的Windows,只需创建一个层级窗口作为弹出窗口(没有铬),并确保它位于游戏窗口的适当位置。 大多数用户不会随时移动他们正在工作的窗户,所以,当您需要监视移动的父窗口并重新定位HUD时,这不应该成为阻挡器。

没有注意到(在作为子窗口的情况下)或激活(在弹出的情况下)更有趣,但仍然相当有用: – 操作系统实际上不自动分配焦点或激活,到一个被点击的窗口 – Windows WindowProc总是通过调用SetFocusSetActiveWindowSetForegroundWindow本身的变体来获得焦点或激活。 这里最重要的是,如果你在不传递给DefWindowProc的情况下消耗所有的鼠标和非客户端鼠标消息,你的HUD将永远不会从点击窗口的游戏窗口盗取激活或键盘焦点。

作为一个弹出窗口或另一个线程上的窗口,您可能必须手动处理窗口过程所获得的任何鼠标消息,并将其发布到游戏窗口中。 否则,使用HTTRANSPARENT (类似于HTTRANSPARENT的效果)对WM_NCHITTEST进行响应可以使系统继续向下传递鼠标消息,直到找到目标为止。

您可以使用SetWindowRgn在父窗口中创建一个空洞。

另外,仅仅因为它不是你的窗口,并不意味着你不能把它作为一个分层的窗口。

http://msdn.microsoft.com/en-us/library/ms997507.aspx

最后,你可以通过使用子类来控制另一个窗口 – 本质上你可以用你的Wndproc来代替它们,来处理你想要处理的消息,然后把剩下的部分传给原来的wndproc。