C# SharpDX、DirectWrite和Windows窗体
可以在WinForm应用程序中使用DirectWrite将文本渲染到PictureBox吗 我正在使用SharpDX,并且已经阅读了DirectWrite示例,试图构建最简单的工作案例 我创建了一个表单,只添加了一个pictureBox。然后输入以下代码。表单将显示,但在PictureBox中看不到任何内容 任何指导都将不胜感激 谢谢C# SharpDX、DirectWrite和Windows窗体,c#,winforms,sharpdx,C#,Winforms,Sharpdx,可以在WinForm应用程序中使用DirectWrite将文本渲染到PictureBox吗 我正在使用SharpDX,并且已经阅读了DirectWrite示例,试图构建最简单的工作案例 我创建了一个表单,只添加了一个pictureBox。然后输入以下代码。表单将显示,但在PictureBox中看不到任何内容 任何指导都将不胜感激 谢谢 using System; using System.Collections.Generic; using System.ComponentModel; usin
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);
}
}
}
实际上,您不希望使用HwnRenderTarget渲染“到PictureBox”。实际上,您希望渲染到PictureBox负责渲染的位图中。您可以通过创建一个“共享位图”(我不太熟悉SharpDX,但底层方法是ID2D1RenderTarget::CreateSharedBitmap())来实现这一点,将其渲染为该位图,然后在调用EndDraw()后使PictureBox无效.嗨,我有点像你的问题示例,但我最终设法解决了这个问题,因为我想独立开始编写游戏,所有的绘制方法都必须在
RenderTarget
类的beginDraw
和endDraw
方法中。您还需要实现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();
}
}
}
这将创建一个在左上角带有红方块的蓝色窗体。在窗口可见之前渲染任何内容都不会起作用。显示的事件是第一个引发以指示窗口可见的事件。改用绘画活动。谢谢你的帮助,汉斯。不幸的是。。。没有快乐。我在pictureBox和表单本身的绘制处理程序中调用Render(),没有任何更改。