C++ 在非透明父窗口(win32)的顶部创建透明子窗口
我有一个不是我写的程序。我没有它的来源,该程序的开发人员正在独立开发。他给了我该程序的C++ 在非透明父窗口(win32)的顶部创建透明子窗口,c++,windows,winapi,C++,Windows,Winapi,我有一个不是我写的程序。我没有它的来源,该程序的开发人员正在独立开发。他给了我该程序的HWND和HINSTANCE句柄 我使用win32api在他的窗口上创建了一个子窗口 我需要做的第一件事是使这个子窗口在某些区域具有透明度,在另一个区域具有不透明性(如游戏的平视显示器(HUD)),这样用户可以在两个窗口中都看到东西 我需要做的第二件事是将所有输入定向到父窗口。我的子窗口不需要输入 我知道,WS\u EX\u TRANSPARENT只会让孩子像画师算法一样在最后画画 我不能使用WS\u EX\u
HWND
和HINSTANCE
句柄
我使用win32
api在他的窗口上创建了一个子窗口
我需要做的第一件事是使这个子窗口在某些区域具有透明度,在另一个区域具有不透明性(如游戏的平视显示器(HUD)),这样用户可以在两个窗口中都看到东西
我需要做的第二件事是将所有输入定向到父窗口。我的子窗口不需要输入
我知道,WS\u EX\u TRANSPARENT
只会让孩子像画师算法一样在最后画画
我不能使用WS\u EX\u LAYERED
,因为它是一个子窗口
p、 美国
我找遍了所有地方,但没有找到任何解决方案,尽管网上也有类似的问题
实际上,这是一个类似于HUD的游戏。我不能直接在父窗口上绘制,因为多线程的复杂性以及其他许多原因
--编辑---------------------------
我还在努力。我正在用你们所有人的建议尝试不同的方法。有没有办法将
directX
和SetWindowRgn()
函数或directX
与BitBlt()
函数相结合?我想那就行了。目前,我正在测试作为子窗口和分层窗口的所有内容。您可以使用SetWindowRgn
在父窗口中打一个洞
而且,仅仅因为它不是你的窗口并不意味着你不能使它成为一个分层窗口
最后,您可以通过使用子类化来控制另一个窗口—实际上,您可以用Wndproc代替它们来处理您希望处理的消息,然后将剩余的消息传递给它们的原始Wndproc。您可以使用
WS_EX_LAYERED
从Windows 8及更高版本开始
要支持早期版本的windows,只需创建一个分层窗口作为弹出窗口(不带chrome),并确保其位于游戏窗口的适当位置。大多数用户不会一直移动正在使用的窗口,因此,虽然您需要监视父窗口的移动,并重新定位HUD,但这不应成为显示的障碍
不对焦(在子窗口的情况下)或激活(在弹出窗口的情况下)更有趣,但仍然可以:-操作系统实际上不会自动将焦点或激活分配给单击的窗口-Windows WindowProc始终对焦或激活,通过在自身上调用SetFocus
,或SetActiveWindow
或setforegroundindow
的某些变体。这里重要的一点是,如果您使用了所有鼠标和非客户端鼠标消息,而没有将它们传递给DefWindowProc,那么您的HUD将永远不会因为单击而从游戏窗口窃取激活或键盘焦点
作为一个弹出窗口或另一个线程上的窗口,您可能必须手动处理window proc确实收到的任何鼠标消息,并将它们发布到游戏窗口。否则,使用
HTTRANSPARENT
(与WS_EX_TRANSPARENT
实现的效果类似)进行响应可以让系统继续向下传递鼠标消息,直到找到目标。好的,朋友们,最后我做了一些疯狂的事情让它发生。但是它不是很有效,就像直接使用DirectX进行绘图一样
我要说的是:
- 使用
和(WS_EX_透明| WS_EX_分层| WS_EX_工具窗口)
上的
()
- 创建窗口后,从窗口样式中删除
,并从扩展窗口样式中删除(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE)
(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE | WS_EX_APPWINDOW)
- 这给了我一个没有边框的窗口,它现在也显示在任务栏上。此外,命中测试将传递给我窗口后面的任何对象
- 子类化另一个窗口的窗口过程并获得
,WM\u CLOSE
,分别将WM\u DESTROY
或WM\u CLOSE
发送到我的窗口WM\u DESTROY
,WM_SIZE
,根据另一个窗口调整和移动我的窗口WM_MOVE
,WM_LBUTTONUP
,WM_RBUTTONUP
,使我的窗口处于顶部,并保持对另一个窗口的关注,这样我的窗口就不会隐藏在另一个窗口后面WM_MBUTTONUP
- 使DirectX设备具有两个过程:
- 在第一个过程中,它在白色背景上以黑色绘制所有元素,并将backbuffer数据复制到另一个曲面上(因此它给出了一个黑白二值图像)
- 在第二遍中,它正常地画东西
- 通过使用
函数读取黑白表面,创建另一个线程以保持窗口的透明度SetWindowRgn()
SetLayeredWindowAttributes()
函数轻松设置总alpha(透明度)
谢谢你们给我的所有帮助,你们告诉我的所有东西都被利用了,他们指导了我,正如你们所见。:)
可悲的是,由于效率问题,我们决定不使用这种方法:(
但我学到了很多东西,这是一次很棒的经历。这就是我所关心的:)
谢谢:)这很难看,但是你可以在屏幕上创建一个顶层框架