Показать сообщение отдельно
  #23  
Старый 17.04.2008, 15:50
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,100
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Brute Force
И еще, нельзя ли как-то ограничить область, в которой отрисовка происходит, а то если масштаб увеличивать, то картинка во всю форму рисуется и под остальные компоненты залазит. Я пытался TImage в ScrollBox поместить, но у него канвы нету (
А мне надо, чтобы TImage был ограниченных и фиксированных размеров, а уменьшалась и увеличивалась в нем сама картинка.

тогда тебе разбираться с TPaintBox (кажется так). У него есть эвент - OnPaint - вызывается при перерисовке самого контрола.
1. Создаешь в памяти битмар (FBitmap : TBitmap) оригинального размера (т.е. просто загрузка из файла).
2. На форму кидаешь TScrollBox и настраиваешь его размеры (это если надо даже в случае, когда картинка больше видимой области, иметь возможность прокрутить ее и увидеть любую часть).
3. На TScrollBox кидаешь TPaintBox.
4. Заводишь переменную - коэф. увеличения. Тип - в зависимости от потребностей. Если нужно только увеличение, то можно обойтись Integer, если надо и уменьшение, то тип Double. В примере - первый вариант (FScale : Integer).
4. В событии OnPaint пишешь код отрисовки вида:
Код:
// Вариант без TScrollBox
var
  ViewH, ViewH : Intger;
  R : TRect;
begin
  // вычисляем размеры отображения. Если FScale : Double, то закрыть в Round
  ViewH := FBitmap.Height * FScale;
  ViewW := FBitmap/Width * FScale;

  // Вычисляем координаты области отрисовки
  R := TRect(Round((PaintBox.Width - ViewW)/2), // Left
                  Round((PaintBox.Height - ViewH)/2), // Top
                  Round((PaintBox.Width - ViewW)/2) + ViewW, // Right
                  Round((PaintBox.Height - ViewH)/2) + ViewH); // Bottom

  // Рисуем
  PaintBox.Canvas.StretchDraw(R,FBitmap);
end;

Вариант с TScrollBox по сути гораздо проще.
При изменении масштаба надо просто установить размеры TPaintBox в вычисленные аналогично предыдущему варианту, а в отрисовке R создать по координатам PaintBox'а (R := Rect(0,0,PaintBox.Width,PaintBox.Height) и отрисовать FBitmap (точно также, как и выше).
Ответить с цитированием