Panel을 자유롭게 움직이게 하는건 아래와같은 코드를 이곳 질답게시판에서
찾아서 잘 이용하고 있습니다.
procedure TForm2.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
const
SC_DragMove = $F012;
begin
ReleaseCapture;
(sender as TWinControl).perform(WM_SysCommand, SC_DragMove,0);
end;
제가 제어하고자 하는건 이 Panel의 위치이동을 특정 Panel.left , Panel.top
까지만 가능하게 하고싶어서 입니다.
그위치를 넘어가지 않게 말이죠..
그럼 고수님들의 도움 부탁드리겠습니다.
서브클래싱해보세요...
type
TForm1 = class(TForm)
......
mOldWindowProc: TWndMethod;
procedure PanelWindowProc(var Message: TMessage);
end;
// Panel2 이동하는넘 (SC_DragMove)
// Panel1 특정 판넬 (Left, Top)
procedure TForm1.FormCreate(Sender: TObject);
begin
mOldWindowProc := Panel2.WindowProc;
Panel2.WindowProc := PanelWindowProc;
end;
procedure TForm1.PanelWindowProc(var Message: TMessage);
var
PanelRect: TRect;
SrcRect: PRect;
begin
if Message.Msg = WM_MOVING then
// WM_MOVING 이동전에 발생하는 메세지
begin
// 특정판넬(Panel1)의 영역좌표를 글로벌좌표로 ...
PanelRect.TopLeft := Panel1.ClientToScreen(Panel1.ClientRect.TopLeft);
PanelRect.BottomRight := Panel1.ClientToScreen(Panel1.ClientRect.BottomRight);
// SrcRect = 판넬이 이동될 위치정보
SrcRect := PRect(Message.LParam);
if not PtInRect(PanelRect, SrcRect.TopLeft) then
// 특정판넬의 위치를 벗어났는가?
begin
// 특정판넬의 위치(Left,Top)를 벗어나지 못하도록 이동좌표값수정
if SrcRect.Left < PanelRect.Left then
begin
SrcRect.Right := SrcRect.Right + (PanelRect.Left - SrcRect.Left);
SrcRect.Left := PanelRect.Left;
end;
if SrcRect.Top < PanelRect.Top then
begin
SrcRect.Bottom := SrcRect.Bottom + (PanelRect.Top - SrcRect.Top);
SrcRect.Top := PanelRect.Top;
end;
end;
end;
// 원래의 메세지핸들러 실행
mOldWindowProc(Message);
end;
^^ 항상 즐코하세요...