|
폼에서 마우스를 Down할 때 마다 동적으로 Label 2개(하나의 그룹처럼 움직이게 하려고함)를 생성하고
마우스로 폼에 만든 Label들을 선택하면 이 선택된 라벨그룹이 마우스를 따라 이동하게 하려합니다.
그래서 임시판넬을 동적생성하여 이 판넬위에 라벨들을 올렸는데 라벨들이 따로 움직이고
마우스를 Up하면 엉뚱한 곳으로 이동합니다.
같은 방법(임시판넬을 만들어 이미지를 이동시키는 것)으로 이미지를 움직일땐 제대로 되는데
왜 라벨은 안되는 걸까요?
아래 코딩 보시고 이유 좀 찾아주세여..부탁드립니다.
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if(Button==mbLeft) Put_Indi("Kg",X,Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Put_Indi(const AnsiString& unit, int X, int Y)
{
Label2=new TLabel(this);
Label1=new TLabel1(this);
Label1->Parent=this;
Label2->Parent=this;
//Label1과 Label2의 속성 정하기
Label1->Color=clRed;
Label1->Font->Size=12;
Label1->AutoSize=true;
Label2->Font->Size=12;
Label2->Font->Style = TFontStyles()<< fsBold;
Label2->Color=this->Color;
Label2->AutoSize=true;
//Caption지정
Label1->Caption="1000 ";
Label2->Caption=" "+unit;
//Label1과 Label2의 위치지정
Label1->Left=X;
Label1->Top=Y;
Label2->Left=X+Label1->Width;
Label2->Top=Label1->Top;
//마우스 이벤트를 정한다.
Label1->OnMouseMove=Label1MouseMove;
Label1->OnMouseUp=Label1MouseUp;
Label1->OnMouseDown=Label1MouseDown;
Label2->OnMouseDown=Label1MouseDown;
Label2->OnMouseMove=Label1MouseMove;
Label2->OnMouseUp=Label1MouseUp;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Label1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(Button==mbLeft)
{
delete TempPanel;
//mouse clicked - set flag and record location where mouse was clicked
mouseDown=true;
mouseDownX=X;
mouseDownY=Y;
// creat temperary panel
TempPanel= new TPanel(this);
TempPanel->Parent=this;
TempPanel->BorderStyle=bsNone;
TempPanel->BevelInner=bvNone;
TempPanel->BevelOuter=bvNone;
TempPanel->FullRepaint=false;
TempPanel->Visible=true;
// subclass it so we can catch the WM ERASEBKGND message
OldPanelWP=TempPanel->WindowProc;
TempPanel->WindowProc=NewPanelWP;
//put the clicked indicator onto the temporary panel to prevent flicker
clickedLabel1 = (TLabel*)Sender;
clickedLabel2=(TLabel*)Sender;
clickedLabel1->Parent = TempPanel;
clickedLabel2->Parent=TempPanel;
TempPanel->Left = clickedLabel1->Left;
TempPanel->Top = clickedLabel1->Top;
TempPanel->AutoSize=true;
TempPanel->Width=clickedLabel1->Width+clickedLabel2->Width;
TempPanel->Height=clickedLabel1->Height+clickedLabel2->Height;
TempPanel->Visible = true;
SetCapture(TempPanel->Handle);
clickedLabel1->Left=0;
clickedLabel1->Top=0;
clickedLabel2->Left=Label1->Width;
clickedLabel2->Top=0;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Label1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
if (mouseDown) //only move the indicator if the mouse button is down
{
TempPanel->Left=TempPanel->Left+X-mouseDownX;
TempPanel->Top=TempPanel->Top+Y-mouseDownY;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Label1MouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
//mouse released - clear flag
mouseDown=false;
//move the image back to the form and hide the TPanel
TLabel* clickedLabel1 = (TLabel*)Sender;
TLabel* clickedLabel2=(TLabel*)Sender;
clickedLabel1->Parent =this;
clickedLabel2->Parent=this;
clickedLabel1->Left = TempPanel->Left;
clickedLabel1->Top = TempPanel->Top;
clickedLabel2->Left=clickedLabel1->Width+X;
clickedLabel2->Top=clickedLabel1->Top;
TempPanel->Visible = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NewPanelWP(TMessage & msg)
{
if(msg.Msg==WM_ERASEBKGND)
msg.Msg=false;
else
OldPanelWP(msg);
}
|