2010-01-02 9 views
7

Cuando me muevo a un control CEdit en mi cuadro de diálogo usando la tecla de tabulación o las teclas de flecha, se selecciona todo el texto en el control. Este comportamiento me está causando problemas y preferiría que el control simplemente colocara el cursor al inicio (o final) del texto y no seleccionara nada. ¿Hay una manera simple de hacerlo (por ejemplo, una propiedad del control que puedo configurar)?CEdit selecciona todo al obtener el foco

Respuesta

2

No creo que exista tal estilo.
Pero puede agregar manejador OnSetFocus con el asistente:

void CMyDlg::OnSetfocusEdit1() 
{ 
    CEdit* e = (CEdit*)GetDlgItem(IDC_EDIT1); 
    e->SetSel(0); // <-- hide selection 
} 
+0

Esto no funcionó para mí. Mi control de edición es multi-línea y cuyos contenidos pueden ser más altos que el control (tengo una barra de desplazamiento vertical). El bNoScroll debe ser VERDADERO, y la selección para "no seleccionar" es -1, 0, entonces mi código lo llamó como 'e-> SetSel (-1, 0, TRUE);'. Esto mantiene cualquier posición de desplazamiento actual a medida que paso por los controles de mi diálogo, pero también garantiza que no se seleccione nada una vez que el foco regrese a mi control de edición. – franji1

7

Otra forma de lograr su objetivo es evitar que el contenido de ser seleccionado. Al navegar por controles en un diálogo, el administrador de diálogo consulta los controles respectivos sobre ciertas propiedades relacionadas con su comportamiento. Por defecto, un control de edición responde con un indicador DLGC_HASSETSEL (entre otros) para indicar al administrador de diálogo que su contenido debe ser seleccionado automáticamente.

Para solucionar este problema, debe crear una subclase en el control de edición y manejar el mensaje WM_GETDLGCODE para alterar las banderas de forma adecuada. En primer lugar, derive una clase de CEdit:

class CPersistentSelectionEdit : public CEdit { 
public: 
    DECLARE_MESSAGE_MAP() 
    afx_msg UINT OnGetDlgCode() { 
     // Return default value, removing the DLGC_HASSETSEL flag 
     return (CEdit::OnGetDlgCode() & ~DLGC_HASSETSEL); 
    } 
}; 

BEGIN_MESSAGE_MAP(CPersistentSelectionEdit, CEdit) 
    ON_WM_GETDLGCODE() 
END_MESSAGE_MAP() 

siguiente subclase el control real. hay muchas maneras de hacer esto. Para simplificar las cosas simplemente declarar un miembro de la clase de tipo m_Edit1CPersistentSelectionEdit en la clase de diálogo y añadir una entrada adecuada en DoDataExchange:

// Subclass the edit control 
DDX_Control(pDX, IDC_EDIT1, m_Edit1); 

En este punto, usted tiene un control de edición que no tiene su contenido de auto-seleccionados cuando se navega hacia. Puede controlar la selección de la forma que desee.

+2

Si usa este método, no pierde la posición de intercalación cada vez que establece el foco en el cuadro de texto, por lo que lo preferiría. – DanDan

Cuestiones relacionadas