Как нарисовать прозрачную поверхность с помощью SharpDX?
( этот вопрос основан на дальнейшие исследования этой другой вопрос, но это не тот же вопрос, это очень конкретный вопрос о проблемах живописи. )
Я пытаюсь нарисовать прозрачную поверхность, наложенную на целевое окно, проблема в том, что я не знаю, как нарисовать ее прозрачной, поэтому к тому моменту моя поверхность черная, и я не вижу правильного способа очистить черный цвет этой поверхности в коде под.
Я читал о pixelformats и 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
код выше VB.NET адаптация принятого ответа этой вопрос.
1 ответов
Спасибо большое @δ γηράσκω' πολλά αεί διδασκόμε предложения, я наконец-то вошли в Сделать это с помощью SharpDx.
код ниже содержит некоторые вызовы внешней библиотеки, однако я думаю, что идея будет очень ясной.
как @δ γηράσκω' πολλά αεί διδασκόμε сказал, чтобы использовать WindowRenderTarget
Кажется, что мне нужно использовать его в моей собственной форме, и моя форма должна удовлетворять этим условиям:
- черный цвет фона.
- быть формой без границ.
- быть самым верхним окном (очевидно).
- оконная рама должна быть расширена в клиентскую область, вызвав DwmExtendFrameIntoClientArea