Visual c++ CEdit在获得焦点时选择所有内容

Visual c++ CEdit在获得焦点时选择所有内容,visual-c++,mfc,cedit,Visual C++,Mfc,Cedit,当我使用tab键或箭头键移动到对话框上的CEdit控件时,该控件中的所有文本都被选中。这种行为给我带来了问题,如果控件只是将光标放在文本的开头(或结尾),而没有选择任何内容,我会更愿意这样做。 有没有一种简单的方法可以做到这一点(例如,我可以设置控件的属性)?我认为不存在这种样式。 但您可以使用向导添加OnSetfocus处理程序: void CMyDlg::OnSetfocusEdit1() { CEdit* e = (CEdit*)GetDlgItem(IDC_EDIT1); e-

当我使用tab键或箭头键移动到对话框上的CEdit控件时,该控件中的所有文本都被选中。这种行为给我带来了问题,如果控件只是将光标放在文本的开头(或结尾),而没有选择任何内容,我会更愿意这样做。
有没有一种简单的方法可以做到这一点(例如,我可以设置控件的属性)?

我认为不存在这种样式。
但您可以使用向导添加OnSetfocus处理程序:

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

e->SetSel(0);//实现目标的另一种方法是阻止选择内容。在对话框中的控件上导航时,对话框管理器会查询相应控件有关其行为的某些属性。默认情况下,编辑控件会使用
DLGC\u HASSETSEL
标志(以及其他标志)进行响应向对话框管理器指示其内容应自动选择

要解决这个问题,您必须对编辑控件进行子类化,并处理消息以适当地更改标志。首先,从
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()
下一步是对实际控件进行子类化。有很多方法可以做到这一点。要保持简单,只需在对话框类中声明类型为
CPersistentSelectionEdit
的类成员
m_Edit1
,并在
DoDataExchange
中添加适当的条目:

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

此时,您有一个编辑控件,当导航到该控件时,该控件的内容不会被自动选择。您可以按任何方式控制选择。

请注意,您的程序中必须有代码来突出显示选择。请查找类似以下内容:

CEdit* pEdit = ((CEdit*)GetDlgItem(IDC_EDIT1));
pEdit->SetFocus();
pEdit->SetSel(0, -1); // select everything

只需注释最后两行,而不是>SetSel(0)。您的代码正在启用和禁用,这对我来说毫无意义。

如果使用此方法,您不会在每次将焦点设置到文本框时丢失插入符号位置,因此我更喜欢它。这对我来说不太管用。我的编辑控件是多行的,其内容可能比控件高(我有一个垂直滚动条)。bNoScroll需要为TRUE,而“no select”的选择为-1,0,因此我的代码将其称为
e->SetSel(-1,0,TRUE);
。这将在我通过对话框的控件进行制表时保持任何当前滚动位置,但也确保焦点返回到编辑控件后不会选择任何内容。