2012-03-25 7 views
3

Можно ли сделать текст с помощью DirectWrite на PictureBox в приложении WinForm?SharpDX, DirectWrite и Windows Forms

Я использую SharpDX и прошел через образцы DirectWrite, пытаясь построить простейший рабочий корпус, который я могу.

Я создал форму и добавил к ней только изображение. Затем следующий код. Форма отображается, но ничего не видно с 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); 
    } 

} 
} 
+0

Оказание чего-либо перед видимым окном никогда не сработает. Событие Shown является первым, которое поднято, чтобы указать, что окно видно. Вместо этого используйте событие Paint. –

+0

Спасибо за помощь, Ханс. К сожалению ... нет радости. Я помещал вызовы в Render() в обработчике Paint как для pictureBox, так и для самой формы, и никаких изменений нет. – vocalionecho

ответ

6

Привет Я сортирую последовал вашему примеру вопрос, но я, наконец, удалось решить это, как я хотел бы, чтобы самостоятельно начать писать игры, все методы ничья должны быть в пределах beginDraw и endDraw методов RenderTarget класса. вам также необходимо реализовать класс 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(); 
     } 

    } 
} 

Это должно создать синюю форму с красным квадратом в верхнем левом углу.

1

Вы действительно не хотите отображать «в PictureBox» с помощью HwndRenderTarget. Вы действительно хотите отобразить в растровом изображении, что PictureBox выполняет работу по рендерингу. Вы можете сделать это, создав «общий растровый рисунок» (я не знаком с SharpDX специально, но базовый метод - ID2D1RenderTarget :: CreateSharedBitmap()), рендеринг в него и затем аннулирование PictureBox после вызова EndDraw().