'ScreenToClient'에 해당되는 글 2건
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);
}
[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에 대해서 조금씩 방법적인 면이 늘어 나는거 같다.)
Prev
Rss Feed