【问题标题】:Windows Forms Textbox: Selection and Caret positionWindows 窗体文本框:选择和插入符号位置
【发布时间】:2015-07-19 12:40:08
【问题描述】:

设置了 SelectionStart 和 SelectionLength 后,插入符号位于选择的末尾。

如何将插入符号移到所选内容的开头?


我现在尝试了这个:其他线程没有回答这个问题

SelectionStart = selStart;  // set the desired position
SelectionLength = 0;
MyLibs.WindowsDll.POINT point;
MyLibs.WindowsDll.GetCaretPos(out point); // save the position
SelectionLength = restOfWord.Length;      // extend the selection
MyLibs.WindowsDll.SetCaretPos(point.X, point.Y);  // restore caret position

GetCaretPos 和 SetCaretPos 以某种方式工作,但不是应该的。 使用上面的代码 sn -p,插入符号确实在选择的开头闪烁。

但是...然后我按退格键或向左/向右光标,插入符号的行为仍然像它仍在选择的末尾一样。

【问题讨论】:

  • 不要认为只使用托管代码是可能的。查看this 类似问题。
  • 您也可以查看链接here

标签: c# windows forms textbox


【解决方案1】:

很遗憾,您无法使用 C# 等托管代码执行此操作, 但要实现这个目标,您可以使用 C++,SetFocus() 函数, 例如:

//use SetFocus()
pEdit->SetFocus()
//place caret at the end:
pEdit->SendMessage (WM_KEYDOWN,VK_END,0);
//simulate keyup:
m_Edit->SendMessage (WM_KEYUP,VK_END,0);
//send the key code:
m_Edit->SendMessage(WM_CHAR,'A',0);

查看 MSDN:https://msdn.microsoft.com/en-us/library/windows/desktop/ms646312(v=vs.85).aspx

您也可以使用CEdit::SetSel 来实现:

CEdit* e = (CEdit*)GetDlgItem(IDC_EDIT1);
e->SetFocus();
e->SetSel(0,-1); // move cursor at the end
e->SetSel(-1); // remove selection

查看 Stackoverflow 问题的详细信息:CEdit control MFC, placing cursor to end of string after SetWindowText

更新:

如果您需要将位置设置为开头,您可以在显示文本之前将插入符号位置重置为开始:

SetSel (0,0);

在使用基本 C#/C++ 函数选择文本的同时,您不能将插入符号移到开头,但是您可以使用 C++ 或/和 Assembler 覆盖基本的“插入符号”逻辑。

【讨论】:

  • 问题不在于将插入符号/光标设置在文本的末尾,而是设置在选择的开头。 (所选区域左侧的插入符号)
  • 使用 SetSel(0,0) 光标位于编辑控件的开头。但我想要的是例如选择字符 4 到 10 并在第 4 个字符之前而不是在第 10 个字符之后使用插入符号。
猜你喜欢
  • 2011-01-08
  • 2016-03-12
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多