C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[8188] 이것 좀 봐 주세요...
김소영 [qbuiler] 1486 읽음    2001-06-13 04:09
폼에서 마우스를 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);
}



+ -

관련 글 리스트
8188 이것 좀 봐 주세요... 김소영 1486 2001/06/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.