2010-01-02 113 views
7

当我使用Tab键或方向键移动到对话框上的CEdit控件时,控件中的所有文本都被选中。这种行为会引起我的问​​题,如果控件只是将光标放在文本的开始(或结束)并且没有选择任何东西,我更喜欢它。 有没有简单的方法来做到这一点(例如,我可以设置的控件属性)?CEdit在获取焦点时选择所有内容

回答

2

我不认为这样的风格存在。
但是你可以用向导中添加的onSetFocus处理程序:

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

这并不适合我。我的编辑控件是多行的,其内容可以比控件高(我有一个垂直滚动条)。 bNoScroll需要为TRUE,并且“no select”的选择是-1,0,所以我的代码称它为'e-> SetSel(-1,0,TRUE);'。当我通过我的对话框的控件选项卡时,这将保持任何当前的滚动位置,但也确保一旦焦点返回到我的编辑控件,就不会选择任何内容。 – franji1 2017-07-05 16:25:04

7

实现目标的另一种方法是,以防止被选择的内容。在对话框中浏览控件时,对话框管理器将查询与其行为有关的某些属性的相应控件。默认情况下,编辑控件会响应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() 

下一个子类的实际控制。有很多方法可以做到这一点。为了简单起见,只需要声明一个类成员CPersistentSelectionEditm_Edit1在对话框类,并添加DoDataExchange相应的条目:

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

在这一点上,你有没有它的内容编辑控制,自动选择当导航到。您可以根据需要控制选择。

+2

如果您使用此方法,则每次将焦点设置到文本框时都不会丢失插入位置,所以我更喜欢它。 – DanDan 2014-08-14 23:22:48

相关问题