我有一个不是我编写的程序。我没有消息来源,该程序的开发人员正在独立开发。他给了我该程序的HWND
和HINSTANCE
句柄。
我已经使用win32
API在他的窗口上创建了一个子窗口。
我需要做的第一件事是使此子窗口在某些区域具有透明性,而在其他区域具有不透明性(例如游戏的抬头显示器(HUD)),以便用户可以在两个窗口中看到事物。
我需要的第二件事是将所有输入定向到父窗口。我的子窗口不需要输入。
我知道WS_EX_TRANSPARENT
仅使 child 像画家算法那样在最后绘制。
我不能使用WS_EX_LAYERED
,因为它是一个子窗口。
ps。
尽管互联网上存在类似的问题,但我无处不在,但找不到任何解决方案。
实际上,对于该游戏来说,这就像HUD一样。由于多线程的复杂性以及其他许多原因,我无法直接在父窗口上绘制。
- 编辑 - - - - - - - - - - - - - -
我还在努力。我正在用大家提出的建议尝试不同的方式。有没有一种方法可以将directX
和SetWindowRgn()
函数或directx
与BitBlt()
函数结合在一起?我认为可以解决问题。目前,我正在将所有内容作为子窗口和分层窗口进行测试。
最佳答案
好的, friend 们,最后我做了一些疯狂的事情来实现它。但它效率不高,就像直接使用DirectX进行绘制一样。
我的病:
(WS_EX_TRANSPARENT | WS_EX_LAYERED | WS_EX_ TOOLWINDOW)
上使用了()
和CreateWindowEx
(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE)
,并从扩展窗口样式中删除(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE | WS_EX_APPWINDOW)
。 WM_CLOSE
,WM_DESTROY
,分别将WM_CLOSE
或WM_DESTROY
发送到我的窗口WM_SIZE
,WM_MOVE
,以根据另一个窗口调整大小并移动我的窗口WM_LBUTTONUP
,WM_RBUTTONUP
,WM_MBUTTONUP
,使我的窗口位于顶部,并且仍将焦点放在另一个窗口上,这样我的窗口就不会隐藏在另一个窗口的后面SetWindowRgn()
函数创建另一个线程以通过读取黑白表面来保持窗口透明。 这是完美的工作,唯一的事情是使事情变得不透明。
另一个问题是对绘制的对象进行Alpha混合。
但是,您可以使用
SetLayeredWindowAttributes()
函数轻松设置总的alpha(透明度)。如你们所见,感谢你们提供的所有帮助,你们告诉我的所有东西都被使用了,并指导了我。 :)
可悲的是,由于效率问题,我们决定不使用此方法:(
但是我学到了很多东西,这真是很棒的经历。这对我来说很重要:)
谢谢你 :)
关于c++ - 在非透明父窗口(win32)顶部创建透明子窗口,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10513716/