Q&A

  • 그림을 일부분만 표시하려면 어떻게 해야 되나요?
즉 예를 들어 800x600을 Image1에 불러들인다음...

Image1의 가로, 세로 길이를 100으로 설정한다음,
(이 경우 Left1, Top1 지점부터 가로100, 세로 100 픽셀만 보이겠죠?)

그런데 이것을 코딩으로 그림의 Left50, Top50 지점부터 가로100, 세로100 픽셀로 보이게 할수 없을까요??

이거 어떻게든 구현해 보고 싶어서 그러거던요...
2  COMMENTS
  • Profile
    거리 2003.04.03 20:27
    도움말에서 StretchBlt를 찾아보세요.
    그걸로 하면 충분하겠네요.


  • Profile
    김영대 2003.04.03 12:08
    // 안녕하세요  김영대(http://www.howto.pe.kr)입니다

    // 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.