Получение растрового изображения / DC MDI-форм с вкладками

#winforms #winapi #gdi

#winforms #winapi #gdi

Вопрос:

У меня есть набор форм, которые визуализируются как дочерние вкладки MDI основной формы (через Infragistics UltraTabbedMDIManager, но этот API не так важен)

Я использую GetDC(), CreateCompatibleDC(), CreateCompatibleBitmap(), SelectObject(), BitBlt() .. для переноса растрового изображения контекстов устройств этих форм в некоторую память. Это работает, но только для активной дочерней формы MDI, той, которая видна пользователю. Если я делаю это для форм, которые не активны (любые вкладки, которые в данный момент не отображаются), я получаю черный экран в области памяти или даже «копию» экрана, который находится над ним. Если я делаю это для форм, которые больше не видны, я также получаю черный экран.

Что я должен сделать, чтобы получить растровое изображение этих скрытых форм? Должен ли я прибегать к кэшированию или есть какой-то другой трюк, который я могу использовать? Я не могу использовать функцию Winforms DrawToBitmap(), потому что формы содержат некоторые низкоуровневые графические элементы, которые не могут быть извлечены с ее помощью. Как я могу использовать winapi для получения bitmap DC этих «скрытых» форм?

Комментарии:

1. На ваш точный вопрос нет простого ответа. Что именно вам нужно нарисовать? Содержимое, полная форма, …

2. Смотрите мой собственный ответ ниже. Кстати, я не согласен с тем, что характер отображаемого содержимого имеет какое-либо отношение.

Ответ №1:

Мне удалось сделать это с помощью PrintWindow API в user32.dll. Это решает проблему вкладок MDI, однако это не решило проблему скрытых форм. Я решил эту проблему, кратко отобразив формы в каком-нибудь месте за пределами экрана. Кажется, «окончательный» способ — использовать (недокументированный) dwm.dll , но это не очень желательно, поскольку интерфейсы различаются в разных версиях Windows.