【问题标题】:CEdit selects everything when getting focusCEdit 在获得焦点时选择所有内容
【发布时间】:2010-12-31 19:55:01
【问题描述】:

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

【问题讨论】:

    标签: visual-c++ mfc cedit


    【解决方案1】:

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

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

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

    此时,您有一个编辑控件,它在导航到时不会自动选择其内容。您可以随心所欲地控制选择。

    【讨论】:

    • 如果使用这种方法,每次将焦点设置到文本框时都不会丢失插入符号的位置,所以我更喜欢它。
    【解决方案2】:

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

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

    【讨论】:

    • 这对我来说不太适用。我的编辑控件是多行的,其内容可以高于控件(我有一个垂直滚动条)。 bNoScroll 需要为 TRUE,并且“无选择”的选择是 -1, 0,所以我的代码将其称为 e-&gt;SetSel(-1, 0, TRUE);。当我通过我的对话框的控件进行选项卡时,这将保持任何当前滚动位置,但也确保一旦焦点返回到我的编辑控件时没有选择任何内容。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 1970-01-01
      • 2011-03-13
      • 2014-05-29
      • 2010-10-03
      • 2010-11-13
      • 2012-12-02
      • 1970-01-01
      • 2010-11-30
      相关资源
      最近更新 更多