2009-02-12 13 views

Répondre

2

Assurez-vous que le style Edit Control ES_WANTRETURN est défini dans la ressource de dialogue pour le contrôle

+0

Cela ne fonctionne pas. Ce n'est pas ce que je veux. Je veux obtenir la touche RETOUR et faire quelque chose. Ne laissez pas simplement entrer la touche RETURN. – knaser

+0

Ensuite, vous devrez sous-classer le contrôle d'édition et gérer les messages WM_CHAR ou KeyDown auxquels on répond dans d'autres questions SO. OU dans MessageMap de la boîte de dialogue, gérer Modifier les messages de modification à partir du contrôle (envoyé pour chaque caractère). – SAMills

+1

ES_WANTRETURN est * seulement * applicable aux zones de texte multilignes. –

14

Vous pouvez également filtrer la clé dans PreTranslateMessage votre boîte de dialogue. Si vous obtenez WM_KEYDOWN pour VK_RETURN, appelez GetFocus. Si le focus est sur votre contrôle d'édition, appelez votre manipulation pour le retour appuyé dans le contrôle d'édition.

Veuillez noter que l'ordre des clauses dans le cas de mise en court-circuit est efficace.

BOOL CMyDialog::PreTranslateMessage(MSG* pMsg) 
{ 
    if (pMsg->message == WM_KEYDOWN && 
     pMsg->wParam == VK_RETURN && 
     GetFocus() == m_EditControl) 
    { 
     // handle return pressed in edit control 
     return TRUE; // this doesn't need processing anymore 
    } 
    return FALSE; // all other cases still need default processing 
} 
2

La bonne réponse est de gérer le message WM_GETDLGCODE/OnGetDlgCode. Là, vous pouvez spécifier que vous voulez que toutes les clés soient gérées par votre classe.

UINT CMyEdit::OnGetDlgCode() 
{ 
    return CEdit::OnGetDlgCode() | DLGC_WANTALLKEYS; 
} 
1

Par défaut, la touche Retour ferme une boîte de dialogue MFC. Ceci est dû au fait que la touche Return (retour) provoque l'appel de la fonction OnOK(). Vous pouvez remplacer cette fonction afin d'intercepter la touche Return. J'ai eu l'idée de base de this article (voir Méthode 3 à la fin).

Tout d'abord, assurez-vous que vous avez ajouté un membre pour le contrôle d'édition de votre boîte de dialogue à l'aide du Class Wizard, par exemple:

CEdit m_editFind; 

Ensuite, vous pouvez ajouter le prototype de fonction suivante dans le fichier d'en-tête de votre dialogue:

protected: 
    virtual void OnOK(); 

vous pouvez ajouter la mise en œuvre suivante au fichier cpp de votre boîte de dialogue:

void CMyDialog::OnOK() 
{ 
    if(GetFocus() == &m_editFind) 
    { 
     // TODO: Add your handling of the Return key here. 
     TRACE0("Return key in edit control pressed\n"); 

     // Call `return` to leave the dialog open. 
     return; 
    } 

    // Default behavior: Close the dialog. 
    CDialog::OnOK(); 
} 

S'il vous plaît noter: Si vous avez un bouton OK dans votre boîte de dialogue qui a l'ID IDOK, il appellera également OnOK(). Si cela vous cause des problèmes, vous devez rediriger le bouton vers une autre fonction de gestionnaire. Comment faire cela est également décrit dans Méthode 3 de the article que j'ai mentionné ci-dessus.

Questions connexes