2009-10-22 11 views

Respuesta

1

WPF viene con nuevas características de gráficos, puede investigar here, pero si desea utilizar una vieja API de GDI + una forma de hacerlo es crear Winform dibujar allí y alojarlo en WPF

+0

Sin usar WinForms, ¿hay alguna forma de usar el dibujo GDI + utilizando la clase System :: Drawing :: Graphics? – Sreenath

+0

Puede escribir interoperabilidad nativa usando dllimport a GDI + –

+0

También http://stackoverflow.com/questions/271686/c-transition-between-gdi-and-wpf esta publicación puede ayudar –

-4

Este generalmente es una mala idea WPF es una API completamente nueva y la mezcla en GDI + puede dar como resultado un bajo rendimiento, pérdidas de memoria y otras cosas indeseables.

+3

Esta respuesta obviamente no se basa en ninguna experiencia real con esas tecnologías. –

9

Hay varias maneras de hacerlo, lo más fácil sería bloquear el mapa de bits manipulado con GDI, obtener el buffer de píxeles (Scan0 IntPtr en el BitmapData que obtiene del bloqueo). CopyMemory(...) de su memoria tampón de píxeles a WriteableBitmap.BackBuffer.

Hay formas más efectivas en WPF, como usar InteropBitmap en lugar de WriteableBitmap. Pero eso necesita más p/invoke.

1

@Jeremiah La solución de Morrill es lo que harías en el núcleo. Sin embargo, Microsoft fue lo suficientemente bueno como para proporcionar algunos métodos de interoperabilidad:

using System.Windows.Interop; 
using Gdi = System.Drawing; 

using (var tempBitmap = new Gdi.Bitmap(width, height)) 
{ 
    using (var g = Gdi.Graphics.FromImage(tempBitmap)) 
    { 
     // Your GDI drawing here. 
    } 

    // Copy GDI bitmap to WPF bitmap. 
    var hbmp = tempBitmap.GetHbitmap(); 
    var options = BitmapSizeOptions.FromEmptyOptions(); 
    this.WpfTarget.Source = Imaging.CreateBitmapSourceFromHBitmap(hbmp, 
     IntPtr.Zero, Int32Rect.Empty, options); 
} 

// Redraw the WPF Image control. 
this.WpfTarget.InvalidateMeasure(); 
this.WpfTarget.InvalidateVisual(); 
+2

¿Cuál es el espacio de nombres 'Gdi'? Parece que tiene un alias 'System.Drawing' a' Gdi (es decir, usando Gdi = System.Drawing) '- ¿puede confirmar? –

+2

Aliasing System.Drawing a Gdi en este ejemplo es una muy mala idea ya que no se puede simplemente copiar y pegar el código y también agrega más confusión para los lectores. – CyberFox

Cuestiones relacionadas