2010-01-02 12 views
7

Quando si passa a un controllo CEdit nella mia finestra di dialogo utilizzando il tasto tabulazione oi tasti freccia, viene selezionato tutto il testo nel controllo. Questo comportamento mi sta causando problemi e lo preferirei se il controllo posizionasse il cursore all'inizio (o alla fine) del testo e non selezionasse nulla. C'è un modo semplice per farlo (ad esempio una proprietà del controllo che posso impostare)?CEdit seleziona tutto quando ottiene lo stato attivo

risposta

2

Non penso che esista un tale stile.
Ma è possibile aggiungere gestore onSetFocus con la procedura guidata:

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

Questo non ha funzionato per me. Il mio controllo di modifica è multilinea e il cui contenuto può essere più alto del controllo (ho una barra di scorrimento verticale). Il bNoScroll deve essere VERO, e la selezione per "no select" è -1, 0, quindi il mio codice lo ha chiamato come 'e-> SetSel (-1, 0, TRUE);'. Questo mantiene qualsiasi posizione di scorrimento corrente mentre passo attraverso i controlli della mia finestra di dialogo, ma assicura anche che nulla venga selezionato una volta che la messa a fuoco ritorna al mio controllo di modifica. – franji1

7

Un altro modo di raggiungere il vostro obiettivo è quello di impedire che il contenuto venga selezionato. Quando si naviga sui controlli in una finestra di dialogo, il gestore di finestre interroga i rispettivi controlli su determinate proprietà relative al loro comportamento. Per impostazione predefinita, un controllo di modifica risponde con un flag DLGC_HASSETSEL per indicare al gestore di finestre di dialogo che il suo contenuto deve essere selezionato automaticamente.

Per risolvere il problema, è necessario creare una sottoclasse del controllo di modifica e gestire il messaggio WM_GETDLGCODE per modificare i flag in modo appropriato. In primo luogo, derivare una classe da 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() 

sottoclasse Avanti il ​​controllo effettivo. Ci sono diversi modi per farlo. Per semplificare le cose solo dichiarare un membro della classe m_Edit1 di tipo CPersistentSelectionEdit nella classe di finestra di dialogo e aggiungere una voce appropriata in DoDataExchange:

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

A questo punto si dispone di un controllo di modifica che non ha il suo contenuto di auto-selezionato quando navigato a. Puoi controllare la selezione come preferisci.

+2

Se si utilizza questo metodo non si perde la posizione del cursore ogni volta che si imposta lo stato attivo sulla casella di testo, quindi preferisco. – DanDan

Problemi correlati