【问题标题】:Visual C++ CEdit Control - Why is the Insertion Point changed by SetWindowText()Visual C++ CEdit 控件 - 为什么 SetWindowText() 更改了插入点
【发布时间】:2011-07-14 10:05:00
【问题描述】:

以下 sn-p 来自多行 CEdit 控件的 OnChange() 处理程序,该控件设置了“WantReturn”。

void DLG::OnChangeEditPrepareTape() 
{
    CString ss;
    std::vector<char> aTape;
    m_prepareTape.GetWindowText(ss);
    m_prepareTape.SetWindowText(ss);
}

如果 SetWindowText() 被注释掉,用户的文本会在右侧建立,一切正常。但是,随着它的进入,文本插入点移动到左边缘,并且用户的字符进入现有字符的左侧。..

我想在两个调用之间添加一些修改文本,并且可以通过子类化 CEdit 来获得我想要的。但我很想知道 Get() 和 Set() 是否有办法。

我正在使用带有 Service Pack 5 的 Visual C++ 6。现在已经 11 岁了,但正如他们所说的那样,“软件不会磨损”:-)。

【问题讨论】:

    标签: c++ mfc cedit


    【解决方案1】:

    插入点由SetWindowText() 重置,因为从控件的角度来看,它的整个文本内容刚刚被重置(可能为空字符串),并且插入点和当前选择都可能没有意义足以让他们留在身边。

    您可以使用GetSel()SetSel() 自行实现此行为:

    void DLG::OnChangeEditPrepareTape() 
    {
        CString ss;
        std::vector<char> aTape;
    
        int start, end;
        m_prepareTape.GetSel(start, end);
        m_prepareTape.GetWindowText(ss);
    
        // Tinker with the text...
    
        m_prepareTape.SetWindowText(ss);
        m_prepareTape.SetSel(start, end);
    }
    

    【讨论】:

      【解决方案2】:

      您可以在替换文本之前使用GetSel 检索光标位置,然后使用SetSel 将其放置在同一位置。

      void DLG::OnChangeEditPrepareTape() 
      {
          CString ss;
          int start, stop;
          std::vector<char> aTape;
          m_prepareTape.GetWindowText(ss);
          m_prepareTape.GetSel(&start, &stop);
          m_prepareTape.SetWindowText(ss);
          m_prepareTape.SetSel(start, stop);
      }
      

      如果您在将文本放回文本框中之前对其进行了修改,则可以相应地增加或减少 start(和 end)。

      【讨论】:

        猜你喜欢
        • 2010-12-01
        • 1970-01-01
        • 2015-09-07
        • 2010-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-15
        相关资源
        最近更新 更多