Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在非透明父窗口(win32)的顶部创建透明子窗口_C++_Windows_Winapi - Fatal编程技术网

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()
    函数读取黑白表面,创建另一个线程以保持窗口的透明度
这是完美的工作,唯一的问题是它不太善于使事情透明

另一个问题是为绘制的对象提供alpha混合

但是,您可以使用
SetLayeredWindowAttributes()
函数轻松设置总alpha(透明度)

谢谢你们给我的所有帮助,你们告诉我的所有东西都被利用了,他们指导了我,正如你们所见。:)

可悲的是,由于效率问题,我们决定不使用这种方法:(

但我学到了很多东西,这是一次很棒的经历。这就是我所关心的:)


谢谢:)

这很难看,但是你可以在屏幕上创建一个顶层框架