Проблема с TImage и TScrollBox

Я работаю с delphi.
У меня есть одна полоса прокрутки, в которую я помещаю элемент управления TImage. Теперь я хотел увеличить изображение, отображаемое в элементе управления TImage. Итак, я использую метод stretchDraw для TCanvas. Мой код -

   if sbZoom.Down then begin
      rct := imgmain.Picture.Bitmap.Canvas.ClipRect;
      rct := Rect(rct.Left * 2,rct.Top * 2,rct.Right * 2,rct.Bottom * 2);
      imgmain.Picture.Bitmap.Canvas.StretchDraw(rct,imgmain.Picture.Bitmap);
      imgmain.Repaint;
   end;

Это правильно масштабирование изображения, моя проблема в том, что я хочу, чтобы размер полосы прокрутки также изменялся с увеличением изображения.
Also explain me parameters of Canvas.StretchDraw method. I am little confused with it.
Спасибо.


person Himadri    schedule 23.06.2010    source источник


Ответы (3)


Уве Раабе дает вам правильный способ сделать это. Вот почему ваш способ не работает: полоса прокрутки покажет полосы прокрутки и поможет вам увидеть все элементы управления. В вашем случае полосы прокрутки будут отображаться только тогда, когда объект TImage станет больше, чем Scrollbox. Scrollbox не может знать внутреннее устройство TImage, поэтому его не волнует TImage.Picture, он заботится только об элементе управления. И TImage с AutoSize = False не заботится о своем Picture, его размер всегда остается неизменным.

Ваш код перерисовывает базовое растровое изображение на себя. Проблема в том, что растровое изображение имеет фиксированную ширину и высоту: если вы рисуете за пределами области растрового изображения, вы в основном игнорируете. Когда вы «увеличиваете масштаб» с помощью StretchDrawing растрового изображения на себя (и я удивлен, что это сработало с самого начала!), Вы не увеличиваете растровое изображение, а то, что не подходит, тихо обрезается. Если вы действительно хотите, чтобы внутреннее растровое изображение изменило размер, вам сначала нужно создать новое растровое изображение большего размера, нарисовать увеличенное изображение на новом растровом изображении, а затем назначить растровое изображение вашему TImage. В этом случае убедитесь, что TImage.AutoSize = True.

person Cosmin Prund    schedule 23.06.2010
comment
Хорошо, хороший ответ ... На самом деле я уже пробовал это, но он также не работал, как я ожидал. Но проблема заключалась в параметрах, которые я передал в функции strechDraw. Я брал растровое изображение большего размера и передавал то же растровое изображение в качестве параметра StrechDraw .. Другой мой вопрос касался параметров StrechDraw, которые никто не объясняет. Во всяком случае, теперь я это понял. - person Himadri; 24.06.2010

Вы можете сделать это довольно легко, не вызывая StretchDraw:

  if Zoomed then begin
    Image1.AutoSize := false;
    Image1.Stretch := true;
    Image1.Width := 2*Image1.Width;
    Image1.Height := 2*Image1.Height;
  end
  else begin
    Image1.Stretch := false;
    Image1.AutoSize := true;
  end;

AutoSize: = true гарантирует, что TImage имеет тот же размер, что и изображение внутри. Во время масштабирования мы отключаем AutoSize и включаем Stretch, поэтому размер изображения изменяется до размера TImage (который здесь все тот же). Затем мы удваиваем размер TImage, чтобы добиться эффекта масштабирования. Поскольку TImage теперь больше, полоса прокрутки может работать правильно.

person Uwe Raabe    schedule 23.06.2010
comment
Но это не изменит значение Image1.Picture.Bitmap.Width и Image1.Picture.Bitmap.Height ... - person Himadri; 23.06.2010
comment
Это не так, но Scrollbox не заботится о Image1.Picture.BitmapWidth, он заботится только о Image1.Width. Зачем вам изменять размер фактического растрового изображения, если вы можете показать изображение больше / меньше, не уничтожая при этом информацию? +1. - person Cosmin Prund; 23.06.2010
comment
@Cosmin Мне нужен тот же размер растрового изображения, потому что мне нужно выполнять дальнейшие процессы с изображением в событии mousedown и изменять несколько точек изображения. - person Himadri; 24.06.2010

Вы должны установить размер элемента управления изображением на размер растрового изображения.

person Ritsaert Hornstra    schedule 23.06.2010