본문 바로가기
컴퓨터과학[2-1]/knou_[2-1]Visual_C

MFC Keyboard 방향키로 차일드 윈도우를 이동해보자

by boolean 2015. 4. 2.
728x90

MFC Keyboard & Message


Keyboard 방향키로 차일드 윈도우를 이동해보자

void CKeyMoveView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
                                       // WM_KEYDOWN  - 방향키로 차일드 윈도우 이동
{
	// TODO: Add your message handler code here and/or call default
	CPoint ptChild;               //차일드 윈도우의 좌표.
	CRect  Rect;                  //차일드 윈도우의 좌표 및 크기.  
	//차일드 윈도우의 두 좌표 정보 (스크린 기준)를 알아 온다.
	m_wndChild.GetWindowRect(&Rect);
	ptChild.x = Rect.left;
	ptChild.y = Rect.top;

	//스크린 기준 좌표를 클라이언트 뷰 기준의 기준의 좌표로 환산한다.
	ScreenToClient(&ptChild);

	switch(nChar)
	{
	case VK_LEFT:                // 왼쪽 화살표를 누른 경우
		ptChild.x -= 10;         // 10픽셀 만큼 x좌표 값 감소
		break;
	case VK_RIGHT:               // 오른쪽 화살표를 누른 경우
		ptChild.x += 10;         // 10픽셀 만큼 x좌표 값 증가
		break;
        case VK_UP:                // 왼쪽 화살표를 누른 경우
		ptChild.y -= 10;         // 10픽셀 만큼 y좌표 값 감소
		break;
	case VK_DOWN:               // 오른쪽 화살표를 누른 경우
		ptChild.y += 10;         // 10픽셀 만큼 y좌표 값 증가
		break;
	}

	//변경된 새 좌표로 차일드 윈도우를 이동 시킨다.
	m_wndChild.SetWindowPos(&CWnd::wndTop, ptChild.x, ptChild.y, 0, 0,
		SWP_SHOWWINDOW | SWP_NOZORDER | SWP_NOSIZE);

	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

Ctrl + Keyboard 방향키로 차일드 윈도우를 이동폭이 크게 해보자


void CKeyMoveView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
                                       // WM_KEYDOWN  - 방향키로 차일드 윈도우 이동
{
	// TODO: Add your message handler code here and/or call default
	CPoint ptChild;               //차일드 윈도우의 좌표.
	CRect  Rect;                  //차일드 윈도우의 좌표 및 크기.  
	//차일드 윈도우의 두 좌표 정보 (스크린 기준)를 알아 온다.
	m_wndChild.GetWindowRect(&Rect);
       WORD ctrlResult  = ::GetKeyState(VK_CONTROL);
       BYTE  ctrlHigh    = HIBYTE(ctrlResult);
	ptChild.x = Rect.left;
	ptChild.y = Rect.top;

	//스크린 기준 좌표를 클라이언트 뷰 기준의 기준의 좌표로 환산한다.
	ScreenToClient(&ptChild);
if(ctrlResult ==0x11)
{
	switch(nChar)
	{
	case VK_LEFT:                  // Ctrl + 왼쪽 화살표를 누른 경우
		ptChild.x -= 100;         // 100픽셀 만큼 x좌표 값 감소
		break;
	case VK_RIGHT:                 // Ctrl +오른쪽 화살표를 누른 경우
		ptChild.x += 100;         // 100픽셀 만큼 x좌표 값 증가
		break;
        case VK_UP:                     // Ctrl +왼쪽 화살표를 누른 경우
		ptChild.y -= 100;         // 100픽셀 만큼 y좌표 값 감소
		break;
	case VK_DOWN:                 // Ctrl +오른쪽 화살표를 누른 경우
		ptChild.y += 100;         // 100픽셀 만큼 y좌표 값 증가
		break;
	}
}

switch(nChar)
	{
	case VK_LEFT:                // 왼쪽 화살표를 누른 경우
		ptChild.x -= 10;         // 10픽셀 만큼 x좌표 값 감소
		break;
	case VK_RIGHT:               // 오른쪽 화살표를 누른 경우
		ptChild.x += 10;         // 10픽셀 만큼 x좌표 값 증가
		break;
        case VK_UP:                // 왼쪽 화살표를 누른 경우
		ptChild.y -= 10;         // 10픽셀 만큼 y좌표 값 감소
		break;
	case VK_DOWN:               // 오른쪽 화살표를 누른 경우
		ptChild.y += 10;         // 10픽셀 만큼 y좌표 값 증가
		break;
	}

	//변경된 새 좌표로 차일드 윈도우를 이동 시킨다.
	m_wndChild.SetWindowPos(&CWnd::wndTop, ptChild.x, ptChild.y, 0, 0,
		SWP_SHOWWINDOW | SWP_NOZORDER | SWP_NOSIZE);

	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

댓글