다이얼로그에서 키보드 메시지(이벤트) 받기

프로그래밍/c++ 2013. 1. 28. 12:06

다이얼로그(CDialog)에서 키보드 이벤트(메시지)를 받고 싶은 경우 App 에서 PreTranslateMessage 함수를 다음과 같이 Override하여 키 이벤트를 대화상자에 전달해 주어야 합니다.


BOOL CWinApp::PreTranslateMessage(MSG* pMsg)

{

if (pMsg->message == WM_CHAR)

{

this->m_pMainWnd->SendMessage(WM_CHAR, pMsg->wParam, pMsg->lParam);

// return TRUE;

}

return CWinAppEx::PreTranslateMessage(pMsg);

}


주의사항 1.

만일 return TRUE를 주석처리하지 않으면 CWinAppEx::PreTranslateMessage(pMsg)가 실행되지 않기 때문에 대화상자의 컨트롤들이 정상 동작하지 않게 됩니다. 예를 들어, CEdit 컨트롤에 텍스트를 입력할 수 없게 됩니다.


주의사항 2.

WM_CHAR 메시지로는 shift, ctrl, 화살표 키 등 특수키들을 받을 수 없습니다. 특수키들도 처리하고 싶으면 다음과 같이 WM_KEYDOWN, WM_KEYUP로 처리해야 합니다.


BOOL CWinApp::PreTranslateMessage(MSG* pMsg)

{

if (pMsg->message==WM_KEYDOWN || pMsg->message==WM_KEYUP)

{

this->m_pMainWnd->SendMessage(pMsg->message, pMsg->wParam, pMsg->lParam);

}

return CWinAppEx::PreTranslateMessage(pMsg);

}


by 다크 프로그래머