2011-01-15 6 views
4

Ich nur ein Dialogfeld-basierte Projekt in MFC (VS2008) erstellen und OnKeyDown Ereignis in den Dialog hinzufügen. Wenn ich das Projekt ausführen und die Tasten auf der Tastatur drücken, passiert nichts. Wenn ich jedoch alle Steuerelemente aus dem Dialogfeld entferne und das Projekt erneut ausführe, funktioniert es. Was soll ich tun, um wichtige Ereignisse zu erhalten, auch wenn ich den Dialog aktiviere?Warum fängt OnKeyDown wichtige Ereignisse in einem dialogbasierten MFC-Projekt nicht ab?

Hier ist ein Stück Code:

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

Antwort

16

Wenn ein Dialogfeld-Steuerelemente auf sich hat, der Dialog selbst nie den Fokus erhält. Es wird von den Kindersteuerungen gestohlen. Wenn Sie eine Taste drücken, wird eine WM_KEYDOWN Nachricht an das Steuerelement mit Fokus gesendet, sodass Ihr CgDlg::OnKeyDown nie aufgerufen wird. Überschreiben Sie die PreTranslateMessage Funktion des Dialogfelds, wenn Sie Dialog wollen die WM_KEYDOWN Nachricht zu handhaben:

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

    return CDialog::PreTranslateMessage(pMsg); 
} 

auch diesen Artikel auf Codeproject siehe: http://www.codeproject.com/KB/dialog/pretransdialog01.aspx

+0

Ich habe eine 'CMFCPropertyGridCtrl' in einem Dialog hinzugefügt, und ihre' OnKeyDown' Methode wird nicht aufgerufen. – manatttta

0

Viele meiner CDialog-Apps nutzen OnKeyDown(). Solange Sie nur Tasten drücken und auf dem Bildschirm zeichnen möchten (wie in einem Spiel), löschen Sie die Standardschaltflächen und statischen Text (der CDialog muss leer sein) und OnKeyDown() wird anfangen zu arbeiten. Sobald die Steuerelemente auf dem CDialog platziert sind, wird OnKeyDown() nicht mehr aufgerufen.