Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
Comanche

Сохранение "картинки" SysTreeView32 в графический файл

17.03.2010, 07:00. Показов 1547. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
ИМЕЕМ:
Есть некая 'чужая' программа. У неё есть 'Главное Окно'. В нём размещено 'дерево' - как показывает 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 дерево 'возвращается' в свою родную программу.

ЧТО ХОЧУ УЗНАТЬ:
а). Как решить эту задачку?
б). Верен ли описанный выше способ решения? Какие нужны корректировки? Какие нужны API? Каковы константы мессаджей?
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.03.2010, 07:00
Ответы с готовыми решениями:

Сохранение в графический файл
Здравствуйте дорогие друзья! помогите пожалуйста с задачей. У меня написан текст программы в Dev C++ который рисует график некоторой...

Сохранение картинки в файл
Здравствуйте, уважаемые форумчане. Сохраняю сжатую картинку в файл. Вот код: If Not IsNothing(picFoto.Image) Then ...

Сохранение картинки в файл
Здравствуйте, нужна помощь с сохранением картинки из окна pictureBox с помощью SaveFileDialog в C++/CLI, есть пример кода, но он на с# ...

13
Comanche
17.03.2010, 09:16
Нашёл тут какой-то 'кривой' пример:
http://www.vb-helper.com/howto_print_picturebox.html

Совсем не то, что нужно...
0 / 0 / 0
Регистрация: 26.08.2009
Сообщений: 89
22.03.2010, 12:53
Как мне кажется, ход мыслей верный.
0
Comanche
22.03.2010, 13:33
Да, но там всё равно есть пункты, помеченные вопросами, - т.е. мне неясно, можно ли это сделать, и если да, то как именно.
Comanche
22.03.2010, 19:16
Ни черта не получается.
Проблема в том, что у всех этих CreateCompatibleBitmap, BitBlt используются аргументы вызова nWidth и nHeight. Т.е. эти функции работают по определению только с тем, что сейчас видно на экране. Я без проблем превратил в BMP-картинку содержимое видимой части дерева, но вот добавить к этому НЕвидимую часть - не получается. Если я просто завышаю аргументы ширины и высоты, то в картинку попадают также куски окружающей дерево действительности.

Мешает отсутствие понимания глубинных механизмов графических API.
Да и подход, вероятно, неверный.
Comanche
22.03.2010, 19:31
Я вот писАл в самом начале:
'Понятно, что на экране это не поместится - да и чёрт с ним'

Вот это и есть неверное утверждение: то, что на экране не помещается, через все эти BitBlt никак не обработаешь!

Похоже, моя задача нерешаема в принципе (
pl
51 / 17 / 6
Регистрация: 18.05.2007
Сообщений: 1,322
22.03.2010, 20:43
Попробуй изменить программно разрешение, а затем вернуть его обратно.
0
Comanche
23.03.2010, 11:50
Чтобы влезло моё дерево полностью, надо ставить даже не 1024 на 768, а где-нибудь 6000 на 4500 )
Messir
23.03.2010, 13:20
А как насчет того, чтобы делать 'снимки' hdc дерева, лепить их в столбик в результирующий контекст, а потом посылать дереву сообщение типа PageDown. И так до конца.
К сожалению, это все лишь теория... На практике могут найтись 'подводные камни'...
pl
51 / 17 / 6
Регистрация: 18.05.2007
Сообщений: 1,322
23.03.2010, 13:51
Теоретически размер рабочего стола можно выставить каким угодно, взять хотя бы драйвера для современных видеокарт, позволяющих растягивать рабочий стол на два монитора...
Так что попробуй выставь большое разрешение, то что его не поддержит монитор не играет роли, тебе же надо программный скриншот делать.
0
Comanche
23.03.2010, 14:07
2Messir:
Увы, таким способом точно не состыкуешь! Если б можно было как-то получить доступ к коллекции узлов этого чужого дерева, то ещё можно было бы идти сверху вних по дереву, перебирая узлы, и по каждому определять (если такое возможно), видим ли он. Как только наталкиваемся на первый невидимый - запоминаем его номер в N, делаем снимок, перегоняем его в приёмник, затем последовательно посылаем 'скроллы вниз' дереву, пока узел номер N не станет невидимым опять - на этот раз уже за счёт того, что он уехал наверх, за пределы дерева. Делаем опять снимок, и т.д.

Даже ЕСЛИ БЫ это всё провернуть, то всё равно точно не состыкуешь куски картинки. Во-первых, как добраться до коллекции узлов? Во-вторых, 'дискрет' прокрутки не равен, конечно же, высоте узла. В-третьих, как приклеивать самый последний фрагмент, который, конечно же, не будет точно равен высоте дерева?

Не-е-е, это тоже тупиковый путь, хотя всё равно спасибо.
Тут если и есть решение, то какое-то хитрое...
Топик пока не закрываю - вдруг кто поможет?!
Comanche
23.03.2010, 14:16
2pl:
дерево может иметь реальную высоту в 1 экран, а может - и в 100 !
Не уверен, что я тут выкручусь вашим способом.
Да и гасить монитор нельзя - 'не поймут'.

Комментарий: дерево - это такой своеобразный ЯП (одной отечественной ИС), который не имеет кодирования в виде набора текста. Вместо этого, код создаётся манипуляциями с узлами дерева. Сформированный таким образом код может представлять собой огроменное дерево, когда все его узлы развёрнуты. Кому интересно, могу прислать скриншотик.

Хранится этот 'код', разумеется, не в виде картинки, и не в виде дерева, а двоично; дерево - лишь IDE у этого ЯП. Если есть проблема с кодом, то можно послать разработчику двоичный файл. Но иногда - при мелких задачах или при определённых технических ограничениях - удобнее послать просто картинку фрагмента дерева.
0 / 0 / 1
Регистрация: 19.10.2008
Сообщений: 173
24.03.2010, 09:10
Извиняюсь, но если будет получен доступ к узлам дерева, то почему бы не 'слить' его в текстовый файл? Или, еще лучше, в XML?
0
Comanche
25.03.2010, 14:55
2t-80:
Мне нужно посылать разработчику именно картинку: информативность узлов дерева не всегда определяется их текстом - также определённую роль играет и иконка узла. Если я им пошлю даже XML, то разбираться с этим никто не будет - слишком непохоже оно будет выглядеть на привычный всем код этого ЯП.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.03.2010, 14:55
Помогаю со студенческими работами здесь

Сохранение части картинки в файл
Собственно есть BufferedImage картинка и есть кнопка, при нажатии на которую должна сохраняться часть картинки. ...

Сохранение перевернутой картинки в файл
Доброго времени суток. Такая проблема. Работаю в WPF на vb.net. Открываю jpg файл, поворачиваю картинку на 90 градусов. как мне сохранить...

Сохранение картинки в txt файл
В компонент Image загружена картинка с помощью OpenFileDialog. Мне нужно эту картинку из Image сохранить в текстовый документ (txt файл)....

Сохранение картинки, нарисованной на форме, в файл
В общем, есть задача - открыть картинку на форме, как-нибудь изменить ее и сохранить снова в файл, используя OpenFileDialog &...

Макрос: сохранение картинки в файл и открытие для редактирования в Paint
Здравствуйте, хочу поделиться готовым макросом. Мне часто приходится редактировать картинки из документов Word - для этого нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru