如何在WPF中使用GDI +绘图?

时间:2009-10-22 04:34:18

标签: wpf graphics gdi+

我想在WPF控件中使用GDI +绘图。

5 个答案:

答案 0 :(得分:9)

有几种方法可以做到这一点,最简单的方法是锁定你用GDI操纵的Bitmap,得到像素缓冲区(你从锁中得到的BitmapData中的Scan0 IntPtr)。从像素缓冲区到CopyMemory(...)WriteableBitmap.BackBuffer

WPF中有更多高效的方法,比如使用InteropBitmap而不是WriteableBitmap。但这需要更多的p / invoke。

答案 1 :(得分:2)

尝试在WPF项目中合成Windows窗体用户控件并在其中封装GDI +绘图。 见Walkthrough: Hosting a Windows Forms User Control by Using the WPF Designer

答案 2 :(得分:2)

WPF附带了新的图形功能,您可以对其进行调查here,但是如果您想使用旧的GDI + API,一种方法是在那里创建Winform并将其托管到WPF中

答案 3 :(得分: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();

答案 4 :(得分:-4)

这通常是一个坏主意。 WPF是一个全新的API,混合使用GDI +可能会导致性能不佳,内存泄漏和其他不良内容。