본문 바로가기

Delphi/C++Builder

마우스 이벤트 캡쳐 - SetCapture, ReleaseCapture

마우스 이벤트를 캡쳐해야 하는 경우 SetCapture(Win32 API)를 이용하면 됩니다.

다 사용한 경우 ReleaseCapture로 해제합니다.



아래 예제는

1) 폼위에 패널 위치

2) 폼과 패널은 각각 MouseMove 이벤트에서 로그 기록

3) 패널에서 MouseDown 시 폼으로 SetCapture 시도 > 이후 패널 및 메모 위의 마우스 이벤트가 폼에서 발생

4) MouseUp 시(폼에서 마우스 이벤트를 가져가 폼의 MouseUp이벤트에서 구현필요) ReleaseCapture로 캡쳐 해제

procedure TForm2.FormCreate(Sender: TObject);
begin
  FIsCaptured := False;
end;

procedure TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Memo1.Lines.Add(Format('F> X: %d, Y: %d', [X, Y]))
end;

procedure TForm2.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if FIsCaptured then
  begin
    Memo1.Lines.Add('Form> ReleaseCapture');
    ReleaseCapture;
  end;
end;

procedure TForm2.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  SetCaptureControl(Self);
//  SetCapture(Self.Handle);
  Memo1.Lines.Add('Panel> Capture');

  FIsCaptured := True;
end;

procedure TForm2.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Memo1.Lines.Add(Format('P> X: %d, Y: %d', [X, Y]))
end;

procedure TForm2.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  Memo1.Lines.Add('Panel> ReleaseCapture');
end;



샘플 : 

SetCaptureReleaseCapture.zip