并VS2008 / VS2010有一个插入位置在文本框更改事件?(does vs2008/vs201

2019-09-30 16:14发布

我需要留意一个文本框里面插入位置; 是有这样的一个事件? 我不想用这个定时器(例如,检查每10ms,如果位置发生变化)。

我使用Windows窗体。

Answer 1:

本地的Windows控制不会产生这种通知。 试图解决这个限制对于疼痛的处方,你就不能告诉尖号所在位置。 所述SelectionStart属性不是一个可靠的指标,光标可以在选择的任一端出现,这取决于在什么方向上的用户选定的文本。 Pinvoking GetCaretPos()给出了当控制具有焦点该回一个字符索引不是那么容易的插入位置,但映射由于TextRenderer.MeasureText不精确()。

不要去那里。 相反,解释为什么你认为你需要这个。



Answer 2:

希望这会有所帮助。 我这样做对移动鼠标

private void txtTest_MouseMove(object sender, MouseEventArgs e)
{
   string str = "Character{0} is at Position{1}";
   Point pt = txtTest.PointToClient(Control.MousePosition);
   MessageBox.Show(
      string.Format(str
      , txtTest.GetCharFromPosition(pt).ToString()
      , txtTest.GetCharIndexFromPosition(pt).ToString())
   );
}


Answer 3:

大多数文本控件将具有KeyDownKeyUp ,你可以用它来找出按下了哪个键事件。

我已经联系到的WinForms TextBox ,因为你没有指定要使用哪种技术。

有没有直接的方法却告诉光标所在的区域内。



Answer 4:

我不知道如果SelectionChanged事件触发evon上改变插入位置,但你应该试一试。

如果没有,你可以创建一个定时器,请检查是否SelectionStart属性值的变化。

更新:这是相当简单的创建提出了SelectionChanged事件一个TextBox类:

public class TextBoxEx : TextBox
{

    #region SelectionChanged Event

    public event EventHandler SelectionChanged;

    private int lastSelectionStart;
    private int lastSelectionLength;
    private string lastSelectedText;
    private void RaiseSelectionChanged()
    {
        if (this.SelectionStart != lastSelectionStart || this.SelectionLength != lastSelectionLength || this.SelectedText != lastSelectedText)
            OnSelectionChanged();

        lastSelectionStart = this.SelectionStart;
        lastSelectionLength = this.SelectionLength;
        lastSelectedText = this.SelectedText;
    }

    protected virtual void OnSelectionChanged()
    {
        var eh = SelectionChanged;
        if (eh != null)
        {
            eh(this, EventArgs.Empty);
        }
    }

    #endregion

    protected override void OnKeyDown(KeyEventArgs e)
    {
        base.OnKeyDown(e);
        RaiseSelectionChanged();
    }

    protected override void OnKeyUp(KeyEventArgs e)
    {
        base.OnKeyUp(e);
        RaiseSelectionChanged();
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        base.OnMouseDown(e);
        RaiseSelectionChanged();
    }

    protected override void OnMouseUp(MouseEventArgs mevent)
    {
        base.OnMouseUp(mevent);
        RaiseSelectionChanged();
    }

}


文章来源: does vs2008/vs2010 has a caret position changed event in TextBox?