Q&A

  • Canvas 에서의 Zoom In/Out 구현
Canvas에서 Zoom In/Out 구현하는 간단한 방법 좀 가르쳐 주세요.



1  COMMENTS
  • Profile
    김영대 1999.11.27 18:32
    도토리 wrote:

    > Canvas에서 Zoom In/Out 구현하는 간단한 방법 좀 가르쳐 주세요.



    // Image1에 원본 그림을 불러다 놓고 컴파일하셔서 사용하세요



    unit Unit1;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    ExtCtrls, StdCtrls;



    type

    TForm1 = class(TForm)

    Image1: TImage;

    Image2: TImage;

    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;

    Shift: TShiftState; X, Y: Integer);

    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,

    Y: Integer);

    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;

    Shift: TShiftState; X, Y: Integer);

    private

    { Private declarations }

    DragOrigin: TPoint;

    MovePoint: TPoint;

    FinalRect: TRect;

    IsFocusRect: Boolean; // 드래그 상태(True)을 표시

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;



    implementation

    {$R *.DFM}



    procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;

    Shift: TShiftState; X, Y: Integer);

    begin

    // 마우스 드래그를 처음 시작할때

    if ((Button = mbLeft) and not(IsFocusRect))then

    begin

    DragOrigin := Point(x,y); // 마우스 드래그 시작위치(x,y) 저장

    MovePoint := DragOrigin;

    IsFocusRect := True; // 마우스 드래그를 시작함

    end;

    end;



    procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,

    Y: Integer);

    begin

    if IsFocusRect then

    begin

    // 바로전의 선택 직사각형을 지운다

    Image1.Canvas.DrawFocusRect(rect(DragOrigin.x, DragOrigin.y, MovePoint.X, MovePoint.Y));



    // 마우스 드래그 시작위치부터 현재 위치까지 선택 직사각형을 그린다

    Image1.Canvas.DrawFocusRect(rect(DragOrigin.x, DragOrigin.y, X, Y));



    // 최근 선택 직사각형을 저장한다

    FinalRect := rect(DragOrigin.x, DragOrigin.y, X, Y);



    // 최근 드래그 위치를 저장

    MovePoint := point(x,y);

    end;

    end;



    procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;

    Shift: TShiftState; X, Y: Integer);

    var

    bmp: TBitmap;

    begin

    if (IsFocusRect and (Button = mbLeft)) then

    begin

    // 선택한 영역의 이미지를 Image2로 복사

    bmp := TBitmap.Create; // 임시저장용 Bitmap

    try

    bmp.width := ord(FinalRect.Right - FinalRect.Left);

    bmp.height := ord(FinalRect.Bottom - FinalRect.Top);

    bmp.Canvas.CopyRect(rect(0, 0, bmp.width,bmp.height), image1.Canvas,FinalRect);

    Image2.Canvas.StretchDraw(Image2.ClientRect, bmp);

    finally

    bmp.free;

    end;



    // 바로전의 선택 직사각형을 지우고 변수들을 초기화함

    Image1.Canvas.DrawFocusRect(FinalRect);

    IsFocusRect := False;

    FinalRect := Rect(0,0,0,0);

    end;

    end;



    end.