gpt4 book ai didi

c++ - 在非透明父窗口之上创建透明子窗口 (win32)

转载 作者:可可西里 更新时间:2023-11-01 14:45:30 25 4
gpt4 key购买 nike

我有一个不是我写的程序。我没有它的来源,该程序的开发人员正在独立开发。他给了我该程序的 HWNDHINSTANCE 句柄。

我使用 win32 api 在他的窗口上创建了一个子窗口。

我需要做的第一件事是让这个子窗口在某些区域透明而在其他区域不透明(比如游戏的平视显示器 (HUD)),这样用户就可以在两个窗口中看到东西。

我需要做的第二件事是将所有输入定向到父窗口。我的子窗口不需要输入。

我知道 WS_EX_TRANSPARENT 只会让 child 像画家算法一样在最后画画。

我不能使用 WS_EX_LAYERED 因为它是一个子窗口。

附:

虽然互联网上有类似的问题,但我到处都找遍了,但没有找到任何解决方案。

实际上,这是该游戏的类似 HUD 的东西。由于多线程的复杂性和许多其他原因,我无法直接在父窗口上绘制。

-- 编辑 --------------------------

我还在努力。我正在按照你们的建议尝试不同的方法。有没有办法将 directXSetWindowRgn() 函数或 directxBitBlt() 函数结合起来?我认为这会成功。目前我正在测试所有东西作为子窗口和分层窗口。

最佳答案

好的 friend ,最后我做了一些疯狂的事情来实现它。但是效率不高,像直接用DirectX画图。

我不喜欢的:

  • CreateWindowEx 上使用了 (WS_EX_TRANSPARENT | WS_EX_LAYERED | WS_EX_TOOLWINDOW)()
  • 创建窗口后,从窗口样式中删除(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE),并从扩展窗口样式中删除(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE | WS_EX_APPWINDOW) .
  • 这给了我一个没有边框的窗口,它现在也显示在任务栏中。 hittest 也被传递到我窗口后面的任何东西。
  • 子类化另一个窗口的窗口过程并得到
    • WM_CLOSE,WM_DESTROY,将WM_CLOSEWM_DESTROY分别发送到我的窗口
    • WM_SIZE,WM_MOVE, 根据其他窗口调整和移动我的窗口
    • WM_LBUTTONUPWM_RBUTTONUPWM_MBUTTONUP,让我的窗口移到顶部,同时仍然保持对另一个窗口的关注,这样我的窗口没有隐藏在其他窗口后面
  • 使 DirectX 设备有两个 channel :
    • 在第一遍中,它在白色背景上以黑色绘制所有元素,并将后备缓冲区数据复制到另一个表面(因此它给出黑白二值图像)。
    • 在第二遍中,它正常绘制事物。
  • 创建了另一个线程,通过使用 SetWindowRgn() 函数读取黑白表面来保持窗口透明。

这是完美的,唯一的问题是它不太擅长使事情变得透明。

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

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

感谢你们给予的所有帮助,你们告诉我的所有东西都被使用了,他们指导了我,正如你所看到的。 :)

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

但我学到了很多东西,这是一次很棒的经历。这对我来说很重要:)

谢谢你:)

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com