Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.08.2008, 23:55
diagnost diagnost вне форума
Прохожий
 
Регистрация: 01.08.2008
Сообщения: 19
Репутация: 10
По умолчанию Масштабирование Jpeg скроллбаром

На данный момент не нашел, как это делать правильно. Существующий вариант таков:
Код:
ImageWiring.AutoSize := true;//взято из интернета, ImageWiring: TImage 
  ImageWiring.AutoSize := false;//взято из интернета
  ImageWiring.Width := trunc(ImageWiring.Width*(1+(ScrollBarScaleImage.Position - 50)/80)); // стартовое положение скроллбара - 50, при этом масштаб 1:1
  ImageWiring.Height := trunc(ImageWiring.Height*(1+(ScrollBarScaleImage.Position - 50)/80));
  ImageWiring.Stretch := True;
  ScrollBarScaleImage.Hint := '1:' + FloatToStr(RoundTo((1+(ScrollBarScaleImage.Position - 50)/80), -2));//показывает размер изображения после передвижения ползунка

При подобном способе изображение дергается (перерисовка?) при изменении масштаба скроллбаром, получается некрасиво. Как добиться плавного изменения рисунка без подергиваний? И как показывать хинт скроллбара в процессе перемещения?

Последний раз редактировалось diagnost, 02.08.2008 в 00:32.
Ответить с цитированием
  #2  
Старый 04.08.2008, 22:23
diagnost diagnost вне форума
Прохожий
 
Регистрация: 01.08.2008
Сообщения: 19
Репутация: 10
По умолчанию

Задача далеко не банальна. Пробовал в ScrollBox поместить PaintBox и выводить изображение на PaintBox.Canvas. Обнаружил, что мерцание получается из-за изменения размера PaintBox при масштабировании картинки. Видимо, при изменении размера PaintBox сам PaintBox сначала перерисовывается с пустым канвасом цветом фона ScrollBox, и лишь после этого я канвас заполняю изображением при вызове процедуры типа Draw. Как это обойти, ума не приложу...
Код:
   PaintBox.Height:= ViewH; //заполнение PaintBox фоном - вывод фона на экран, причина мерцания
   PaintBox.Width := ViewW;//-"-
   PaintBox.Canvas.Draw(0,0,ScaledBmp)//вывод изображения на экран.

Последний раз редактировалось diagnost, 04.08.2008 в 22:25.
Ответить с цитированием
  #3  
Старый 04.08.2008, 23:01
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

А можно поинтересоваться? Если скроллбар используется для масштабирования, то чем скроллируется TImage когда масштаб изображения выходит далеко за видимые размеры окна?
__________________
Не забывайте делать резервные копии
Ответить с цитированием
  #4  
Старый 04.08.2008, 23:08
diagnost diagnost вне форума
Прохожий
 
Регистрация: 01.08.2008
Сообщения: 19
Репутация: 10
По умолчанию

Скроллбоксом. Я помещал TImage в скроллбокс . Но, ИМХО, причина не в скроллбоксе, т.к. даже если изображение меньше скроллбокса и целиком в него влезает, оно подергивается при изменении масштаба.

Я полагаю, надо или найти способ запретить перерисовывать канвас при изменении размера PaintBox'а (если этот способ существует), или выводить поверх PaintBox'а изображение (типа нового слоя), в которое записывать нужные изменения канваса PaintBox'а (тут много проблем).

Последний раз редактировалось diagnost, 04.08.2008 в 23:28.
Ответить с цитированием
  #5  
Старый 04.08.2008, 23:23
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Обычно делают так. Масштаб изображения меняют какими-нибудь дополнительными управляющими компонентами: кнопками, "ползунком" (trackbar) и (или) мышой. А скроллбары (полосы внизу и справа) используют для прокрутки изображения чтоб просматривать любые части изображения.
ScrollBarScaleImage - это видимо какой-то свой компонент (типа trackbar'а), с помощью которого и меняется масштаб?.
__________________
Не забывайте делать резервные копии

Последний раз редактировалось san-46, 05.08.2008 в 00:08.
Ответить с цитированием
  #6  
Старый 05.08.2008, 00:51
diagnost diagnost вне форума
Прохожий
 
Регистрация: 01.08.2008
Сообщения: 19
Репутация: 10
По умолчанию

Прошу прощения за то, что плохо объясняю.
Да, я вместо trackbar'а использую отдельный скроллбар.У меня так все и есть, как написал san-46. ScrollBarScaleImage - это обычный скроллбар в стороне от скроллбокса (не принадлежащий скроллбоксу). Я его использую для масштабирования рисунка в скроллбоксе. При перемещении ползунка на моем "выносном" "дополнительном" скроллбаре я изменяю размеры PaintBox, который лежит в скроллбоксе. При этом происходит мерцание изображения (из-за изменения размера PaintBox).
Все работает (испробовал уже несколько разных способов, два описал в первом и втором сообщении этой темы), только мерцание некрасиво. Не могу избавиться. Пересмотрел много тем на этом форуме, проблему уже поднимали, решения не нашел.

Последний раз редактировалось diagnost, 05.08.2008 в 00:59.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:18.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025