Laden...

[Workaround] TextBox: Caret hinter das letzte Zeichen setzen (ohne SelectionStart)

Letzter Beitrag vor 15 Jahren 4 Posts 1.794 Views
[Workaround] TextBox: Caret hinter das letzte Zeichen setzen (ohne SelectionStart)

Hallo zusammen,

ich sitze immer noch an meiner Drag&Drop-TextBox und habe schon wieder ein Problem, das mich jetzt ne ganze Weile beschäftigt.

Das Drag&Drop an sich ist kein Problem. Nur möchte ich gerne, dass das Caret (also der blinkende Cursor) sich immer dort befindet, wo der Text beim "loslassen" eingefügt würde.

Ich löse das momentan mittels SetCaretPos und SendMessage aus der user32.dll.

In der TextBox:


int insertPosition = GetInsertPosition(mousePosition)

IntPtr mousePos = new IntPtr(insertPosition);
IntPtr result = SendMessage(this.Handle, EM_POSFROMCHAR, mousePos, IntPtr.Zero);

Point caretPosition = new Point(restult.ToInt32());

SetCaretPos(caretPosition.X, caretPosition.Y);

Das Problem ist nun, dass EM_POSFROMCHAR zwar wunderbar funktioniert, aber nicht, wenn sich der Mauszeiger hinter das letzte Zeichen befindet. Dann ist result leider -1.

Normalerweise würde ich ja einfach SelectioStart nehmen, aber dann wäre meine Auswahl ja aufgehoben, was bei Drag&Drop irritierend ist.

Google war mir dabei auch nicht behilflich und im IRC konnte mir auch niemand helfen, ihr seid jetzt meine letze Hoffnung. 😉

Ich hab dafür jetzt einen Workaround gefunden:


int index = GetInsertPosition(mousePosition);
IntPtr charPos = new IntPtr(index);
int res = SendMessage(this.Handle, EM_POSFROMCHAR, charPos, IntPtr.Zero).ToInt32();

Point position = new Point(res);

if(res == -1) { // Workaround
	SelectAll();
	GetCaretPos(out position);
	Select(this.selectionStart, this.selectionLength);
}

SetCaretPos(position.X, position.Y);

Wirklich schön ist das aber nicht. Also wenn jemand eine bessere Lösung hat, immer her damit. 🙂

Hallo!

Als Alternative könntest du doch SelectionStart und SelectionLength zwischenspeichern, dann den Cursor mittels SelectionStart positionieren und anschließend den Text wieder mit den zwischengespeicherten Werten markieren. Evtl. funktioniert das besser.

Nobody is perfect. I'm sad, i'm not nobody 🙁

Hm, dann würde das Caret ja nur kurz ans Ende "springen". Mir geht es aber darum, dass es dort verweilt. Das mit dem Zwischenspeichern habe ich ja bereits gemacht (this.selectionStart und this.selectionLength).

Oder meinst du das als Ersatz für SelectAll()? Ich denke das nimmt sich nicht viel. Mir geht es eher darum zu vermeiden, dass die Auswahl verändert werden muss.