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

MFC Keyboard & Message

by boolean 2015. 4. 1.
728x90

Keyboard & Message

Human Input Device

WM_CHAR WM-COMMAND

WM__KEYDOWN & OnKeyDown()

Project Name
KeyMove
Class View
CKeyMoveApp
CKeyMoveDoc
CKeyMoveView
CMainFrame

Class View ->CKeyMoveView->마우스 우클릭 ->속성(Properties) ->Messages ->WM_CREATE

int CKeyMoveView::OnCreate(LPCREATESTRUCT lpCreateStruct)      
                                                               //WM_CREATE - 차일드 윈도우 생성
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  Add your specialized creation code here
	m_wndChild.Create(_T("STATIC"), _T("KeyMove"),
		WS_CHILD | WS_VISIBLE | WS_BORDER,
		CRect(100, 100, 200, 200), this, 1234);
	return 0;
}

Class View ->CKeyMoveView->마우스 우클릭 ->속성(Properties) ->Messages ->WM_KEYDOWN

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

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

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

Class View ->CKeyMoveView->마우스 우클릭 ->속성(Properties) ->Messages ->WM_CHAR

void CKeyMoveView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
                                             // WM_CHAR  - 차일드 윈도우의 문자 변경
{
	// TODO: Add your message handler code here and/or call default
	CString strTmp;
	strTmp.Format(_T("%c"), nChar);
	m_wndChild.SetWindowText(strTmp);

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



Class View ->CKeyMoveView->마우스 우클릭 ->속성(Properties) ->Messages ->WM_SYSKEYDOWN

void CKeyMoveView::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
                                                            //시스템키  WM_SYSKEYDOWN/UP
{
	// TODO: Add your message handler code here and/or call default
	CString strMessage = TEXT("");

	WORD wResult = ::GetKeyState(VK_SPACE);  //word = 10비트
	BYTE byHigh = HIBYTE(wResult);
	if(byHigh & 0x01)
	{
		strMessage += TEXT("Alt + Space, ");
		wResult = :: GetKeyState(VK_CAPITAL); //caps lock key
		//하위 바이트의 1번 비트가 1이면 토글 키가 켜진 상태
		BYTE byLow = LOBYTE(wResult);
		if(byLow & 0x01) strMessage += TEXT("CAPS LOCK ON");
		else             strMessage += TEXT("CAPS LOCK OFF");

		AfxMessageBox(strMessage);
	}
	CView::OnSysKeyDown(nChar, nRepCnt, nFlags);
}

Class View ->CKeyMoveView->마우스 우클릭 ->속성(Properties) ->Messages ->WM_SYSCHAR

void CKeyMoveView::OnSysChar(UINT nChar, UINT nRepCnt, UINT nFlags)   
                                                 //  WM_SYSCHAR단축키 처리 키보드로 구현
{
	// TODO: Add your message handler code here and/or call default
	if(nChar == VK_RETURN)
		AfxMessageBox(TEXT("ALT + ENTER"));
	else if(nChar == 's' || nChar == 'S')
		AfxMessageBox(TEXT("Alt + S"));
	else if(nChar == 'x' || nChar == 'X')
		AfxMessageBox(TEXT("Alt + X"));

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


댓글