Position des Caret-Zeichens(Cursor) in CEdit-Feld ermitteln

Padd_y

Mitglied
Tach..;-)

Ich verarbeite die Eingabe in CEdit über EN_CHANGE-Nachrichten auf Zeichenebene,
d.h. während der Eingabe schaut das Programm dem Nutzer zwecks Realisierung einer
Text-Vervollständigungsfunktion bereits auf die Finger.

Dabei wäre es sehr nützlich zu wissen, wo der Cursor eigentlich gerade ist.
Bei der Eingabe in der Regel natürlich am Ende, aber er kann ja auch mit der Maus
mittenrein klicken, um noch was zu ändern.

Als Antwort stelle ich mir z.B. vor: "128. Stelle innerhalb des CEdit (incl. Zeilenumbrüche)".
Das scheint nach meiner Recherche in MFC aber leider nicht zu gehen!

Ich mache es jetzt indirekt, in dem ich das geänderte CEdit mit dem letzten Stand vergleiche und feststelle,
an welcher Zeichenstelle der Inhalt divergiert.

Diese Forum-Anfrage möchte ich dennoch stellen, weil die Abfrage in Grenzfällen unzuverlässig ist und ich ferner das Reinklicken und anschließendes F2-Drücken definiert verarbeiten möchte (bei dieser Nutzungsvariante liefert mir mein Trick die aktuelle Cursorposition nicht, da das Reinklicken natürlich keine EN_CHANGE-Nachricht erzeugt).
 
Moin auch,

also so weit ich das beurteilen kann, sollte dir folgendes helfen oder zumindest einen Ansatz geben.

Code:
    // rufe in deinem EN_CHANGE Messagehandler folgenden Code auf
    CPoint caretPos = getCaretPos(); // Liefert die Position des carets in deinem Fenster
    // Dann ermittle die Zeile und die Position des Zeichens
    int n = CharFromPos(caretPos);
    int lineIdx = HIWORD(n);        // lineIdx sollte nun deine Zeilennummer enthalten
    int charIdx = LOWORD(n);     // charIdx die Position innerhalb dieser Zeile

Hoffe dir weitergeholfen zu haben.

Schönen gruß,

Peter
 
Hi Peter,

Besten Dank, klappt fulminant!

Hier noch Ergänzungen für andere geneigte Leser:

* der 'CharFromPos'-Funktion steht natürlich nicht losgelöst da, sondern bezieht sich auf die Control-Variable:
int n = m_contentsCtrl.CharFromPos(caretPos);

* LOWORD liefert -zum Glück- auch bei mehrzeilig belegten Feldern die Position ab Feldanfang, d.h. sie ist auch in diesem Fall als Index auf die CEdit-CString-Variable nutzbar
-> wenn einen nur das interessiert, braucht man den HIWORD-Index gar nicht erst ermitteln

Ciao
Padd_y
 

Neue Beiträge

Zurück