델파이 컨트롤 반투명 드래그 이동
윈도우 탐색기에서 리스트뷰의 헤더부분을 드래그해보면
약간 반투명하게 움직이는 것을 볼수 있습니다.
또는 아이콘을 드래그 할때도
원래의 아이콘이미지가 반투명하게 보이고
투명한부분은 그대로 투명하게 보이는 것을 경험하셨을 겁니다.
이걸 델파이에서 구현하려면 어떻게 해야 할까요?
가장 쉽게 생각해 볼수 있는게 배경화면의 그림을 얻어와서
그 위에 반투명 처리를 해서 아이콘을 그려주고
이렇게 합성한 그림을 배경화면에 다시 그려주는 일을 해야 할겁니다.
하지만 그렇게 되면 드래그하는 일에 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;
결과영상
'Delphi Tip > 컴포넌트' 카테고리의 다른 글
델파이 콤보박스(TComboBox)의 팝업리스트 가로폭 늘리기 (0) | 2023.10.26 |
---|---|
델파이 타이머(TTimer) Interval 시간오차 해결방법 (0) | 2023.10.11 |
델파이 컴포넌트(Component) 마무리 (0) | 2023.07.25 |
델파이 컴포넌트(Component) 7편 (0) | 2023.07.24 |
델파이 컴포넌트(Component) 6편 (0) | 2023.07.21 |
댓글