假设我有一个带有文字"的editBox,这是edit">
然后我想把文本改成"second">
我认为这样编码是可以的:
m_edit1.SetWindowTextW(_T("this is edit"));
m_edit1.SetWindowTextW(_T("second"));
但是我看到他们使用的其他程序是这样的:
m_edit1.SetWindowTextW(_T("this is edit"));
m_edit1.SetSel(0, -1, TRUE);
m_edit1.Clear();
m_edit1.SetWindowTextW(_T("second"));
我的问题是:
如果我们可以像第一个代码示例一样覆盖它,为什么他们在这种情况下使用SetSel()
,Clear()
??
以下代码
m_edit1.SetSel(0, -1, TRUE);
m_edit1.Clear();
在上面给出的上下文中,没有实际用途。m_edit1.Clear()
向
WM_CLEAR
消息可以通过向编辑控件发送EM_UNDO消息来撤消
一旦m_edit1.SetWindowTextW(L"second")
运行完成,这个机会就消失了。总之,执行问题中的第一个和第二个代码片段在可观察行为上没有区别。它们都导致一个编辑控件持有文本"second"
和一个空的撤消队列。
如果确实是为了支持撤销操作,则需要调整代码以发送EM_REPLACESEL
消息来代替WM_SETTEXT
:
m_edit1.SetWindowTextW(L"this is edit");
m_edit1.SetSel(0, -1, TRUE);
m_edit1.ReplaceSel(L"second", TRUE);
这使得编辑控件显示文本"second"
,但有一个非空的撤消队列。向控件发送EM_UNDO
消息将使其再次显示"this is edit"
。请注意,编辑控件的撤消队列的长度不超过1。