GSI

'GetWindowRect'에 해당되는 글 1건

  1. 2007.12.17 [MFC] CView 내부 CStatic, CButton 컨트롤 이동(Move) 시키기..

사용자 삽입 이미지

MFC 에서 싱글뷰로 해서 Doc 없애고, CChildView로만 생성했습니다.
내부에 Static, Button을 서브클래싱 해서 클래스를 각각 제작.

CChildView 내부에 멤버 변수로 선언
CGStatic m_Static;
CGButton m_Button;


OnCreate 함수를 오버라이드 하여 컨트롤을 생성합니다.
int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CWnd::OnCreate(lpCreateStruct) == -1)
  return -1;

 m_Static.Create("test", WS_CHILDWINDOW|SS_NOTIFY, CRect(10, 10, 100, 100), this, 1000);
 m_Static.ShowWindow(SW_SHOW);

 m_Button.Create("", WS_CHILDWINDOW, CRect(100, 100, 200, 200), this, 1001);
 m_Button.ShowWindow(SW_SHOW);

 return 0;
}


CStatic 컨트롤의 마우스 이벤트를 먹게 할려면 SS_NOTIFY를 추가해야 합니다.

CStatic, CButton의 마우스 이벤트 코드는 동일하기 때문에 CButton 의 내용만 서술합니다.
이전 위치를 기억 하기 위해서 변수를 하나 생성
CPoint  oldPos;

생성자 쪽에서 초기화를 해줍니다.
oldPos = CPoint(0, 0);

나머지 OnLButtonDown, OnLButtonUp, OnMouseMove 이벤트를 추가하고
아래와 같이 작성해 줍니다.
void CGButton::OnLButtonDown(UINT nFlags, CPoint point)
{
 SetCapture();
 
 // 최초 위치를 oldpos에 입력하고 시작한다.
 CPoint curpos;
 GetCursorPos(&curpos);
 GetParent()->ScreenToClient(&curpos);
 oldPos = curpos;

 CButton::OnLButtonDown(nFlags, point);
}

void CGButton::OnLButtonUp(UINT nFlags, CPoint point)
{
 ReleaseCapture();
 CButton::OnLButtonUp(nFlags, point);
}

void CGButton::OnMouseMove(UINT nFlags, CPoint point)
{
 if(GetCapture() == this) {

  // 현재 컨트롤이 포함되어 있는 부모 컨트롤에서의 위치값을 가져온다.
  CRect thisRect;
  GetWindowRect(&thisRect);
  GetParent()->ScreenToClient(&thisRect);

  // 현재 마우스 위치값을 컨트롤의 위치 값으로 변환한다.
  CPoint curpos;
  GetCursorPos(&curpos);
  GetParent()->ScreenToClient(&curpos);

  // 변경된 위치값을 사용해서 이동범위를 구한다.
  CPoint newpos = curpos - oldPos;

  // 이동할 위치와 크기값을 보정한다.
  thisRect.left += newpos.x;
  thisRect.top += newpos.y;
  thisRect.right = thisRect.left+100;
  thisRect.bottom = thisRect.top+100;
 
  // 윈도우를 이동시킨다.
  MoveWindow(&thisRect);

  // 계속 움직임을 위해서 현재 값을 저장한다.
  oldPos = curpos;

  Invalidate();
 }

 CButton::OnMouseMove(nFlags, point);
}

Posted by gsi
: