2010-08-19 2 views
1

В приложении WPF (C#) одним из элементов является окно Win32, созданное путем переопределения класса HwndHost. В WPF есть примерно 10 экземпляров этого окна Win32 в WPF. Нужно полностью отобразить (отлично работает), а другой 9 должен показывать только предварительные просмотры, не создавая окна Win32, просто растровое изображение.Окно Paint Win32 в файл

Я пытался найти способ генерации указанного растрового изображения. Пробовал много разных вещей, но пока ничего не было сделано. Основная проблема, с которой я сталкиваюсь, заключается в том, что HwndHost.WndProc вызывается только при видимом окне.

Я могу сделать снимок экрана из видимого окна, сделать его в памяти и создать растровое изображение. Мне просто нужно сделать какой-то способ, пока окно не видно.

Мое понимание все еще довольно нечеткое, поэтому оценивается любое понимание.

+0

Вы говорите, что HwndHost.WndProc вызывается только тогда, когда окно отображается на экране или только после того, как окно было показано на экране хотя бы один раз? Вероятно, дескриптор окна не создается до первого показа окна. Если окно (или его родительское) скрыто или сведено к минимуму после его показа, вы все равно должны получать сообщения в wndproc. – dthorpe

+0

Пока окно не появится на экране в первый раз. Можно ли нарисовать это окно в памяти до его отображения? Или, возможно, обходной путь будет появляться в новом окне, Show(); Скрыть(); Тогда попытайтесь нарисовать? – mkocubinski

+0

Оставьте теги типа «C#» в тегах и не используйте их. Это избыточно. –

ответ

4

Вы можете принудить окно рисовать в растровое изображение, моделируя сообщение WM_PAINT. Вам нужно будет настроить DC памяти и выбрать в нем растровое изображение адресата, а затем передать этот дескриптор DC в качестве аргумента в сообщении с краской. См. Спецификацию MSDN docs.

Как только арги все готовы к рулону, сделайте SendMessage (HwndHost.Handle, WM_PAINT и т. Д. И т. Д.). Когда этот вызов возвращается, растровое изображение должно содержать изображение окна.

Обратите внимание, что для полного рисования всего окна требуется много сообщений. Общая схема:

  1. Неверьте всю клиентскую область окна. В противном случае ничего не будет нарисовано, потому что клип rect будет пустым.
  2. Настройка растровой памяти в памяти DC
  3. Отправить сообщение WM_ERASEBKGND к оконной ручке, проходящая в постоянной памяти обрабатывать
  4. Отправить сообщение WM_PAINT к оконной ручке, проходящая в постоянной памяти обрабатывать

Изображение окна должно теперь быть в растровом изображении.

Если вы хотите захватить рамку, рамку окна и заголовок окна целевого окна, вам нужно будет имитировать сообщение с неклиентской краской: WM_NCPAINT является основным, с верхней части головы.

Существует также сообщение WM_PRINT, которое якобы помогает при рисовании в память постоянного тока, предназначенного для печати, но у меня были проблемы с несколькими версиями Windows назад. Ребенок контролирует не рисовать себя и т.д.

+0

Спасибо, это направление, которое я начал собирать прошлой ночью. Читая это сейчас, это еще более ясно. Очень подробно, спасибо вам большое! – mkocubinski

0

Посмотрите на графическую технику «двойной буферизации». Как только вы поймете эту технику - это не сложно - у вас будет решение вашей проблемы. По моему мнению. :-)

Ссылки:

Win32 Double Buffering

O

MSDN Double Buffering дробит»Ссылки

WinForms Double Buffering Найдено через Google - Неизвестный Качество

0

Я не знаю, как это работает в C# с WPF , поэтому я просто дам вам перспективу Windows API и надеюсь, что некоторые из них приведут вас к решению.

Все чертежи выполняются в контексте устройства (DC). Когда Windows попросит вас покрасить окно, оно также даст вам доступ к DC, соответствующему выталкиваемой поверхности окна.

Чтобы рисовать без окна, вам необходимо создать свой собственный постоянный ток, и, поскольку биты не идут в окно, вам нужно выбрать растровое изображение в DC, чтобы удерживать результаты. В Windows API вы должны использовать CreateCompatibleDC и SelectObject. Когда у вас есть DC, вы рисуете в нем как обычно, затем отмените выбор растрового изображения.

Смежные вопросы