Цитата:
Сообщение от 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 (точно также, как и выше).