Страница: 1 |
Страница: 1 |
Вопрос: Сохранение и восстановление образа PictureBox
Добавлено: 25.07.05 09:38
Автор вопроса: tima
Подскажите как сделать сохранение образа PictureBox в массив и затем восстановить его. PictureBox используется в качестве предпросмотра перед печатью и туда выводятся данные оператором Print "", никаких картинок нет.
Хочу создать страницы печати и потом их листать загружая образы, а не формируя каждый раз Printами.
Пробую работать с растрами сохраняя и восстанавливая данные их них, но ничего не получается. Подскажите где собака порылась?
Вот часть кода...
Function CreateMemHdc(ind As Integer, ByRef objSrc As PictureBox) As Long
Dim lWidthPixels As Long
Dim lHeightPixels As Long
Body.Page(ind).Obraz.MemHdc = CreateCompatibleDC(objSrc.hDC)
If Body.Page(ind).Obraz.MemHdc Then
lWidthPixels = objSrc.ScaleX(objSrc.ScaleWidth, objSrc.ScaleMode, vbPixels)
lHeightPixels = objSrc.ScaleY(objSrc.ScaleHeight, objSrc.ScaleMode, vbPixels)
Body.Page(ind).Obraz.BitMapHdc = CreateCompatibleBitmap(objSrc.hDC, lWidthPixels, lHeightPixels)
If Body.Page(ind).Obraz.BitMapHdc Then
Body.Page(ind).Obraz.TrashBmpHdc = SelectObject(Body.Page(ind).Obraz.MemHdc, Body.Page(ind).Obraz.BitMapHdc)
CreateMemHdc = Body.Page(ind).Obraz.MemHdc
End If
End If
End Function
Sub DestroyHdc(ind As Integer)
Body.Page(ind).Obraz.BitMapHdc = SelectObject(Body.Page(ind).Obraz.MemHdc, Body.Page(ind).Obraz.TrashBmpHdc)
DeleteObject (Body.Page(ind).Obraz.BitMapHdc)
DeleteDC (Body.Page(ind).Obraz.MemHdc)
End Sub
Sub LoadObrazToHdc(ind As Integer, objFrom As PictureBox)
Dim lWidthPixels As Long
Dim lHeightPixels As Long
lWidthPixels = objFrom.ScaleX(objFrom.ScaleWidth, objFrom.ScaleMode, vbPixels)
lHeightPixels = objFrom.ScaleY(objFrom.ScaleHeight, objFrom.ScaleMode, vbPixels)
Body.Page(ind).Obraz.hDC = CreateMemHdc(ind, objFrom)
BitBlt Body.Page(ind).Obraz.MemHdc, 0, 0, lWidthPixels, lHeightPixels, objFrom.hDC, 0, 0, SRCCOPY
SelectObject Body.Page(ind).Obraz.MemHdc, Body.Page(ind).Obraz.TrashBmpHdc
'DeleteObject Body.Page(ind).Obraz.MemHdc
End Sub
Sub LoadHdcToObraz(ind As Integer, ByRef objDest As PictureBox)
SelectObject Body.Page(ind).Obraz.MemHdc, Body.Page(ind).Obraz.TrashBmpHdc
Dim lWidthPixels As Long
Dim lHeightPixels As Long
lWidthPixels = objDest.ScaleX(objDest.ScaleWidth, objDest.ScaleMode, vbPixels)
lHeightPixels = objDest.ScaleY(objDest.ScaleHeight, objDest.ScaleMode, vbPixels)
BitBlt objDest.hDC, 0, 0, lWidthPixels, lHeightPixels, Body.Page(ind).Obraz.MemHdc, 0, 0, SRCCOPY
End Sub
Sub CreatePic
picture1.print "страница 1"
Call LoadObrazToHdc(1,Picture1)
Picture1.cls
picture1.print "страница 2"
Call LoadObrazToHdc(2,Picture1)
Picture1.cls
Call LoadHdcToObraz(1,Picture1)
End Sub
Что делаю не так?
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
Softer
ICQ: 203660381
Вопросов: 29
Ответов: 205
Web-сайт:
Профиль | | #1
Добавлено: 26.07.05 04:43
А перед сохранение не пробовал у PicBox делать свойство AutoRedraw=True?
Номер ответа: 2
Автор ответа:
tima
Вопросов: 3
Ответов: 11
Профиль | | #2
Добавлено: 26.07.05 05:43
У меня оно всегда=true
Номер ответа: 3
Автор ответа:
Softer
ICQ: 203660381
Вопросов: 29
Ответов: 205
Web-сайт:
Профиль | | #3
Добавлено: 26.07.05 06:31
Тогда я не знаю... Сорри
Номер ответа: 4
Автор ответа:
tima
Вопросов: 3
Ответов: 11
Профиль | | #4
Добавлено: 26.07.05 06:45
А чем вообще отличается образ полученный методом print от загрузки изображения, и как сделать так, чтобы данные "распечатанные" стали доступны в свойстве picture.
Номер ответа: 5
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #5
Добавлено: 26.07.05 10:40
Вопрос - а нах нужен массив? Ведь есть же объект - StdPicture. Его и юзай.
Номер ответа: 6
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #6
Добавлено: 26.07.05 10:47
Для примера - два PictureBox'а (с AutoRedraw=True) и две кнопочки
[CODE
Option Explicit
Dim Pict As StdPicture
Private Sub Command1_Click()
Picture1.Picture = LoadPicture("C:\MyPicture.Bmp"
Set Pict = Picture1.Picture
Picture1.Picture = Nothing
End Sub
Private Sub Command2_Click()
Picture2.Picture = Pict
End Sub
[/CODE]
Номер ответа: 7
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #7
Добавлено: 26.07.05 10:52
Блин, глюканул с тэгами.
Кроме того, в этот StdPicture можно загружать картинки непосредственно с диска, без пикчеров. Но в твоем случае этого не требуется.
Фокус в том, что PictureBox сам работает с объектами StdPicture, потому тебе просто нужно создать на него (объект) дополнительную ссылку, и можно смело чистить пикчер. Для восстановления, собственно, никаких ухищрений типа копирования не требуется - просто указываешь ссылку Picture1.Picture на сохраненный объект.
Во блин, на три поста раскидал...
Номер ответа: 8
Автор ответа:
tima
Вопросов: 3
Ответов: 11
Профиль | | #8
Добавлено: 26.07.05 11:03
С картинками, как раз все понятно было. А ты попробуй вывести текст на PictBox, а потом отобрази его в другом PictBox
'''Picture1.Picture = LoadPicture("C:\MyPicture.Bmp"
Picture1.CurrentX = 0
Picture1.CurrentY = 0
Picture1.Print "Hello LamerOnLine!"
Set Pict = Picture1.Picture
Picture1.Picture = Nothing
Picture же остался пустым, и толку, что я к нему обращаюсь!
Но, я все таки победил эту проблему если есть желание могу кинуть код.
Номер ответа: 9
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #9
Добавлено: 26.07.05 11:35
Элементарно, Ватсон
Option Explicit
Dim Pict As StdPicture
Private Sub Command1_Click()
Picture1.CurrentX = 0
Picture1.CurrentY = 0
Picture1.Print "Hello LamerOnLine!"
End Sub
Private Sub Command2_Click()
Set Pict = Picture1.Image
Picture1.Picture = Nothing
Picture2.Picture = Pict
End Sub
Номер ответа: 10
Автор ответа:
tima
Вопросов: 3
Ответов: 11
Профиль | | #10
Добавлено: 26.07.05 11:42
Вот именно!!!
Спасибо за помощь!
Я сделал сначала все через за...цу (CreateCompatibleBitmap и OleCreatePictureIndirect), потом нашел Picture.Image. Как все просто! Читайте первоисточники. Еще раз всем спасибо.