Привет всем.
Ребята подскажите плизз можно ли как то АПИ функцию BitBlt применить к Image, к Picture - знаю что можно. Мне просто надо свойство Streatch использовать, а в Picture нет его. Или подскажите как можно сделать так, чтобы Picture уменьшало картинку до своего размера?
Это АПИ подходит только для picture для image я незнаю как его использовать, вроде даже нельзя так как у image нет hDC а с picture пытался и чё то не выходит, пол нэта облазил, подскажите как можно реализовать если знаете.
Винанд если честно, я не пойму как его правильно использовать. Нашёл вот примерчик - он изменяет размер пиктуре но в два раза, как то зацепить у меня не получилось его, например с изменением размера формы или самого пиктуре -он начинает как то глучить - не увеличивает и уменьшает а растягивает.
Добавьте на форму 2 PictureBox и 1 CommandButton.
Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal Nwidth As Long, ByVal Nheight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Const SRCCOPY = &HCC0020
Private Sub ImgResize(src As PictureBox, TmpPic As PictureBox, mWidth As Long, mHeight As Long)
src.AutoRedraw = False
TmpPic.AutoRedraw = True
TmpPic.Height = mHeight 'установка размеров невидимого picturebox
TmpPic.Width = mWidth
StretchBlt TmpPic.hdc, 0, 0, mWidth, mHeight, src.hdc, 0, 0, src.Width, src.Height, SRCCOPY
'сохранить временной файл на диске
SavePicture TmpPic.Image, App.Path + "\tempimg.bmp"
'перезагрузить оригинальный picturebox
src.AutoSize = True
src.Picture = LoadPicture(App.Path + "\tempimg.bmp"
'удалить временной файл
Kill App.Path + "\tempimg.bmp"
'очистить невидимый picturebox
TmpPic.Picture = LoadPicture()
'пример для вызова функции
'ImgResize Picture1, Picture2, Picture1.Width / 2, Picture1.Height / 2
End Sub
Private Sub Command1_Click()
ImgResize Picture1, Picture2, Picture1.Width / 2, Picture1.Height / 2
End Sub
Private Sub Form_Load()
Picture2.Visible = False
End Sub
К Image-контролу можно применить. Там же есть свойство Picture/Image, у которых обязательно есть свойство Handle - манипулятор загруженного растра. Прием такой: делается один совместимый DC (CreateCompatibleDc) и в него выбирается этот самый Handle (SelectObject), после чего БитБлитом рисуется с него где угодно. Примерно так...
Винанд, спасиб работает, но не совсем так как хотелось - вечером буду разбираться мож чё то придумаю. Проблема в том, что при растягивании всё кульно, а при уменьшении следы от прежнего размера рисунка на форме остаются на некоторое время, а с этим надо бороться . Как будто он перерисовывает только ту часть, которая соответсует реальному размеру уменьшения, а ненужную обрезает не сразу.
Нет это не дело в Form: autoredraw=true, ставил не помогло. Если честно, то в апи не очень и в графике не очень. А в остатках при уменьшении в пиктуре по ходу избавится нельзя, единственное что я смог сделать так это уменьшить их влияние.
SetStretchBltMode pic.hdc, 3
Поменял 4 на 3 - понял что это апи устанавливает свойство растягивание определённого объекта и методом тыка попробовал, уменьшает но всё же остатки небольше есть при резком уменьшении.
Ещё вот используя старую небольшую инфу по BitBlt вот что придумал.
везде использовал твип, авторедроу у обоих = труе.
Вот тут вроде без остатков, даже при резком изменении разсеров.
По сути решилась та проблема что я не мог решить - большое спасибо всем. И изменяя размеры формы мне кажется и покрасивее получилось - по крайней мере мне так кажется.