Jak nazywa się funkcja
SendMessage(hRichEdit, ????, jej wParam, jej lParam);
dzięki której mogę przejść do linii np. 3 i ustawić pozycję kursora na 12 w tej linii??? Jak będzie jakiś tekst w tej linii to żeby go nie kasować, a jak nie będzie tekstu to by spacje powstały i kursor był w pozycji 12.
Czy jest taka funkcja, dzięki której przesłałbym powyższy komunikat i już miałbym kursor w linii ustawiony w kontrolce RichEdit na taką linię i pozycję jaką chcę??? Bo nie mogę się doszukać w msdnie. Ewentualnie jak nie ma to może jakimiś paroma funkcjami da się ten efekt uzyskać???
EM_GETLINECOUNT aby sprawdzić ilość linii (i ewentualnie dopisać brakujące)
EM_LINELENGTH aby sprawdzić długość linii (i ewentualnie dopisać spacje)
EM_SETSEL aby przenieść kursor na odpowiednią pozycję.
Dopisywanie robisz w ten sposób, że przesuwasz kursor na odpowiednie miejsce (EM_SETSEL) i dopisujesz tekst (EM_REPLACESEL).
Dopisanie jednej linii to dopisanie łańcucha "\r\n".
Konwersję pomiędzy numerem znaku a wierszem i kolumną zrealizujesz przez EM_LINEFROMCHAR i EM_LINEINDEX, w uproszczeniu:
numer znaku = EM_LINEINDEX(wiersz) + kolumna
a w drugą stronę
wiersz = EM_LINEFROMCHAR(numer znaku)
kolumna = numer znaku - EM_LINEINDEX(wiersz)
A jak pobrać numer znaku aktualnej pozycji kursora??? Tylko nie pisz że trzeba użyć EM_CHARFROMPOS czy EM_POSFROMCHAR, bo i tak nie mam zielonego pojęcia jak to z tymi komunikatami zrobić, bo przecież one potrzebują parametrów w pikselach.
SIę chyba do ch... nie da tego zrobić. Bo EM_CHARFROMPOS, który mógłby zwrócić nr znaku aktualnej pozycji karetki potrzebuje współrzędnych x i y w pikselach, natomiast aby zdobyć piksele aktualnej pozycji karetki można by użyć EM_POSFROMCHAR, ale niestety (w RICHEDICIE 2.0 który używam) ten z kolei potrzebuje nr znaku na podstawie którego zwróci współrzędne, a więc potrzebuje tego czego szukam. Ja pier... co za błędne koło... Mogę tylko powiedzieć tyle, że komu by się udało napisać kod mógłby o nagrodę Nobla się starać, bo nikt do tego w necie na świecie jeszcze nie doszedł jak pobrać nr znaku przy aktualnym położeniu karetki. W Delphi tylko jest rowziązanie:
procedure TChild.GetCursorPosition;
var
Pos: TPoint;
begin
Pos.Y := SendMessage(RichEdit.Handle, EM_EXLINEFROMCHAR, 0,
RichEdit.SelStart);
Pos.X := (RichEdit.SelStart - SendMessage(RichEdit.Handle,
EM_LINEINDEX, Pos.Y, 0));
Inc(Pos.X);
Inc(Pos.Y);
ShowMessage(Format(
'Lnia: %d; Znak: %d', [P.X, P.Y]));
end;
ale niestety ja robię w winapi i dupa blada...:(
Czyli potrzeba ci do szczęścia właściwości SelStart - a tę w WinAPI też możesz pobrać:
void GetCaretPosition(HANDLE redit, POINT* position) {
DWORD start;
SendMessage(redit, EM_GETSEL, (WPARAM)&start, 0);
position->y = SendMessage(redit, EM_EXLINEFROMCHAR, 0, start);
position->x = start - SendMessage(redit, EM_LINEINDEX, position->y, 0);
position->y++;
position->x++;
}