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

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[908] [Controls] GraphicControl 마우스로 움직이기 1
장성호 [nasilso] 11085 읽음    2009-07-30 10:51
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에
마우스로 클릭하여 이동 시킬수 있습니다.


그럼..

+ -

관련 글 리스트
908 [Controls] GraphicControl 마우스로 움직이기 1 장성호 11085 2009/07/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.