Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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  

Номер ответа: 1
Автор ответа:
 Александр



Разработчик Offline Client

ICQ: 204034 

Вопросов: 106
Ответов: 1919
 Профиль | | #1 Добавлено: 13.01.04 20:13

Где-то в недрах этого сайта был один такой хороший-прихороший исходник снятия скриншотов с контролов, форм, и других объектов. Надеюсь понял тебя верно...

Ответить

Номер ответа: 2
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #2 Добавлено: 13.01.04 22:15

Подобный код видел. Не здесь - где-то на других форумах (в частности, по-моему, на VbAccelerator.com, в разделе "API"). Там везде через BitBlt, с её ограничениями. А как быть, если дерево видно не всё? или всё, но на контейнере, который уже вышел за пределы экрана? Все эти BitBlt и CreateCompatibleBitmap или обрубят, чё не влезло, или наоборот, "приклеят" соседний кусок... Или я просто не знаю хитростей работы с ними.

Или вообще моя задача не решаема - по крайней мере, таким описанным примерным способом. Т.е. грубо говоря, если окажется, что Drawing Context (DC) - это по определению видимая часть, то способ неверен...

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам