본문 바로가기
Delphi Tip/컴포넌트

델파이 컨트롤 반투명 드래그 이동

by MonoSoft 2023. 9. 12.
728x90
반응형

델파이 컨트롤 반투명 드래그 이동

 

728x90

 

 

윈도우 탐색기에서 리스트뷰의 헤더부분을 드래그해보면

약간 반투명하게 움직이는 것을 볼수 있습니다.

 

또는 아이콘을 드래그 할때도

원래의 아이콘이미지가 반투명하게 보이고

투명한부분은 그대로 투명하게 보이는 것을 경험하셨을 겁니다.

 

이걸 델파이에서 구현하려면 어떻게 해야 할까요?

 

가장 쉽게 생각해 볼수 있는게 배경화면의 그림을 얻어와서

그 위에 반투명 처리를 해서 아이콘을 그려주고

이렇게 합성한 그림을 배경화면에 다시 그려주는 일을 해야 할겁니다.

 

하지만 그렇게 되면 드래그하는 일에 CPU가 쉴새가 없게 됩니다.

 

그러면 방법은 없을까요?

 

다행이도 델파이에는 이런 기능을 할수 있도록 준비된 녀석이 있습니다.

바로 TImageList라는 녀석이죠!!

 

 

사용법

1. 우선 TImageList에 드래그할 이미지를 하나 넣어준다

2. 마우스가 눌렸을때 BeginDrag를 불러준다

3. 그 다음 마우스가 움직일때 DragMove

4. 마우스가 떼었을때 EndDrag

 

 

다음은 폼위에 있는 컨트롤(TControl)을 드래그하는 예제입니다.

TControl을 대상으로 하였으므로

TButton이나 TImage도 드래그가 가능하겠지요?

 

모든 컨트롤들의 MouseDown, MouseMove, MouseUp에

다음을 연결해 주세요

그러면 이쁘장하게 드래그되는 버튼을 볼수 있을겁니다.

 

var

  Form1: TForm1;

  DownPos : TPoint;

 

implementation

 

{$R *.dfm}

 

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

Shift: TShiftState; X, Y: Integer);

var

  R : TRect;

  Bmp : TBitmap;

begin

  Bmp := TBitmap.Create;

  R := TControl(Sender).BoundsRect;

  Bmp.Width := R.Right - R.Left;

  Bmp.Height := R.Bottom - R.Top;

  BitBlt( Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height,

              GetDC(TControl(Sender).Parent.Handle), R.Left, R.Top, SRCCOPY );

  ImageList1.Clear;

  ImageList1.Width := Bmp.Width;

  ImageList1.Height:= Bmp.Height;

  ImageList1.Add( Bmp, nil );

  // ImageList1.DragCursor := crDefault;

  ImageList1.BeginDrag( TControl(Sender).Parent.Handle, R.Left, R.Top );

 

  DownPos := Point( x, y );

  Bmp.Free;

end;

 

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

var

  pt : TPoint;

begin

  if ssLeft in Shift then

  begin

    pt := TControl(Sender).BoundsRect.TopLeft;

    ImageList1.DragMove( pt.x + x - DownPos.x, pt.y + y - DownPos.y );

  end;

end;

 

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

Shift: TShiftState; X, Y: Integer);

begin

  ImageList1.EndDrag;

 

  with TControl(Sender) do

  begin

    inc( x, Left ); inc( y, Top );

    SetBounds( x - DownPos.x, y - DownPos.y, Width, Height );

    Invalidate;

  end;

end;

 

 

 

결과영상

 

 

728x90
반응형

댓글