Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > как сохранить форму в виде *.BMP?


Автор: Baloo 10.1.2006, 10:53
всем привет!

Клиент захотел сделать доку для проги. В частности меня просит сохранить все формы (порядка 200:))) в виде картинок (JPEG, BMP ... формат особой роли не играет). Собстно можно придумать способ вызвать все формы автоматически (не заполняя их данными) - но как потом сделать автоматом что то вроде "ALT + PrintScreen" (сохранить активное окно), да сохранить его в файл.

накопал вроде инфу, что можно создавать bitmap-ы самому и заполнять их с помощью функции BitBlt c
параметром dwRop=SRCCOPY.

Сам процесс еще не очень ясен, но наверно так:
1) есть MDI-формочка из которой я буду автоматом по очереди вызывать каждую форму
2) делать задержку и запускать процесс "Х", который будет "сохранять" активное окно
3) автоматом закрыть (разрушить) активное окно, чтобы можно было вызвать следущее

помогите плиз со след:
1) по первому пункту вопросов нет
2) как запускать этот процесс "Х" - отдельной прогой или как то, тут же после загрузки формы;
самое важное - увы не работал с BitBlt - т.е. дайте плиз пример
3) как разрушить окно - device context окна можно узнать вроде функцией GetDC? smile

пасиба, за то что дочитали все это до концаsmile
и еще одно спасибо заранее - за совет как это все организовать, и за конкректную помощь кодомsmile

с уважением
Baloo

Автор: Exception 10.1.2006, 11:02
Насчет принтскрина -- я когда-то пример давал. Как я помню, его просил Flotsky. Поищи как следует.

Автор: Akina 10.1.2006, 11:54
Можно воспользоваться Form.PrintForm. Решить вопрос печати в графический файл имхо не очень сложно - есть такие драйверы. Скажем http://www.fineprint.com/products/fineprint/index.html.

Автор: Exception 10.1.2006, 12:08
Да принтскрин в сто раз проще ведь )

Автор: Baloo 10.1.2006, 13:19
заслать форму в файл, похоже действительно не проблема, но как насчет оставшихся вопросов:

2) как запускать этот процесс "Х" - отдельной прогой или как то, тут же после загрузки формы;
3) как разрушить окно - device context окна можно узнать вроде функцией GetDC? smile

плиз, хэлп.

Автор: Akina 10.1.2006, 13:59
Цитата(Baloo @ 10.1.2006, 14:19 Найти цитируемый пост)

как запускать этот процесс "Х" - отдельной прогой или как то, тут же после загрузки формы;

Код

Sub Main()
' Это не код, а идея кода.
For Each OneForm In Forms
  With OneForm
    .Load
    .Show vbModeless, Me
    DoEvents
    .PrintForm
    DoEvents
    .Close
  End With
  OneForm.Unload
Next
End Sub

Цитата(Baloo @ 10.1.2006, 14:19 Найти цитируемый пост)

как разрушить окно

Не как, а зачем... Unload.

Автор: Baloo 10.1.2006, 15:45
спасибо, Акина, за твой вариант
я еще не ставил FinePrint, но судя по описанию он не позволит автоматом сохранять на локалке каждую засланную картинку под нужным именем (а без этого никак - клиенту будет больно не удобно копаться в куче безымянных картинок) - хотя это явно менее хлопотный вариант, но если не найдется другого решения - будем делать через API.

Exception, я нашел - за чем ты меня посылалsmile большой пасиб за полноценный проект!

З.Ы.
как здорово, что парни наконец то сделали RSS - можно вести пашти онлайн беседыsmile

Автор: Baloo 17.1.2006, 15:32
фактически тока сейчас взялся всерьез, и возник вопрос:
Цитата
Код

For Each OneForm In Forms    
  With OneForm    
    .Show vbModeless, Me    
    '......................................
  End With    
Next 

но коллекция Forms, как я понял, включает в себя только уже выведенные формы (т.е. к которым уже применен метод .Show).

Как же перебрать все формы, которые имеются в проекте еще до их отображения?

с уважением, Baloo

Автор: Akina 17.1.2006, 15:58
Цитата(Baloo @ 17.1.2006, 16:32 Найти цитируемый пост)

Как же перебрать все формы, которые имеются в проекте еще до их отображения?

никак. однако я не вижу сложностей - отпарси файл проекта и собери имена всех форм.

Автор: Baloo 17.1.2006, 16:17
действительно, сам не додумалсяsmile

хотя если просто так, для расширения кругозора:
если бы имена файлов с формами не совпадали бы с соответствующим Form.Name,то пришлось бы еще и сами файлы *.frm анализить и т.д. и т.п.
явно кривой способ, неужто реально нет более красивого способа?
хотя удивительно - у экземпляра проекта например Project1. после точки только список: форм, модулей и Main.
Добавлено @ 16:27
и пардон, как отобразить формуsmile даже если знаю ее имя?

пусть есть переменная strFormName = "Form1", я же не могу сказать Forms(strFormName).Load

Автор: cardinal 17.1.2006, 22:05
http://forum.vingrad.ru/index.php?showtopic=16767

Автор: Akina 17.1.2006, 23:43
Цитата(Baloo @ 17.1.2006, 17:17 Найти цитируемый пост)

явно кривой способ, неужто реально нет более красивого способа?

Красивый способ называется "прямое программирование". В смысле только как альтернатива кривому, а не что-то иное и великое.

Именование форм обязано быть системным. Скажем давать им имена Form_xxxx (где хххх - порядковый номер), причем без пропусков, или иным способом поддерживать их список... если уж очень хочется давать им женские имена, то есть Tag, есть Caption...
Кроме того, оно обязано быть документировано. То есть канву доки, которую ты сейчас со скрипом рожаешь, надо создавать параллельно с написанием самого приложения.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)