2010-01-02 6 views
7

Lorsque je passe à un contrôle CEdit dans ma boîte de dialogue à l'aide de la touche de tabulation ou des touches fléchées, tout le texte du contrôle est sélectionné. Ce comportement me cause des problèmes et je préférerais que le contrôle mette simplement le curseur au début (ou à la fin) du texte et ne sélectionne rien. Existe-t-il un moyen simple de le faire (par exemple, une propriété du contrôle que je peux définir)?CEdit sélectionne tout lors de la mise au point

Répondre

2

Je ne pense pas qu'un tel style existe.
Mais vous pouvez ajouter gestionnaire onSetFocus avec l'assistant:

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

Cela n'a pas vraiment fonctionné pour moi. Mon contrôle d'édition est multi-ligne et dont le contenu peut être plus grand que le contrôle (j'ai une barre de défilement verticale). Le bNoScroll doit être TRUE, et la sélection pour "no select" est -1, 0, donc mon code l'appelle "e-> SetSel (-1, 0, TRUE);". Cela maintient toute position de défilement en cours lorsque je passe d'un onglet à l'autre dans les commandes de ma boîte de dialogue, mais aussi que rien n'est sélectionné une fois que le focus revient à mon contrôle d'édition. – franji1

7

Une autre façon d'atteindre votre objectif est d'empêcher le contenu d'être sélectionné. Lors de la navigation sur les contrôles dans une boîte de dialogue, le gestionnaire de dialogue interroge les contrôles respectifs sur certaines propriétés relatives à leur comportement. Par défaut, un contrôle d'édition répond avec un indicateur DLGC_HASSETSEL (entre autres) pour indiquer au gestionnaire de boîtes de dialogue que son contenu doit être sélectionné automatiquement. Pour contourner ce problème, vous devez sous-classer le contrôle d'édition et gérer le message WM_GETDLGCODE pour modifier les indicateurs de façon appropriée. Tout d'abord, dériver une classe 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() 

sous-classe suivant le contrôle effectif. Il y a un certain nombre de façons de le faire. Pour garder les choses simples simplement déclarer un membre de la classe m_Edit1 de type CPersistentSelectionEdit dans votre classe de dialogue et ajoutez une entrée appropriée dans DoDataExchange:

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

À ce stade, vous avez un contrôle d'édition qui ne possède pas son contenu sélectionné automatiquement lorsque navigué vers. Vous pouvez contrôler la sélection comme vous le souhaitez.

+2

Si vous utilisez cette méthode, vous ne perdez pas la position du curseur chaque fois que vous placez le focus sur la zone de texte, donc je le préfère. – DanDan