Problem beim schreiben eines Texteditors
-
Hallo !
Ich habe die Tage angefangen mich mit der WinAPI zu beschäftigen und wollte jetzt einen ganz einfachen Texteditor schreiben .
Ich bin aber auf ein Problem getroffen , welches ich nicht alleine lösen kann .Ich möchte in einem Feld, die aktuelle Spalte und Zeile des Carets im Editfeld anzeigen lassen :
case WM_COMMAND:{ [...] if( HIWORD( wParam ) == EN_CHANGE ){ switch( LOWORD(wParam) ){ case 5: // ID von hEdit ( Editfeld ) iZeile = HIWORD(SendMessage(hEdit,EM_GETSEL,0,0)); iSpalte = LOWORD(SendMessage(hEdit,EM_GETSEL,0,0)); wsprintf( status_text , "Zeile: %i - Spalte: %i" , iZeile , iSpalte ); SetWindowText( hStatus , status_text ); return 0; } } [...]Mein Problem ist , das der Wert der Spalte = der Wert der Zeile ist und das der Wert pro Spalte um 1 ansteigt und pro Zeile um 2 .
Ich würde mich freuen , wenn ihr mir helfen würdet .
-
Also laut MSDN gibt dir EM_GETSEL nicht Zeile/Spalte zurück, sondern die Position der Markierung im Text. Und zwar in Zeichen vom Anfang der Datei/Dokument.
Return Value
The return value is a zero-based value with the starting position of the selection in the low-order word and the position of the first character after the last selected character in the high-order word. If either of these values exceeds 65,535, the return value is –1.
It is better to use the values returned in wParam and lParam because they are full 32-bit values.
Sofern es dafür nicht bereits eine Funktion gibt müsstest du also folgendes machen:
Die Anzahl der Zeichen bis zum ersten Return ("\n") vor der zurückgegebenen Position (LOWORD) ist die Spalte.
Die Anzahl der Returns vor der zurückgegebenen Position (auch LOWORD) ist die Zeile.Allerdings bin ich
Anfänger
und deswegen könnte das totaler Quatsch sein was ich da rede....
...möglicherweise hat Windows auch bereits irgendeine Funktion/Message dafür eingebaut....bist ja schließlich nicht der erste der sowas braucht...[Zusatz]
Guck mal nach EM_LINEFROMCHAR / EM_EXLINEFROMCHAR / EM_LINEINDEX, das könnte sowas sein...
Mit EM_LINEFROMCHAR bekommst du die Zeile in der sich eine bestimmte Position befindet. Mit EM_LINEINDEX bekommst du die Position des ersten Zeichens in der Zeile. Also bekommst du mit (Position - erstes Zeichen) die Spalte.Coolcat
-
Danke Coolcat ,
ich habe zwar keine Funktion gefunden , aber eine selber geschrieben .MFG datanist
-
Er hat doch eigentlich geschrieben, welche Messages du brauchst

-
datanist schrieb:
Danke Coolcat ,
ich habe zwar keine Funktion gefunden , aber eine selber geschrieben .Bei eigenen Lösungen die bitte immer angeben für Nachfolgende, die auch das Problem haben sollten.
-
Meine Lösung ist :
caret_pos = HIWORD(SendMessage(hEdit,EM_GETSEL,0,0)); GetWindowText( hEdit , temp , caret_pos ); iZeile = 1; iSpalte = 1; for( int i = 0; i < (caret_pos); i++ ){ if( temp[i] == (CHAR) 13 ){ iZeile++; iSpalte = 0; }else{ iSpalte++; } } wsprintf( status_text , "Zeile: %i - Spalte: %i" , iZeile , iSpalte ); SetWindowText( hStatus , status_text );