Как использовать рисунок GDI+ в WPF?

Я хочу использовать рисунок GDI+ в своем элементе управления WPF.


person Sreenath    schedule 22.10.2009    source источник
comment
какие-либо причины, почему? я хотел бы знать   -  person moogs    schedule 22.10.2009
comment
Представление. GDI намного быстрее, чем WPF, рисует большое количество линий, форм и   -  person Dr. Andrew Burnett-Thompson    schedule 23.12.2011


Ответы (5)


Есть несколько способов сделать это, самый простой — заблокировать растровое изображение, которым вы манипулировали с помощью GDI, получить пиксельный буфер (Scan0 IntPtr в BitmapData, который вы получаете от блокировки). CopyMemory(...) из пиксельного буфера в WriteableBitmap.BackBuffer.

В WPF есть более эффективные способы, например использование InteropBitmap вместо WriteableBitmap. Но для этого нужно больше p/invoke.

person Jeremiah Morrill    schedule 22.10.2009

Попробуйте скомпоновать пользовательский элемент управления Windows Form в своем проекте WPF и инкапсулировать в него рисунок GDI+. См. Пошаговое руководство. Размещение пользовательского элемента управления Windows Forms с помощью конструктора WPF

person John K    schedule 22.10.2009
comment
Можно ли без использования WinForms использовать рисование GDI+ с помощью класса System::Drawing::Graphics? - person Sreenath; 22.10.2009

WPF поставляется с новыми графическими функциями, вы можете ознакомиться с ними здесь, но если вы хотите использовать старый GDI+ API, один из способов сделать это — создать там отрисовку Winform и разместить ее в WPF.

person Arsen Mkrtchyan    schedule 22.10.2009
comment
Можно ли без использования WinForms использовать рисование GDI+ с помощью класса System::Drawing::Graphics? - person Sreenath; 22.10.2009
comment
Вы можете написать собственное взаимодействие, используя dllimport для GDI+. - person Arsen Mkrtchyan; 22.10.2009
comment
Также stackoverflow.com/questions/271686/ этот пост может помочь - person Arsen Mkrtchyan; 22.10.2009

Решение @Jeremiah Morrill - это то, что вы сделали бы в основе. Тем не менее, Microsoft была достаточно любезна, чтобы предоставить некоторые методы взаимодействия:

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();
person TheCloudlessSky    schedule 18.10.2011
comment
Что такое пространство имен Gdi? Похоже, вы изменили псевдоним System.Drawing на Gdi (i.e. using Gdi = System.Drawing). Вы можете это подтвердить? - person RB.; 11.11.2014
comment
Псевдоним System.Drawing для Gdi в этом примере — довольно плохая идея, так как вы не можете просто скопировать и вставить код, а это еще больше запутает читателей. - person CyberFox; 20.05.2016
comment
Есть ли причина для псевдонима пространства имен? Есть ли у Bitmap другие реализации? - person Gregory William Bryant; 07.07.2020

Это вообще плохая идея. WPF — это совершенно новый API, и смешивание с GDI+ может привести к снижению производительности, утечкам памяти и другим нежелательным явлениям.

person Alastair Pitts    schedule 22.10.2009
comment
Этот ответ, очевидно, не основан на каком-либо реальном опыте работы с этими технологиями. - person Doc Brown; 20.06.2014