1

私はデルファイで働いています。
TImage コントロールを配置するスクロール ボックスが 1 つあります。ここで、TImage コントロールにレンダリングされた画像をズームしたいと考えました。ということで、TCanvasのstretchDrawメソッドを使っています。私のコードは -

   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.
ありがとうございました。

4

3 に答える 3

3

これは、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 のサイズを 2 倍にします。TImage が大きくなったので、スクロール ボックスは適切に機能します。

于 2010-06-23T08:10:46.060 に答える
1

Uwe Raabe が正しい方法を教えてくれます。あなたの方法がうまくいかない理由は次のとおりです。スクロール ボックスはスクロールバーを表示し、コントロール全体を表示するのに役立ちます。あなたの場合、TImage オブジェクトが Scrollbox よりも大きくなったときにのみスクロールバーが表示されます。Scrollbox は TImage の内部を認識できない可能性があるため、TImage.Picture は気にせず、コントロールのみを気にします。また、AutoSize = False の TImage は画像を気にせず、サイズは常に同じままです。

コードは、ベース ビットマップをそれ自体に再描画します。問題は、ビットマップの幅と高さが固定されていることです。ビットマップの領域の外側をペイントすると、基本的に黙って無視されます。StretchDrawing によってビットマップをそれ自体に「ズーム」している場合 (そして、最初からうまくいったことに驚いています)、ビットマップを大きくしているのではなく、収まらないものは静かに切り取られます。内部ビットマップのサイズを変更したい場合は、最初に新しい大きなビットマップを作成し、拡大した画像を新しいビットマップに描画してから、ビットマップを TImage に割り当てる必要があります。これを行う場合は、TImage.AutoSize = True であることを確認してください。

于 2010-06-23T11:04:25.090 に答える
0

イメージ コントロールのサイズをビットマップのサイズに設定する必要があります。

于 2010-06-23T07:03:45.347 に答える