2017-06-27 9 views
0

Ich möchte meine Swapchain auf dem Bildschirm verändern, indem ich die Größe meiner Windows-Formularanwendung ändere. Wenn ich das tue, ich brauche meine älteren Device, Puffer zu verfügen, Ziel etc ...Größenänderung der Swapchain bewirkt, dass Bitmap nicht verwendbar ist (SharpDX, directX)

Blick auf den Code unten:

Public Overrides Sub Resize(Width As Integer, Height As Integer) 
    m_backBuffer.Dispose() 
    m_d2dContext.Dispose() 
    m_2dTarget.Dispose() 


    m_swapChain.ResizeBuffers(2, Width, Height, Format.R8G8B8A8_UNorm, SwapChainFlags.None) 
    m_backBuffer = m_swapChain.GetBackBuffer(Of Surface)(0) 
    Dim properties As BitmapProperties = New BitmapProperties(New SharpDX.Direct2D1.PixelFormat(SharpDX.DXGI.Format.R8G8B8A8_UNorm, SharpDX.Direct2D1.AlphaMode.Premultiplied), 96, 96) 

    Dim dxgiDevice As SharpDX.DXGI.Device = m_device.QueryInterface(Of SharpDX.DXGI.Device)() 

    Dim d2dDevice As SharpDX.Direct2D1.Device = New SharpDX.Direct2D1.Device(dxgiDevice) 
    m_d2dContext = New SharpDX.Direct2D1.DeviceContext(d2dDevice, SharpDX.Direct2D1.DeviceContextOptions.None) 

    m_2dTarget = New SharpDX.Direct2D1.Bitmap(m_d2dContext, m_backBuffer, properties) 
    m_d2dContext.Target = m_2dTarget 

    CType(m_Context, GpuDrawingContext).setRenderTarget(m_d2dContext) 

End Sub 

Das Problem, wenn ich das tun, ist, dass die Bitmap hatte ich zuvor erstellt, um auf dem Bildschirm angezeigt zu werden benötigt einen DeviceContext als Parameter für ihre Erstellung. Jetzt, da ich einen neuen DeviceContext auf die Größenanpassung installiere, erhalte ich den Fehler WrongFactory, wenn ich die Bitmap auf dem deviceContext zeichnen möchte, da sie nicht mit demselben DeviceContext erstellt werden, von dem wir sie zeichnen wollen.

Irgendwelche Lösungen für die Größenänderungsfunktion?

Antwort

0

Ihr Code scheint grundsätzlich falsch zu sein. Wenn Sie mit der Größenänderung arbeiten, müssen Sie wirklich nichts außer ResizeBuffers aufrufen. Und Sie müssen auf keinen Fall m_d2dContext entsorgen, da Sie dies normalerweise für die gesamte Lebensdauer Ihrer Anwendung beibehalten. Der Rest des Codes gehören tatsächlich Rendering Frame, in der Regel bei jeder Iteration Sie wie folgt vor:

  • erhalten Backbuffer (beachten Sie, dass es nicht, weil nach jeder Präsens Swapkette zwischengespeichert werden sollen unterschiedliche Backbuffer Oberfläche zurückkehren)
  • D2D Bitmap-Objekt für Backbuffer Oberfläche
  • Entsorgen Backbuffer
  • Satz dieses D2D Bitmap-Objekt erstellen, wie targer des Kontextes D2D Gerät
  • Entsorgen D2D Bitmap machen (es ist immer noch am leben, wie es durch DC verwendet wird)
  • beginnen
  • ziehen ...
  • Ende zeichnen
  • Reset D2D Gerätekontext rendern Ziel
  • vorliegenden frischen Rahmen
zeichnen
Verwandte Themen