private void InitializeRenderTarget() { if (dcRenderTarget == null) { var props = new RenderTargetProperties { PixelFormat = new PixelFormat( Microsoft.WindowsAPICodePack.DirectX.Graphics.Format.B8G8R8A8UNorm, AlphaMode.Ignore), Usage = RenderTargetUsages.GdiCompatible }; dcRenderTarget = d2DFactory.CreateDCRenderTarget(props); brush = dcRenderTarget.CreateSolidColorBrush( new ColorF( ForeColor.R / 256f, ForeColor.G / 256f, ForeColor.B / 256f, 1)); } }
private void SetRenderMode(RenderModes rm) { lock (renderSyncObject) { renderMode = rm; if (!IsInitialized && !isInitializing) { return; } //clean up objects that will be invalid after RenderTarget change if (dcRenderTarget != null) { dcRenderTarget.Dispose(); dcRenderTarget = null; } if (hwndRenderTarget != null) { hwndRenderTarget.Dispose(); hwndRenderTarget = null; } if (bitmapRenderTarget != null) { bitmapRenderTarget.Dispose(); bitmapRenderTarget = null; } peelings.Clear(); bitmap = null; //the bitmap created in dc render target can't be used in hwnd render target // Create the screen render target var size = new SizeU((uint)ClientSize.Width, (uint)ClientSize.Height); var props = new RenderTargetProperties { PixelFormat = new PixelFormat( Format.B8G8R8A8UNorm, AlphaMode.Ignore), Usage = RenderTargetUsages.GdiCompatible }; if (renderMode == RenderModes.DCRenderTarget || renderMode == RenderModes.BitmapRenderTargetOnPaint) { dcRenderTarget = d2DFactory.CreateDCRenderTarget(props); if (renderMode == RenderModes.BitmapRenderTargetOnPaint) { bitmapRenderTarget = dcRenderTarget.CreateCompatibleRenderTarget( CompatibleRenderTargetOptions.GdiCompatible, new Microsoft.WindowsAPICodePack.DirectX.Direct2D1.SizeF(ClientSize.Width, ClientSize.Height)); } render = null; } else { hwndRenderTarget = d2DFactory.CreateHwndRenderTarget( props, new HwndRenderTargetProperties(Handle, size, Microsoft.WindowsAPICodePack.DirectX.Direct2D1.PresentOptions.RetainContents)); if (renderMode == RenderModes.BitmapRenderTargetRealTime) { bitmapRenderTarget = hwndRenderTarget.CreateCompatibleRenderTarget( CompatibleRenderTargetOptions.GdiCompatible, new Microsoft.WindowsAPICodePack.DirectX.Direct2D1.SizeF(ClientSize.Width, ClientSize.Height)); } render = RenderSceneInBackground; } //move all shapes to new rendertarget and refresh foreach (var shape in drawingShapes) { shape.Bitmap = Bitmap; shape.RenderTarget = RenderTarget; } RefreshAll(); } }