[WinAPI] komunikaty sterujące RichEdit (położeniem karetki)

0

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ć???

0

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) + kolumnaa w drugą stronę

wiersz = EM_LINEFROMCHAR(numer znaku)
kolumna = numer znaku - EM_LINEINDEX(wiersz)
0

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.

0

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...:(

0

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++;
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1