Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 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-сайт: hware.org.ua
 Профиль | | #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-сайт: hware.org.ua
 Профиль | | #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. Как все просто! Читайте первоисточники. Еще раз всем спасибо.

Ответить

Страница: 1 |

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



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