Можно ли получить HDC из окна WPF, чтобы я мог рисовать на нем с помощью Gdi+ API?
У меня есть библиотека, которая опирается на данный HDC, используя GDI+ apis. Я хочу использовать это в приложении WPF. Я попытался получить дескриптор из класса WindowInteropHelper и передать его в библиотечный метод, который выполняет рисование. Однако он терпит неудачу просто потому, что не может создать Gdi+ Graphics из этого дескриптора.
Затем я попытался использовать элемент WinForm в элементе управления WindowsFormsHost и использовать HDC, доступный в событии рисования элемента управления WinForm, и он работал нормально. Я хочу знать, можно ли сделать то же самое, чтобы работать напрямую с WPF control\window? Есть ли какой-то другой способ получить HDC из элементов WPF, на которых можно использовать GDI draw apis?
1 ответ
Если у вас есть дескриптор окна (HWND
) вашего окна WPF, предположительно полученного с помощью WindowInteropHelper
класс, то вы можете легко получить дескриптор к контексту устройства (HDC
) для этого окна.
Есть два способа добиться этого, хотя оба в конечном итоге делают одно и то же. Первый - это P/Invoke необходимых функций API GDI+, но мы можем исключить это довольно быстро, так как это излишне отнимает много времени. Помните, что.NET Framework уже оборачивает все это для разработки WinForms в System.Drawing
пространство имен, и, в частности, Graphics
класс Так что все, что вам нужно сделать, это добавить ссылку на System.Drawing
в ваше приложение WPF, и вы получите все эти функциональные возможности бесплатно.
То, что вас интересует, это Graphics.FromHwnd
метод, который создает новый Graphics
объект из указанного дескриптора окна (HWND
).
Получив это, вы можете получить дескриптор контекста устройства (HDC
) позвонив Graphics.GetHdc
метод, который возвращает именно то, что вы ищете - IntPtr
значение, которое представляет дескриптор контекста устройства.
Помните, что вам нужно позвонить Dispose
метод на вашем Graphics
объект после того, как вы закончили с ним, чтобы освободить связанные с ним ресурсы.