728x90
반응형
키보드 메시지와 메시지 핸들러 함수
- 키보드 메시지와 메시지 핸들러 함수
메시지 유형 | 발생 상황 | 메시지 핸들러 함수 |
WM_KEYDOWN | 키를 누름 | OnKeyDown() |
WM_KEYUP | 키에서 손을 뗌 | OnKeyUp() |
WM_CHAR | 화면에 문자가 표시되는 키를 누름 | OnChar() |
- 문자가 입력된 이벤트에 발생되는 메시지
ㄴ 먼저 WM_KEYDOWN이 발생되고, WM_CHAR가 발생되고 마지막으로 WM_KEYUP이 발생된다.
- 키보드 메시지 핸들러 함수
nChar : 눌려진 키의 가상키 코드
nRepCount : 키를 계속 누르고 있을 경우 반복된 키의 입력 횟수
nFlags : 키보드에 대한 상태정보
실습1
방향키, 페이지 업, 페이지 다운, Home키
← (x좌표 왼쪽으로 1씩 이동)
→ (x좌표 오른쪽으로 1씩 이동)
↑ (y좌표 위로 1씩 이동)
↓ (y좌표 아래로 1씩 이동)
PgUp : y좌표를 위로 50만큼 이동
PgDn : y좌표를 아래로 50만큼 이동
Home키 : (0, 0)로 이동
- OnKeyDown() 추가하기
void CP40913View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
switch (nChar)
{
case VK_LEFT:
m_ptText.x -= 1;
break;
case VK_RIGHT:
m_ptText.x += 1;
break;
case VK_UP:
m_ptText.y -= 1;
break;
case VK_DOWN:
m_ptText.y += 1;
break;
case VK_PRIOR: //PgUp
m_ptText.y -= 50;
break;
case VK_NEXT: //PgDn
m_ptText.y += 50;
break;
case VK_HOME: //Home
m_ptText = CPoint(0, 0);
break;
}
Invalidate();
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
- CPoint m_ptrText; 변수 선언 후 변수 초기화
// CP40913View 생성/소멸
CP40913View::CP40913View() noexcept
{
// TODO: 여기에 생성 코드를 추가합니다.
m_ptrText = CPoint(100, 100);
}
- OnDraw() 에서 텍스트 출력 좌표 변수.좌표로 수정하기
void CP40913View::OnDraw(CDC* pDC)
{
CP40913Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.
pDC->TextOutW(m_ptText.x, m_ptText.y, m_strText);
}
실습2
실습2의 문자열 이동 시 클라이언트 영역을 벗어날 경우 경고메시지 출력
- OnKeyDown() 코드 수정하기
void CP40913View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
switch (nChar)
{
case VK_LEFT:
m_ptText.x -= 1;
break;
case VK_RIGHT:
m_ptText.x += 1;
break;
case VK_UP:
m_ptText.y -= 1;
break;
case VK_DOWN:
m_ptText.y += 1;
break;
case VK_PRIOR: //PgUp
m_ptText.y -= 50;
break;
case VK_NEXT: //PgDn
m_ptText.y += 50;
break;
case VK_HOME: //Home
m_ptText = CPoint(0, 0);
break;
}
CRect rect;
GetClientRect(&rect);
if (m_ptText.x < 0)
{
m_ptText.x = 0;
AfxMessageBox(_T("더 이상 왼쪽으로 이동할 수 없습니다."));
}
if (m_ptText.x > rect.right)
{
m_ptText.x = rect.right;
AfxMessageBox(_T("더 이상 오른쪽으로 이동할 수 없습니다."));
}
if (m_ptText.y < 0)
{
m_ptText.y = 0;
AfxMessageBox(_T("더 이상 위쪽으로 이동할 수 없습니다."));
}
if (m_ptText.y > rect.bottom)
{
m_ptText.y = rect.bottom;
AfxMessageBox(_T("더 이상 아레쪽으로 이동할 수 없습니다."));
}
Invalidate();
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
728x90
반응형