我有一个不是我编写的程序。我没有消息来源,该程序的开发人员正在独立开发。他给了我该程序的HWNDHINSTANCE句柄。
我已经使用win32 API在他的窗口上创建了一个子窗口。
我需要做的第一件事是使此子窗口在某些区域具有透明性,而在其他区域具有不透明性(例如游戏的抬头显示器(HUD)),以便用户可以在两个窗口中看到事物。
我需要的第二件事是将所有输入定向到父窗口。我的子窗口不需要输入。
我知道WS_EX_TRANSPARENT仅使 child 像画家算法那样在最后绘制。
我不能使用WS_EX_LAYERED,因为它是一个子窗口。
ps。
尽管互联网上存在类似的问题,但我无处不在,但找不到任何解决方案。
实际上,对于该游戏来说,这就像HUD一样。由于多线程的复杂性以及其他许多原因,我无法直接在父窗口上绘制。
- 编辑 - - - - - - - - - - - - - -
我还在努力。我正在用大家提出的建议尝试不同的方式。有没有一种方法可以将directXSetWindowRgn()函数或directxBitBlt()函数结合在一起?我认为可以解决问题。目前,我正在将所有内容作为子窗口和分层窗口进行测试。

最佳答案

好的, 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)
  • 这给了我一个没有边界的窗口,它现在也显示在任务栏中。 HitTest 也将传递到我窗口后面的所有内容。
  • 子类化了另一个窗口的窗口过程,并获得了
  • WM_CLOSEWM_DESTROY,分别将WM_CLOSEWM_DESTROY发送到我的窗口
  • WM_SIZEWM_MOVE,以根据另一个窗口调整大小并移动我的窗口
  • WM_LBUTTONUPWM_RBUTTONUPWM_MBUTTONUP,使我的窗口位于顶部,并且仍将焦点放在另一个窗口上,这样我的窗口就不会隐藏在另一个窗口的后面

  • 使DirectX设备通过两次:
  • 在第一遍中,它在白色背景的顶部绘制黑色的所有元素,并将后缓冲数据复制到另一个表面(这样就得到了黑白的二进制图像)。
  • 在第二遍中,它正常绘制东西。

  • 使用SetWindowRgn()函数创建另一个线程以通过读取黑白表面来保持窗口透明。

  • 这是完美的工作,唯一的事情是使事情变得不透明。
    另一个问题是对绘制的对象进行Alpha混合。
    但是,您可以使用SetLayeredWindowAttributes()函数轻松设置总的alpha(透明度)。
    如你们所见,感谢你们提供的所有帮助,你们告诉我的所有东西都被使用了,并指导了我。 :)
    可悲的是,由于效率问题,我们决定不使用此方法:(
    但是我学到了很多东西,这真是很棒的经历。这对我来说很重要:)
    谢谢你 :)

    关于c++ - 在非透明父窗口(win32)顶部创建透明子窗口,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10513716/

    10-10 21:29
    查看更多