Laden...

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

Erstellt von rastalt vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.766 Views
R
rastalt Themenstarter:in
234 Beiträge seit 2007
vor 14 Jahren
[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. 😉

R
rastalt Themenstarter:in
234 Beiträge seit 2007
vor 14 Jahren

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. 🙂

1.820 Beiträge seit 2005
vor 14 Jahren

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 🙁

R
rastalt Themenstarter:in
234 Beiträge seit 2007
vor 14 Jahren

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.