TPanel 이나 TButton등 윈도우 Handle이 있는 모든 Control 들은
아래와 같이 SYSCOMMAND를 이용하여 run-time에 쉽게 control의 위치를 이동시킬수 있습니다.
[WinControl을 마우스로 이동]
void __fastcall TForm1::Panel1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
ReleaseCapture();
SendMessage(Panel1->Handle, WM_SYSCOMMAND, 0xf012, 0);
}
참조
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=523
하지만 GraphicControl을 윈도우Handle이 없습니다.
일반적인 Window-SysCommand를 처리할 WindowProc가 존재하지를 않죠
그러니 위와같은 방식으로는 불가능합니다.
그리고 GraphicControl의 모습을 나타낼 dc도 없으므로
GraphicControl의 Parent의 dc에 자신을 draw하여 나타냅니다.
이런 GraphicControl에는
TLabel , TImage , TShape , TSpeedButton ... 등이 있습니다.
그럼 위와같이 GraphicControl은 어떻게 하면 마우스로 선택하여 위치를 이동할수 있을까?
[GraphicControl을 마우스로 이동]
GraphicControl은 WinControl과 달리
MouseMove때 직접 control의 위치를 마우스가 움직인 만큼 이동시켜줘야 합니다.
TPoint PrePt,CurPt;
bool bMove=false;
void __fastcall TForm1::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(Shift.Contains(ssLeft))
{
GetCursorPos(&PrePt); //현재 마우스 좌표를 저장
bMove=true; //마우스로 이동한다는 flag설정
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if(bMove)
{
GetCursorPos(&CurPt); //마우스 움직인 후의 현재 마우스 가져옴
//이전 좌표와 비교해서 Image의 위치를 이동시켜줌
Image1->Left=Image1->Left+(CurPt.x-PrePt.x);
Image1->Top=Image1->Top+(CurPt.y-PrePt.y);
PrePt=CurPt; // 현재 좌표를 이전좌표로 기억해둠
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
bMove=false; //마우스 up에 움직임 종료
}
//---------------------------------------------------------------------------
위코드에서 bMove변수를 쓰지 않고 그냥 Mouse-LeftButton이 클릭되었는지만 체크해되 될것입니다.
TImage뿐만 아니라 TLabel등 모든 GraphicControl은 위와같은 방식으로 Control을 run-time에
마우스로 클릭하여 이동 시킬수 있습니다.
그럼..