2009-10-22 15 views

risposta

1

WPF è dotato di nuove funzionalità grafiche, è possibile indagare here, ma se si vuole utilizzare un vecchio GDI + API un modo per farlo è quello di creare Winform disegnare lì e ospitare in WPF

+0

Senza usare WinForms c'è un modo per usare il disegno GDI + usando la classe System :: Drawing :: Graphics? – Sreenath

+0

Puoi scrivere interop nativo usando dllimport su GDI + –

+0

Anche http://stackoverflow.com/questions/271686/c-transition-between-gdi-and-wpf questo post può aiutare –

-4

Questo è generalmente una cattiva idea. WPF è un'API completamente nuova e il mixaggio in GDI + può comportare prestazioni scadenti, perdite di memoria e altre cose indesiderate.

+3

Questa risposta non è ovviamente basata su alcuna esperienza reale con quelle tecnologie. –

9

Ci sono diversi modi per farlo, il più semplice sarebbe bloccare la tua Bitmap manipolata con GDI, ottenere il buffer di pixel (Scan0 IntPtr nel BitmapData che ottieni dal lucchetto). CopyMemory(...) dal buffer dei pixel a WriteableBitmap.BackBuffer.

Ci sono modi più performanti in WPF, come usare InteropBitmap invece di WriteableBitmap. Ma questo ha bisogno di più p/invocare.

1

@Jeremiah La soluzione di Morrill è ciò che faresti al centro. Tuttavia, Microsoft è stata abbastanza gentile da fornire alcuni metodi di interoperabilità:

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

Qual è lo spazio dei nomi 'Gdi'? Sembra che tu abbia aliasato 'System.Drawing' in' Gdi (cioè usando Gdi = System.Drawing) '- puoi confermare? –

+2

Aliasing System.Drawing to Gdi in questo esempio è una pessima idea poiché non si può semplicemente copiare e incollare il codice e aggiunge anche più confusione per i lettori. – CyberFox

Problemi correlati