Как правильно отмасштабировать объект Pictrure в Pictureboxе

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

Как правильно отмасштабировать объект Pictrure в Pictureboxе

Сообщение MiGan » 05.07.2005 (Вт) 11:16

Код: Выделить всё

Private Sub SetPicture(ByVal Path As String, ByRef Img As Image)
    Dim fso As New FileSystemObject
    Dim Proportion As Single
    Dim Picture As StdPicture
    If fso.FileExists(Path) Then
        Set Picture = LoadPicture(Path)
        Proportion = Picture.Height / Picture.Width
        Picture.Height = Me.ScaleY(Img.Height, vbTwips, vbPixels)
        Picture.Width = Picture.Height / Proportion
        Set Img.Picture = Picture
    Else
        Set Img.Picture = Nothing
    End If
End Sub


Такой код не работает, т.к. при записи значения проперту Height объекта Picture возникает: Object does not support this property or method!
Как???
Или подскажите, какие еще есть пути для того, чтобы программно подогнать картинку в picturebox (!!! с соблюдением ее пропорций, т.е. не picturebox.stretch= true!!!) :?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 05.07.2005 (Вт) 11:24

посмотри метод PaintPicture

MiGan
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 02.05.2005 (Пн) 13:27

Paintpicture

Сообщение MiGan » 05.07.2005 (Вт) 15:18

Во-первых - paintpicture - м-д PictureBoxа а у меня был Image. Ну ладно. Проблема в том, что мне нужно сжать картинку с соблюдением ее пропорций, т.е. допустим растянуть картинку по высоте контейнера а по ширине в одинаковой пропорции!!!!

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 05.07.2005 (Вт) 15:23

BitBlt рулит ( это тот же Paint Picture ) :D :D :D
Если всё делать своими ручками, они скоро отвалятся !

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 05.07.2005 (Вт) 15:36

Для масштабирования лучше использовать StretchBlt() - она специально для этого предназначена.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 05.07.2005 (Вт) 15:36

посмотри вот этот пример:
http://bbs.vbstreets.ru/download.php?id=763
его oxygen выкладавала в свое время

SHURUP
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 440
Зарегистрирован: 15.09.2004 (Ср) 14:24
Откуда: Ирпень, Украина

Сообщение SHURUP » 05.07.2005 (Вт) 16:33

Центрирование изображения с сохранением пропорциЙ:
(Нужна Form1, а на ней Picture1)
Код: Выделить всё
Option Explicit
Private Sub SetPicture()
Dim PicProportion As Single, _
    FormProportion As Single, _
_
    newHeiqht As Single, _
    newWidth As Single, _
    newTop As Single, _
    newLeft As Single
   
    PicProportion = Picture1.Height / Picture1.Width
    FormProportion = ScaleHeight / ScaleWidth
    If PicProportion > FormProportion Then
        newHeiqht = Form1.ScaleHeight - 1
        newWidth = newHeiqht / PicProportion
    Else
        newWidth = Form1.ScaleWidth - 1
        newHeiqht = newWidth * PicProportion
    End If
        newTop = (Form1.ScaleHeight - newHeiqht) / 2
        newLeft = (Form1.ScaleWidth - newWidth) / 2
    Cls
    On Error Resume Next
    PaintPicture Picture1.Picture, _
        newLeft, newTop, newWidth, newHeiqht, _
        0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, vbSrcCopy
End Sub

Private Sub Form_Load()
Dim path As String
path = "C:\windows\winnt.bmp"
    AutoRedraw = True
With Picture1
    .AutoRedraw = True
    .AutoSize = True
    .Visible = False
    If FileLen(path) Then .Picture = LoadPicture(path)
End With
End Sub

Private Sub Form_Resize()
    SetPicture
End Sub
теперь можно ресайзить форму :roll:
Нам чужого не надо, но своё мы возьмем, чьё бы оно ни было...

MiGan
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 02.05.2005 (Пн) 13:27

Сообщение MiGan » 05.07.2005 (Вт) 17:28

SHURUP
Спасибо! Твой пример - то что надо :lol:

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 05.07.2005 (Вт) 17:37

Ну а если заменить PaintPicture на BitBlt то вместо жирного пикчербокса можно использовать имадж как ты и хотел :D :D :D
З.Ы. Прямой вызов всегда быстрей :twisted:
Если всё делать своими ручками, они скоро отвалятся !

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 05.07.2005 (Вт) 18:26

2 Kovu

Для самых "умных": Image не имеет hDC, которая и нужна для BitBlt!
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.07.2005 (Вт) 20:04

2Kovu

Для самых "умных": BitBlt не позволяет менять масштаб изображения, т.ч. в данном случае она совершенно бесполезна.
Изображение

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 05.07.2005 (Вт) 22:37

Заели меня бедного :P :P :P
Если всё делать своими ручками, они скоро отвалятся !

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.07.2005 (Ср) 7:44

BV писал(а):Image не имеет hDC, которая и нужна для BitBlt!

Image1.Picture.Handle не смотрел?
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.07.2005 (Ср) 8:14

alibek писал(а):
BV писал(а):Image не имеет hDC, которая и нужна для BitBlt!

Image1.Picture.Handle не смотрел?

Это же hBitmap, а не hDC!
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.07.2005 (Ср) 8:21

Наверное да, сам не юзал :)
Lasciate ogni speranza, voi ch'entrate.


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

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

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

    TopList  
cron