마우스 이벤트를 캡쳐해야 하는 경우 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