Страница: 1 |
|
Вопрос: Сохранение "картинки" SysTreeView32 в графическ...
|
Добавлено: 13.01.04 20:06
|
|
Автор вопроса: Comanche
|
ИМЕЕМ: Есть некая "чужая" программа. У неё есть "Главное Окно". В нём размещено "дерево" - как показывает Spy++, оно относится к классу "SysTreeView32". Это почти то же самое, что TreeView из пакета MS Windows Common Controls. Дерево имеет высоту, ограниченную высотой своего контейнера - т.е. Главного Окна. Назовём эту высоту "Видимой Высотой" дерева. Содержимое дерева велико - оно не помещается в Видимую Высоту никак. В итоге, дерево всегда имеет вертикальный скролл-бар. Введём ещё одно словечко: "Реальная Высота" - это высота, которая могла БЫ быть у дерева, не испытывай оно ограничений в виде Видимой Высоты - т.е. развернись оно вниз "на всю катушку".
ЗАДАЧА: Сохранить всё содержимое дерева (т.е. в пределах Реальной Высоты) в графический файл (BMP, GIF, ... - неважно).
КАК ДЕЛАЕТСЯ СЕЙЧАС: Делается ряд скриншотов Главного Окна (Alt+PrintScreen), затем они "склеиваются" вручную в каком-нибудь Фотошопе. Тот ещё геморрой; кто такое делал - знает. Например, если Реальная Высота больше Видимой в 20 раз, то надо сделать 20 скриншотов.
КАК ПРИМЕРНО ВИДИТСЯ РЕШЕНИЕ: 1. Определяется хэндл дерева (это разбивается на ряд последовательных шагов, которые тут опускаю). 2. Через API (?) определяется Реальная Высота дерева. 3. Создаётся своя форма с высотой, равной Реальной Высоте дерева. Понятно, что на экране это не поместится. 4. Через SetParent дерево сажается на эту форму, и затем ему (?) посылается сообщение "установить высоту" - есс-сно, в Реальную Высоту. 5. Рядом на форму сажается PictureBox с той же высотой. 6. Определяется HDC дерева. 7. Через какую-то API (?), использующую HDC источника и приёмника, делается "копирование" картинки дерева в пикчербокс. 8. PictureBox.SavePicture ... 9. Через SetParent дерево "возвращается" в свою родную программу.
ЧТО ХОЧУ УЗНАТЬ: Как решить эту задачку? BitBlt для пункта 7 не подходит - она может копировать только ту часть дерева, которая умещается на экране.
Ответить
|
Номер ответа: 2 Автор ответа: Comanche
Вопросов: 87 Ответов: 459
|
Профиль | | #2
|
Добавлено: 13.01.04 22:15
|
Подобный код видел. Не здесь - где-то на других форумах (в частности, по-моему, на VbAccelerator.com, в разделе "API"). Там везде через BitBlt, с её ограничениями. А как быть, если дерево видно не всё? или всё, но на контейнере, который уже вышел за пределы экрана? Все эти BitBlt и CreateCompatibleBitmap или обрубят, чё не влезло, или наоборот, "приклеят" соседний кусок... Или я просто не знаю хитростей работы с ними. Или вообще моя задача не решаема - по крайней мере, таким описанным примерным способом. Т.е. грубо говоря, если окажется, что Drawing Context (DC) - это по определению видимая часть, то способ неверен...
Ответить
|
Страница: 1 |
Поиск по форуму