私はTextBox内のキャレット位置を見守る必要があります。このイベントがありますか?私はこれのためにタイマーを使用したくない(例えば、位置が変更された場合は10msごとにチェックする)。vs2008/vs2010にTextBoxのキャレット位置変更イベントがありますか?
私はWindowsフォームを使用しています。
私はTextBox内のキャレット位置を見守る必要があります。このイベントがありますか?私はこれのためにタイマーを使用したくない(例えば、位置が変更された場合は10msごとにチェックする)。vs2008/vs2010にTextBoxのキャレット位置変更イベントがありますか?
私はWindowsフォームを使用しています。
私は、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();
}
}
SelectionChangedはWindowsフォームでは発生しません – Abel
@Abel、それは事実ですが、私はちょうどSelectionChangedイベントを発生させるTextBoxで投稿を更新しました。 –
ネイティブのWindowsコントロールは、このための通知を生成しません。この制限を回避しようとするのは苦痛のためのレシピです。キャレットがどこにあるかはわかりません。 SelectionStartプロパティがではない信頼できるインジケータの場合、ユーザーが選択したテキストの方向に応じて、選択の両端にキャレットが表示されます。 Pinvoking GetCaretPos()は、コントロールにフォーカスがあるときにキャレットの位置を返しますが、TextRenderer.MeasureText()の不正確さのために文字インデックスに戻すマッピングは簡単ではありません。
ここには行かないでください。代わりに、なぜあなたがこれを必要と思うか説明してください。
これが役に立ちます。私はマウス移動でこれを行った
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())
);
}
Winforms、webforms、またはWPF? – Oded