'MoveWindow'에 해당되는 글 2건

  1. 2007/12/17 [MFC] CView 내부 CStatic, CButton 컨트롤 이동(Move) 시키기..
  2. 2007/12/16 [MFC] CView 내부에 CButton 추가한 후에 CButton을 클릭한 위치로 이동(MoveWindow) 시키기.
2007/12/17 00:02

[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);
}

크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 0
2007/12/16 23:20

[MFC] CView 내부에 CButton 추가한 후에 CButton을 클릭한 위치로 이동(MoveWindow) 시키기.

버튼을 CView에 추가..

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


그리고 버튼 내부에 클릭 이벤트를 통해서 해당 위치에 버튼을 MoveWindow 시켜보자.

void CGButton::OnLButtonUp(UINT nFlags, CPoint point)
{
 CPoint curpos;
// 커서의 스크린 위치를 가져온다.
 GetCursorPos(&curpos);
// 부모 객체에서의 스크린 좌표를 클라이언트 좌표로 바꾼다.
 GetParent()->ScreenToClient(&curpos);
// 좌표값을 사용해서 윈도우의 크기를 지정한다.
 CRect rt(curpos.x, curpos.y, curpos.x+100, curpos.y+100);
// 자신 객체를 이동시킨다.
 MoveWindow(&rt);

 CButton::OnLButtonUp(nFlags, point);
}


이 코드가 완성되었으니. 클릭후 드래그로 컨트롤을 View에서 이동가능할듯 하다. ^^
(아마도 다 아는거겠지만. 요즘 mfc에 대해서 조금씩 방법적인 면이 늘어 나는거 같다.)

크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 0