Visual C ++ CEdit控件 - 为什么SetWindowText()改变了插入点

时间:2011-03-13 10:56:32

标签: c++ mfc cedit

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

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

如果SetWindowText()被注释掉,则用户的文本会在右侧构建,一切都很好。但是,有了它,文本插入点移动到左边缘,用户的字符进入现有字符的左侧..

我想在两个调用之间添加一些修改文本,并且可以通过继承CEdit来获得我想要的内容。但我有兴趣知道是否有一种方法可以通过Get()&amp; ()设置。

我正在使用带有Service Pack 5的Visual C ++ 6.现在已有11年了,但随后“软件不会耗尽”,因为他们说: - )。

2 个答案:

答案 0 :(得分:2)

插入点由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);
}

答案 1 :(得分:1)

您可以在替换文本之前使用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)。