【发布时间】:2016-06-23 12:07:52
【问题描述】:
(此问题基于对this其他问题的进一步调查,但不是同一个问题,这是关于绘画问题的非常具体的问题。)
我正在尝试绘制一个重叠在目标窗口上的透明表面,问题是我不知道如何将它涂成透明,所以当我的表面是黑色的时候,我看不到正确的方法来在下面的代码中清除该表面的黑色。
我读过有关像素格式和 alphamodes 的信息,但是,我似乎无法使用据称用于允许透明度的 AlphaMode.Straight。
我知道一个可以做到这一点的免费软件应用程序,它的名字是TurboHUD(一个在游戏客户端窗口上绘制透明表面以绘制对象的应用程序,即,一个HUD)。老实说,也许很荒谬:我从两年多前就开始尝试实现这一点,我仍然不知道如何通过透明度来开始做到这一点,我需要开始在透明表面上绘制对象。
我做错了什么?此示例代码是用 VB.NET 编写的,但我也接受 C# 中的解决方案。
Imports SharpDX
Imports SharpDX.Direct2D1
Imports SharpDX.Direct3D
Imports SharpDX.DXGI
Imports SharpDX.Mathematics.Interop
Imports SharpDX.Windows
Public NotInheritable Class Form1 : Inherits Form
Private factory As New Direct2D1.Factory(Direct2D1.FactoryType.SingleThreaded)
Private render As WindowRenderTarget
Private renderProps As HwndRenderTargetProperties
Private renderThread As Thread = Nothing
Private Sub Form1_Load() Handles MyBase.Shown
Dim hwnd As IntPtr = Process.GetProcessesByName("notepad").Single().MainWindowHandle
Me.renderProps = New HwndRenderTargetProperties()
Me.renderProps.Hwnd = hwnd
Me.renderProps.PixelSize = New Size2(1920, 1080)
Me.renderProps.PresentOptions = PresentOptions.None
Me.render = New WindowRenderTarget(Me.factory, New RenderTargetProperties(New PixelFormat(Format.B8G8R8A8_UNorm, Direct2D1.AlphaMode.Premultiplied)), Me.renderProps)
Me.renderThread = New Thread(New ParameterizedThreadStart(AddressOf Me.DoRender))
Me.renderThread.Priority = ThreadPriority.Normal
Me.renderThread.IsBackground = True
Me.renderThread.Start()
End Sub
Private Sub DoRender(ByVal sender As Object)
While True
Me.render.BeginDraw()
' Me.render.Clear(New RawColor4(0, 0, 0, 0))
Me.render.Clear(SharpDX.Color.Transparent)
Me.render.Flush()
Me.render.EndDraw()
End While
End Sub
End Class
上面的代码是对this问题的公认答案的VB.NET改编。
【问题讨论】:
-
这里有一个链接值得一看-stackoverflow.com/questions/26646715/…
-
感谢您的评论和帮助。我也发现了这个问题,但我认为(我认为)不适用于这种情况,因为那是为了使形状/对象透明,而不是表面。老实说,我不知道如何测试/重现该示例。
-
看this MSDN page似乎在处理
ID2D1HwndRenderTarget接口(我猜SharpDX正在使用)时不支持Straightalpha模式。 -
你不能在不同的窗口上透明地绘制(我在你的代码中看到了)。您需要在游戏的 top 上有一个透明的表单(窗口)。它在 TurboHUD 页面中说得很清楚:“在透明的 Direct2D 窗口上绘画(它不能在“全屏”模式下工作,只能在“窗口化”和“窗口化(全屏)”下工作)"
-
你找到了sharpDX的方法吗?如果不是,我建议你使用 GDI。如果您不打算绘制数千条线或数百张大图像,那么 GDI 足够快,不会影响性能。
标签: c# .net vb.net directx sharpdx