'WM_KEYDOWN'에 해당되는 글 1건

  1. 2006.07.02 다이얼로그 등에서 WM_KEYDOWN 처리...




다이얼로그 등에서 WM_KEYDOWN 처리

MFC 프로젝트 생성시 다이얼로그기반이나...기본 뷰클래스를 폼뷰로 설정하면 WM_KEYDOWN 메시지 핸들러를 오버라이딩해도 메시지 처리가 안된다...(나머지 경우는 모름;;;)

이유는....잘모름 ㅡㅡ;   처음 MFC 배울때 다이얼로그 기반에서 WM_KEYDOWN 메시지를 처리하려고 했는데 잘안되서 인터넷을 뒤져본 결과... PreTranslateMessage() 함수를 오버라이딩 해서 그곳에서 처리해야 한다는 것을 알게되었다....

다이얼로그나 폼뷰 기반에서 바로 KeyDown 메시지가 처리 안되는 이유는 정확하지는 않지만 컨트롤쪽으로 바로 메시지가 가서 그런것 같다...

어쨌든 위에서 말했듯이 위와 같은 상황에서는 PreTranslateMessage() 함수를 오버라이딩 한 후에 아래와 같은 식으로 처리하면 된다...

if(pMsg->wParam == VK_RETURN)
    AfxMessageBox("엔터키를 눌렀습니다.");

위와 같은 식으로 PreTranslateMessage() 함수의 매개변수를 이용해서 가상키코드를 직접 비교해서 사용하는 방법이 있고....

아래의 소스와 같이 WM_KEYDOWN 메시지를 일단 잡은 후에 사용자 정의 함수를 통해서 나머지 메시지를 처리하는 방법도 있다...

if(pMsg->message == WM_KEYDOWN)
{
    KeyDown(*pMsg);
}

// 가상키코드 처리할 사용자 정의 함수
void CPnameDlg::KeyDown(MSG pMsg)
{
    switch(pMsg.wParam)
  {
         case VK_LEFT :
                  AfxMessageBox("왼쪽 방향키를 눌렀습니다.");
                  break;
         case VK_RIGHT :
                  AfxMessageBox("오른쪽 방향키를 눌렀습니다.");
                  break;
    }
}

위에서 처리 내용을 보면 알겠지만 PreTranslateMessage() 함수는 함수명 그대로 어떤 메시지를 도중에 가로채서 처리하고자 할때 쓰일수 있는 함수이다...

데모프로그램을 보면 다이얼로그 기반에서는 ESC키나 Enter키를 누르면 다이얼로그가 닫혀버리는데(=프로그램 종료) 이런 경우에 위의 예제를 좀만 수정하면 ESC키나 Enter키에 대한 메시지를 중간에 처리함으로서 프로그램이 바로 종료되는 문제 등을 처리할 수 있다.

또한 PreTranslateMessage() 함수는 단순히 키보드 메시지외에도 다른 메시지도 오므로 매개변수를 잘 이용해서 다양한 메시지 처리를 할수 있다.

(사용언어 및 제작툴 : MFC / VC++ 6.0)

Posted by Gungume
,