Сохранить Picturebox в файл

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
David
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 10.03.2004 (Ср) 20:41
Откуда: FRANCE

Сохранить Picturebox в файл

Сообщение David » 19.07.2018 (Чт) 23:27

Добрый день или вечер,
Я честно искал в форуме и в интернете, кое-что нашел, но признаюсь ничего не понял
На форме есть Picturebox в котором помешены некоторые элементы (Share, Label, Image). ну и в добавок рисую, ну например линию.
Цель, сохранить все это в файле, ну например, формата .bmp

Код: Выделить всё
Private Sub Form_Load()
  Picture1.AutoRedraw = True: Picture1.DrawWidth = 3
  Picture1.Line (200, 200)-(900, 900), vbRed
End Sub

Private Sub Command1_Click()
  Picture1.PaintPicture Image1.Picture, Image1.Left, Image1.Top
 
  Picture1.Picture = Picture1.Image: Picture1.Refresh: DoEvents
  SavePicture Picture1.Picture, "F:\Test.bmp"
End Sub

Линия и картинка сохраняются, а вот Share и Label нет
Подскажите, пожалуйста, как сохранить все элементы
Заранее благодарен
Форма в прилагаемом вложении
Вложения
PictureTest.zip
(1.34 Кб) Скачиваний: 138

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Сохранить Picturebox в файл

Сообщение The trick » 20.07.2018 (Пт) 12:23

PrintWindow
UA6527P

David
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 10.03.2004 (Ср) 20:41
Откуда: FRANCE

Re: Сохранить Picturebox в файл

Сообщение David » 20.07.2018 (Пт) 12:43

Я, конечно, извиняюсь за свою не грамотность, но это что такое PrintWindow ?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Сохранить Picturebox в файл

Сообщение Mikle » 20.07.2018 (Пт) 15:51

PrintWindow - API функция, на форуме неоднократно обсуждалась. Задаётся так:
Код: Выделить всё
Private Declare Function PrintWindow Lib "User32.dll" (ByVal hwnd As Long, ByVal hdcBlt As Long, ByVal nFlags As Long) As Long

David
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 10.03.2004 (Ср) 20:41
Откуда: FRANCE

Re: Сохранить Picturebox в файл

Сообщение David » 20.07.2018 (Пт) 16:34

Принцип понятен, но проблема в том, что окно должно быть видно на экране, а с PictureBox мне не надо показывать форму.
Я рисую два графика и записываю в BMP, что бы потом вставить в Word
Один график я рисую полностью и без проблем сохраняю SavePicture Picture1.Picture, "C:\Test.bmp", а вот с другим элементы фиксированы а мне надо только добавить несколько штрихов к общей картинки
Конечно, можно было бы и второй график полностью нарисовать, боюсь так и придется сделать.
Хотелось выиграть время.
Все спасибо.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Сохранить Picturebox в файл

Сообщение Mikle » 20.07.2018 (Пт) 18:45

David писал(а):проблема в том, что окно должно быть видно на экране, а с PictureBox мне не надо показывать форму.

Не понял, в чём проблема. "Window" в названии функции не означает, что это форма, передаёшь туда hwnd от PictureBox-а, и отображаешь именно его.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Сохранить Picturebox в файл

Сообщение Хакер » 20.07.2018 (Пт) 21:53

David, вообще, подход с рисованием в PictureBox не запрещён, но порочен. Графические методы типа PSet/Line априори медленные (по сравнению с прямым доступом к массиву-растру), антиалиасинга нет.

Вдобавок к этому, если графические элементы (я так полагаю — легенда диаграмы), которые сейчас делаются с помощью контролов Label, Shape и Image, тоже рисовать вручную, то и первопричина обращения самоустранится (недостающие элементы будут попадать в сохраняемую графику).

Ну и конечно, PrintWindow можно использовать, не уходя от использования контролов, хотя с этой функцией есть свои проблемы.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

David
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 10.03.2004 (Ср) 20:41
Откуда: FRANCE

Re: Сохранить Picturebox в файл

Сообщение David » 20.07.2018 (Пт) 22:21

Спасибо конечно за попутку объяснить мне, что и как надо сделать. Только вон у вас сколько звёздочек а у меня всего две и программирование не моя специальность, короче многие слова для меня просто не понятны, знаю смешно.
Программы которые я пишу, маленькие помощники в моей профессии, сам я архитектор.
И честно сказать на форумах я пробую найти пример, понять их и использовать. Поэтому полностью понять PrintWindow мне не удалось, понятного мне примера тоже не нашел, вот и решил перечертить все мне знакомым и понятным способом
Ещё раз спасибо,

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Сохранить Picturebox в файл

Сообщение bon818 » 22.07.2018 (Вс) 0:03

Хакер писал(а):Ну и конечно, PrintWindow можно использовать, не уходя от использования контролов, хотя с этой функцией есть свои проблемы.

Интересно, а какие именно проблемы бывают с PrintWindow ?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Сохранить Picturebox в файл

Сообщение Хакер » 22.07.2018 (Вс) 13:09

PrintWindow работает через отправку оконного сообщения WM_PRINT.

1) Некоторые окна вообще игнорят это сообщение и не делают ничего. Другие передают его в DefWindowProc и отрисовывается только стандартный фон.
2) Некоторые окна делают дешёвый трюк с BitBlt со своего HDC в предоставленный HDC. В итоге в устройство-назначение копируется только видимая часть окна (если окно было скрыто — ничего не копируется), и то, если видимая часть накрыта чем-то, то это тоже копируется в устройство назначения.
3) Вызов является по сути синхронным вызовом SendMessage, и в случая межпоточных вызовов может заблокировать вызывающий поток на какое-то время. В нашем же случае вызова в пределах одного потока нужно быть готовым к тому, что в рамках вызова могут сработать какие-то обработчики событий.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Сохранить Picturebox в файл

Сообщение bon818 » 22.07.2018 (Вс) 14:21

Хакер писал(а):2) Некоторые окна делают дешёвый трюк с BitBlt со своего HDC в предоставленный HDC.

Понятно, спасибо.
В случае с VB.PictureBox, вроде норм (не BitBlt), но те места где Picture уходит за пределы формы не копирует(черные).
См. пример.
Вложения
PictureTest-2.rar
пример с PrintWindow
(220.73 Кб) Скачиваний: 148

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Сохранить Picturebox в файл

Сообщение The trick » 22.07.2018 (Вс) 17:14

viewtopic.php?f=99&t=49733 пример с 3d формой
UA6527P


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot], Yandex-бот и гости: 12

    TopList