2009-09-03 4 views
1

J'ai une boîte de dialogue MFC contenant une douzaine de boutons, boutons radio et commandes d'édition en lecture seule.Laisser ma boîte de dialogue MFC recevoir des événements de frappe avant ses contrôles (MFC/Win32 équivalent de WinForms "KeyPreview")

Je voudrais savoir quand l'utilisateur tape Ctrl + V dans cette boîte de dialogue, quel que soit le contrôle qui a le focus.

S'il s'agissait de C#, je pouvais définir la propriété KeyPreview et mon formulaire recevrait toutes les séquences de touches avant les contrôles individuels - mais comment faire dans ma boîte de dialogue MFC?

Répondre

3

JTeagle a raison. Vous devez remplacer PreTranslateMessage().

// Example 
BOOL CDlgFoo::PreTranslateMessage(MSG* pMsg) 
{ 
    // Add your specialized code here and/or call the base class 
    if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) 
    { 
    int idCtrl= this->GetFocus()->GetDlgCtrlID(); 
    if (idCtrl == IDC_MY_EDIT) { 
     // do something <-------------------- 
     return TRUE; // eat the message 
    } 
    } 

    return CDialog::PreTranslateMessage(pMsg); 
} 
2

Ajoutez un gestionnaire pour remplacer PreTranslateMessage() dans la classe de boîte de dialogue et vérifiez les détails de la structure MSG reçue. Assurez-vous d'appeler la classe de base pour obtenir la bonne valeur de retour, sauf si vous voulez manger la frappe pour l'empêcher d'aller plus loin.