Есть ли способ захватить растровое изображение из окна WPF, используя родной C ++? - PullRequest
2 голосов
/ 09 апреля 2010

Представьте окно документа в приложении MDI, которое содержит дочернее окно WPF, например, боковую панель. Как получить растровое изображение, содержащее как пиксели WPF, так и пиксели GDI (не wpf)?

Я обнаружил, что при предварительном просмотре миниатюр значка приложения на панели задач Win7 я чернею в тех частях предварительного просмотра, где должны быть пиксели WPF. Мой текущий метод просто захватывает растровое изображение окна документа. Затем я получаю DC для предварительного просмотра, делаю из него DC памяти и выбираю в него свое растровое изображение. Затем я делаю некоторые корректировки размера и помещаю постоянный ток памяти в реальный постоянный ток. Я предполагаю, что операция BitBlt не принимает во внимание тот факт, что пиксели WPF имеют аппаратное ускорение и поэтому должны быть извлечены из графического оборудования. Все вещи в GDI управляются просто отлично, хотя и когда нет дочерних окон WPF, изображение для предварительного просмотра выглядит отлично.

Мне интересно, возможно ли вообще получить растровое изображение окна WPF из нативного C ++. Затем я могу добавить это в черную область предыдущего предварительного просмотра.

Ответы [ 2 ]

0 голосов
/ 09 июня 2010

Чтобы решить эту проблему, мне пришлось создать абстрактный класс в нативном коде, содержащий виртуальный метод, чтобы получить растровое изображение, реализованное в C ++ / CLI. В управляемой реализации я использовал класс .NET RenderTargetBitmap для получения растрового захвата окна WPF, а затем заполнил переданный объект CBitmap (см. Как получить структуру BITMAP из RenderTargetBitmap в C ++ / CLI ). В подпрограмме неуправляемого вызывающего абонента я использовал виртуальный метод для получения растрового изображения.

Короче говоря, не было никакого способа получить растровое изображение, просто используя неуправляемый C ++, поскольку WPF и GDI действительно не работают вместе для всех практических целей.

0 голосов
/ 09 апреля 2010

Может быть, я не правильно понимаю ваш текущий подход, но не могли бы вы сделать BitBlt() с экрана DC на DC памяти?Вам нужно получить прямоугольник экрана вашего окна, но это не должно быть слишком плохо.

...