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

Hop*_*pyx 8 mfc cedit visual-c++

当我使用Tab键或箭头键移动到对话框上的CEdit控件时,控件中的所有文本都被选中.这种行为导致我出现问题,如果控件只将光标放在文本的开头(或结尾)并且没有选择任何内容,我会更喜欢它.有没有一种简单的方法可以做到这一点(例如我可以设置的控件的属性)?

IIn*_*ble 8

实现目标的另一种方法是阻止选择内容.在对话框中的控件上导航时,对话框管理器会查询各个控件,了解与其行为有关的某些属性.默认情况下,编辑控件以DLGC_HASSETSEL标志(以及其他)响应,以向对话管理器指示应自动选择其内容.

要解决此问题,您必须子类化编辑控件并处理WM_GETDLGCODE消息以适当地更改标志.首先,从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()
Run Code Online (Sandbox Code Playgroud)

接下来是实际控件的子类.有很多方法可以做到这一点.为简单起见,只需在对话框类中声明m_Edit1类型的类成员,CPersistentSelectionEdit并在DoDataExchange以下位置添加适当的条目:

// Subclass the edit control
DDX_Control( pDX, IDC_EDIT1, m_Edit1 );
Run Code Online (Sandbox Code Playgroud)

此时,您有一个编辑控件,导航时没有自动选择其内容.您可以根据需要控制选择.

  • 如果你使用这种方法,每次将焦点设置到文本框时都不会丢失插入位置,所以我更喜欢它. (2认同)

Nic*_*kis 2

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

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