[MFC] CView 내부 CStatic, CButton 컨트롤 이동(Move) 시키기..
MFC&ActiveX 2007. 12. 17. 00:02 |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);
}