![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Предосмотр картинки на форме [D7, XP]
Laguna © (2011-11-03 11:54:00)В базе храню картинки. Затем реализую возможность их предосмотра в отдельной форме, на которой есть Timage со свойсвами:
Align = alClient
AutiSize = False
Proportional = True
Stretch = False
IncrementalDisplay = False
Приоткрытии формы картинка в ней пропорционально показывается, а ширина/выслта(в зависимости от картинки) не управляется, т.е. получается вот такой эффект http://s017.radikal.ru/i444/1111/17/96501bb30864.jpg.
А установка Form1.Width := Image1.Widthне дает эффекта и на создание формы вешал и на ресайз. Даже если форму в рантайм тягать мышью, то картинка пропорционально изменяется, но размеры формы под нее не подстраиваются. Вопрос в том, как сделать правильно так, чтобы при первом открытии формы каринка пропорционально размерам формы показалась в ней полностью и при этом форма должна быть размером с картинку. При максимайз формы тоже все должно соответствовать размерам друг друга.
Laguna (2011-11-03 20:31:00) [21]> Плохиш © (03.11.11 17:40) [19]
> Чё не понятно, программист отсутствует.
Рад за вас, что вы программист сильный.
> Картинку надо подгонять под форму, а не форму под картинку.
> Да и вообще делать ничего не нужно, всё уже реализовано
> в vcl.
Я на китайском пишу что ли? ДА, нужно подгонять друг под друга и про том СОБЛЮСТИ ПРОПОРЦИЮ КАРТИНКИ!
Плохиш (2011-11-03 17:40:00) [22]
> Медвежонок Пятачок © (03.11.11 15:54) [17]
>
> в чем проблема-то?
>
Чё не понятно, программист отсутствует.
> Laguna © (03.11.11 16:12) [18]
> Челсмотрит на картинку. Если разрешения ему мало, разворачивает
> формуна весь экран. Я уже нашел, что форму нужно подгонять
Как всегда телега впереди лошади. Картинку надо подгонять под форму, а не форму под картинку. Да и вообще делать ничего не нужно, всё уже реализовано в vcl.
Laguna (2011-11-03 16:12:00) [23]В приведенном примере простая вставка картинки как есть. А если картинка размером 3072х2304 (обычное разрешение дигита с хорошим качеством) ???
Я же специально и делаю сперва форму определенного размера, а в ней Timage с Align = alClient + Proportional. Чел смотрит на картинку. Если разрешения ему мало, разворачивает форму на весь экран. Я уже нашел, что форму нужно подгонять через ClientWidth и ClientHeight.Только нужно знать какого размера Timage в данный момент и какой коэффициент отношений между реальным размером картинки и показанным на форме.
Медвежонок Пятачок (2011-11-03 15:54:00) [24]в чем проблема-то?
procedure ShowPic(Image: ...);
begin
with TShowPicForm.Create(nil) do
try
высота := высота картинки;
ширина := ширина картинки;
максимальнаявысота := высота картинки;
максимальнаяширина := ширина картинки;
...
ShowModal;
finally
end;
end;
Laguna (2011-11-03 15:50:00) [25]Картинка 2) не вставилась нормально http://s55.radikal.ru/i147/1111/0f/afa08fc09dd1.jpg
Laguna (2011-11-03 15:48:00) [26]Размер картинки, находяшийся в Timage всегда будет постоянный
1) Форма загруженная по умолчанию http://s017.radikal.ru/i407/1111/15/b2787b1987f1.jpg
2) Форма сдвинута к краю картинки http://s55.radikal.ru/i147/1111/0f/afa08fc09dd1.jpg.Размер Timage только изменяется, размер картинки прежний
3) Форма уменьшена, соответственно и каринка http://s017.radikal.ru/i420/1111/e9/5adb06449933.jpg.
Следовательно размер картинки - const. Нужно варьировать размером Timage + размер формы.
Медвежонок Пятачок (2011-11-03 15:03:00) [27]это ненужные и малополезные действия.
надо всего лишь перед созданием формы получить размерность картинки и передавать в кастомный конструктор формы эти размеры.
И. Павел (2011-11-03 14:19:00) [28]> Каким образом? Есть предложения?
У формы есть канва. На ней можно рисовать что-нибудь напрямую. Например - вашу картинку. В обработчике события OnPaint. Исходную картинку можно держать в TBitmap.
Омлет (2011-11-03 14:09:00) [29]TPaintBox + TBitmap.
Laguna (2011-11-03 13:49:00) [30]> MBo © (03.11.11 13:00) [9]
> Сделайте всё без TImage.
Каким образом? Есть предложения?
И. Павел (2011-11-03 13:13:00) [31]> Значит нужно посмотрев на размер формы высчитать какой должна
> быть картинка, чтобы в нее сначала вписаться пропорционально,
> просчитав соотношения ширин и высот, выбрать лучший вариант,
> который будет за основу, а второй под него подгонять(всмысле
> ширину или высоту)
Да, именно про это я и говорю.
MBo (2011-11-03 13:00:00) [32]Сделайте всё без TImage.
Laguna (2011-11-03 12:50:00) [33]> И. Павел © (03.11.11 12:29) [5]
> В объекте формы храните исходные Width и Height картинки
> (или их отношение).
Не понял, откуда форма знает размер картинки? Может речь идет о Timage?
> Проще говоря у вас есть картинка 10 (Width) на 20.
Лучше не так. Возьмеме живой пример. В базе каринка в размерах 1024х768. Открываем форму, которая по умолчанию в размерах Width =850 Height=620
На форме Timage с Align = alClient(или без этого). На создании формы нужно вычислить размеры формы. Мы знаем, что Timage хранит в Picture.Bitmap.Width и высота соотв. реальные размеры загруженной картинки. Значит нужно посмотрев на размер формы высчитать какой должна быть картинка, чтобы в нее сначала вписаться пропорционально, просчитав соотношения ширин и высот, выбрать лучший вариант, который будет за основу, а второй под него подгонять(всмысле ширину или высоту)
И. Павел (2011-11-03 12:37:00) [34]Кстати, менять размеры картинки и обрезать форму лучше после того, как пользователь отпустит мышь. Т.е. во время ресайзинга лучше не вмешиваться в изменение размеров формы.
И. Павел (2011-11-03 12:31:00) [35]> [5] И. Павел © (03.11.11 12:29)
Проще говоря у вас есть картинка 10 (Width) на 20. Форма сменила размер, став 20 на 50. Максимальный множитель, на который можно увеличить длины сторон картинки это 2. Увеличиваете картинку. теперь строны станут 20 на 40. Потом отрезаете 10 пикселей от ClientHeight формы.
И. Павел (2011-11-03 12:29:00) [36]> А как тогда отлавливать соотношение пропорциональности картинки
> и размера формы?
Ничего не нужно отлавливать. В объекте формы храните исходные Width и Height картинки (или их отношение). Этого будет достаточно, чтобы определить максимальные габариты картинки, которая впишется в форму с новыми размерами.
Laguna (2011-11-03 12:15:00) [37]Stretch = True тоже ничего не дает, если Proportioan включен.
> И. Павел
А как тогда отлавливать соотношение пропорциональности картинки и размера формы?
И. Павел (2011-11-03 12:10:00) [38]> [2] И. Павел © (03.11.11 12:07)
Ну тоесть при каждом изменении размеров формы подгоняете под нее картинку. Получится не совсем ровно, если картинка имеет другие пропорции, чем форма. Часть формы будет оставаться пустой. Поэтому потом нужно будет просто уменьшить размер формы. И не забудьте выключить обработчик OnResize внутри самого себя, иначе все это зациклится :)
И. Павел (2011-11-03 12:07:00) [39]Лучше делать все это вручную. Т.е. убрать у картинки align. Сперва определите размер картинки и установите такой же размер для клиентского прямоугольника формы (ClientWidth/ClientHeight). В дальнейшем отлавливайте события OnResize формы. В этом событии увеличиваете картинку так, чтобы она вписывалась в прямоугольник формы (т.е. ее ширина или высота была равна ширине/высоте формы). Потом уменьшаете форму до размера картинки. При уменьшении формы алгоритм аналогичный.
Плохиш (2011-11-03 12:01:00) [40]
> Stretch = True