2011-01-15 4 views
4

MFC (VS2008)에서 대화 상자 기반 프로젝트를 만들고 대화 상자에 OnKeyDown 이벤트를 추가하십시오. 프로젝트를 실행하고 키보드의 키를 누르면 아무 일도 일어나지 않습니다. 하지만 대화 상자에서 모든 컨트롤을 제거하고 프로젝트를 다시 실행하면 작동합니다. 대화 상자에 컨트롤이있는 경우에도 키 이벤트를 가져 오려면 어떻게해야합니까? 대화가에 컨트롤이되면 대화 자체가 포커스를받을 결코왜 OnKeyDown 대화 상자 기반 MFC 프로젝트에서 키 이벤트를 catch하지 않습니다?

void CgDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{ 
    // TODO: Add your message handler code here and/or call default 
    AfxMessageBox(L"Key down!"); 
    CDialog::OnKeyDown(nChar, nRepCnt, nFlags); 
} 

답변

16

:

여기에 코드 조각입니다. 그것은 어린이 통제에 의해 도난당했습니다. 단추를 누르면 CgDlg::OnKeyDown이 호출되지 않으므로 포커스가있는 컨트롤로 WM_KEYDOWN 메시지가 전송됩니다. 당신은 대화가 WM_KEYDOWN 메시지를 처리하려면 대화 상자의 PreTranslateMessage 함수를 재정의 :

BOOL CgDlg::PreTranslateMessage(MSG* pMsg) 
{ 
    if(pMsg->message == WM_KEYDOWN ) 
    { 
     if(pMsg->wParam == VK_DOWN) 
     { 
     ... 
     } 
     else if(pMsg->wParam == ...) 
     { 
     ...      
     } 
     ... 
     else 
     { 
     ...     
     } 
    } 

    return CDialog::PreTranslateMessage(pMsg); 
} 

는 또한 CodeProject의에이 문서를 참조하십시오 : http://www.codeproject.com/KB/dialog/pretransdialog01.aspx 내 CDialog를 애플 리케이션의

+0

대화 상자에'CMFCPropertyGridCtrl'을 추가했고,'OnKeyDown' 메서드가 호출되지 않았습니다. – manatttta

0

많은 onKeyDown에()를 사용합니다. 게임을 할 때와 마찬가지로 키 누름과 화면 그리기를 원할 경우 기본 단추와 정적 텍스트 (CDialog는 비어 있어야 함)를 삭제하고 OnKeyDown()이 작동하기 시작합니다. 컨트롤이 CDialog에 배치되면 OnKeyDown()이 더 이상 호출되지 않습니다.