SharpDX,DirectWrite和Windows Forms

可以使用DirectWrite将文本渲染到WinForm应用程序中的PictureBox吗?

我正在使用SharpDX,并且已经通过DirectWrite示例试图构建我能做到的最简单的工作案例。

我创建了一个Form并且只添加了一个pictureBox。 然后是以下代码。 表单显示,但PictureBox没有任何可见。

任何指导将不胜感激。

谢谢!

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; //using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using SharpDX.Direct2D1; using SharpDX.DXGI; using SharpDX; using SharpDX.DirectWrite; using AlphaMode = SharpDX.Direct2D1.AlphaMode; using Factory = SharpDX.Direct2D1.Factory; namespace d2dwTextEdit { public partial class Form1 : Form { public Factory Factory2D { get; private set; } public SharpDX.DirectWrite.Factory FactoryDWrite { get; private set; } public WindowRenderTarget RenderTarget2D { get; private set; } public SolidColorBrush SceneColorBrush { get; private set; } public TextFormat TextFormat { get; private set; } public SharpDX.RectangleF ClientRectangle { get; private set; } public Form1() { InitializeComponent(); Initialize(); Render(); } protected void Initialize() { Factory2D = new SharpDX.Direct2D1.Factory(); FactoryDWrite = new SharpDX.DirectWrite.Factory(); HwndRenderTargetProperties properties = new HwndRenderTargetProperties(); properties.Hwnd = pictureBox1.Handle; properties.PixelSize = new System.Drawing.Size(pictureBox1.Width, pictureBox1.Height); properties.PresentOptions = PresentOptions.None; TextFormat = new TextFormat(FactoryDWrite, "Calibri", 30) { TextAlignment = TextAlignment.Center, ParagraphAlignment = ParagraphAlignment.Center }; RenderTarget2D = new WindowRenderTarget(Factory2D, new RenderTargetProperties(new PixelFormat(Format.Unknown, AlphaMode.Premultiplied)), properties); RenderTarget2D.AntialiasMode = AntialiasMode.PerPrimitive; RenderTarget2D.TextAntialiasMode = TextAntialiasMode.Cleartype; ClientRectangle = new RectangleF(0, 0, pictureBox1.Width, pictureBox1.Height); SceneColorBrush = new SolidColorBrush(RenderTarget2D, Colors.White); SceneColorBrush.Color = Colors.Black; } private void Render() { RenderTarget2D.Clear(Colors.White); RenderTarget2D.DrawText("Hello Marshall", TextFormat, ClientRectangle, SceneColorBrush); } } } 

嗨,我跟着你的问题例子,但我终于设法解决了,因为我想独立开始编写游戏,所有的绘制方法都必须在RenderTarget类的beginDrawendDraw方法中。 您还需要实现RenderLoop类,这将为您提供回调循环委托。 抱歉我的代码粗糙。

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using SharpDX.Direct3D; using SharpDX.Direct2D1; using System.Text; using System.Windows.Forms; using System.Drawing; using SharpDX.DXGI; using SharpDX; using SharpDX.Windows; using System.Globalization; using SharpDX.DirectWrite; namespace dx11 { public partial class Form1 : Form { private SharpDX.Direct3D10.Device _mDevice = null; WindowRenderTarget wndRender = null; SharpDX.Direct2D1.Factory fact = new SharpDX.Direct2D1.Factory(SharpDX.Direct2D1.FactoryType.SingleThreaded); SolidColorBrush scenebrush; RenderTargetProperties rndTargProperties; HwndRenderTargetProperties hwndProperties; SharpDX.Windows.RenderForm form = new RenderForm(); RenderLoop.RenderCallback callback; public Form1() { InitializeComponent(); SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true); form.Width = 600; form.Height = 600; test(); callback = new RenderLoop.RenderCallback(Render); RenderLoop.Run(form, callback); } private void test() { rndTargProperties = new RenderTargetProperties(new PixelFormat(Format.B8G8R8A8_UNorm, AlphaMode.Premultiplied)); hwndProperties = new HwndRenderTargetProperties(); hwndProperties.Hwnd = form.Handle; hwndProperties.PixelSize = new SharpDX.DrawingSize(form.ClientSize.Width, form.ClientSize.Height); hwndProperties.PresentOptions = PresentOptions.None; wndRender = new WindowRenderTarget(fact, rndTargProperties, hwndProperties); scenebrush = new SolidColorBrush(wndRender, Colors.Red); // scenebrush.Color = Colors.Cornsilk; form.Show(); } public void Render() { wndRender.BeginDraw(); wndRender.Clear(Colors.DarkBlue); wndRender.DrawRectangle(new SharpDX.RectangleF(10, 10, 50, 50), scenebrush, 2.00F); wndRender.Flush(); wndRender.EndDraw(); } } } 

这应该会创建一个蓝色的表单,左上角有一个红色方块。

您实际上并不想使用HwndRenderTarget渲染“进入PictureBox”。 实际上,您希望将PictureBox渲染到Bitmap中。 你可以通过创建一个“共享位图”(我不熟悉SharpDX,但底层方法是ID2D1RenderTarget :: CreateSharedBitmap()),渲染到它,然后在调用EndDraw()后使PictureBox无效。