2009-10-22 98 views
6

我想在我的WPF控件中使用GDI +繪圖。如何在WPF中使用GDI +繪圖?

+0

任何原因爲什麼?我很想知道 – moogs 2009-10-22 04:42:50

+5

的表現。在繪製大量線條和形狀時,GDI比WPF快得多 – 2011-12-23 11:02:44

回答

1

WPF配備了新的圖形功能,您可以調查它here,但如果你想使用舊的GDI + API做的一個方法是創建WinForm的畫有和主機成WPF

+0

如果不使用WinForms,有什麼辦法可以使用System :: Drawing :: Graphics類來使用GDI +繪圖? – Sreenath 2009-10-22 06:35:05

+0

你可以使用dllimport編寫原生互操作到GDI + – 2009-10-22 07:49:25

+0

同時http://stackoverflow.com/questions/271686/c-transition-between-gdi-and-wpf這篇文章可以幫助 – 2009-10-22 08:05:57

-4

這通常是一個糟糕的主意。 WPF是一個全新的API,並且在GDI +中混合可能會導致性能下降,內存泄漏和其他不合需要的事情。

+3

這個答案顯然不是基於任何真實的經驗與這些技術。 – 2014-06-20 14:22:43

9

有幾種方法可以做到這一點,最簡單的方法是鎖定您使用GDI操作的位圖,獲取像素緩衝區(Scan0 IntPtr位於從鎖中獲取的BitmapData中)。 CopyMemory(...)從你的像素緩衝區到WriteableBitmap.BackBuffer

WPF中有更多的高性能方式,如使用InteropBitmap而不是WriteableBitmap。但是這需要更多的p/invoke。

1

@Jeremiah Morrill的解決方案就是你要做的核心。但是,微軟提供了一些互操作方法:

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

什麼是Gdi命名空間?它看起來像你有'System.Drawing'別名'Gdi(即使用Gdi = System.Drawing)' - 你能確認嗎? – 2014-11-11 14:01:29

+2

別名系統。在這個例子中繪製到Gdi是一個非常糟糕的主意,因爲你不能複製和粘貼代碼,它也增加了讀者的困惑。 – CyberFox 2016-05-20 02:57:49