Можно ли получить HDC из окна WPF, чтобы я мог рисовать на нем с помощью Gdi + API? - PullRequest
5 голосов
/ 28 декабря 2011

У меня есть библиотека, которая использует HDC с использованием GDI + apis.Я хочу использовать это в приложении WPF.Я попытался получить дескриптор класса WindowInteropHelper и передать его в библиотечный метод, который выполняет рисование.Однако это происходит просто потому, что он не может создать Gdi + Graphics из этого дескриптора.

Затем я попытался использовать элемент WinForm в WindowsFormsHost элементе управления и использовать HDC, доступный в событии рисования элемента управления WinForm, и это сработалохорошо.Я хочу знать, можно ли сделать то же самое, чтобы работать непосредственно с WPF control \ window?Есть ли какой-то другой способ получить HDC из элементов WPF, на которых можно использовать API рисования GDI?

1 Ответ

6 голосов
/ 28 декабря 2011

Если у вас есть дескриптор окна (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 объекта после того, как вы закончите с ним, чтобы высвободить связанные с ним ресурсы.

...