2009-02-12 11 views

Respuesta

2

asegurarse de que el estilo ES_WANTRETURN control de edición se encuentra en el recurso de diálogo para el control

+0

Esto no funciona. Esto no es lo que quiero. Quiero obtener la tecla RETORNO Y hacer algo. No solo permite ingresar la tecla RETORNO. – knaser

+0

Luego necesitará subclasificar el control de edición y manejar los mensajes WM_CHAR o KeyDown que se responden en otras preguntas SO. O dentro del MessageMap del diálogo, maneje Editar Cambiar mensajes desde el control (enviado para cada personaje). – SAMills

+1

ES_WANTRETURN es * solo * aplicable para cuadros de texto de varias líneas. –

14

También puede filtrar la llave en PreTranslateMessage de su diálogo. Si obtiene WM_KEYDOWN para VK_RETURN, llame al GetFocus. Si el foco está en su control de edición, llame a su manejo para la devolución presionada en el control de edición.

Tenga en cuenta que el orden de las cláusulas en el si se basa en un cortocircuito es eficiente.

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 respuesta correcta es la de manejar el mensaje WM_GETDLGCODE/OnGetDlgCode. Allí puede especificar que desea que su clase maneje todas las claves.

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

Por defecto, la tecla de retorno cierra un diálogo MFC. Esto se debe a que la tecla Devolver hace que se llame a la función CDialogOnOK(). Puede anular esa función para interceptar la clave Devolver. Obtuve la idea básica de this article (ver Método 3 al final).

En primer lugar, asegúrese de que ha agregado un miembro para el control de edición a su diálogo con el Class Wizard, por ejemplo:

CEdit m_editFind; 

A continuación, se puede añadir el siguiente prototipo de función en el archivo de encabezado de su diálogo:

protected: 
    virtual void OnOK(); 

a continuación, se puede añadir lo siguiente a la aplicación CPP archivo de su diálogo:

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

Tenga en cuenta: Si usted tiene un botón de OK en su cuadro de diálogo que tiene el ID de IDOK, entonces también llamará OnOK(). Si esto le causa algún problema, debe redirigir el botón a otra función de controlador. Cómo hacer esto también se describe en Método 3 de the article que he mencionado anteriormente.

Cuestiones relacionadas