Ich hatte das Thema eigener Controls und der Caret-Position auch schon einmal.
Du kannst mal hier schauen:
https://www.delphipraxis.net/185623-...-controls.html
Dort sind auch 2 Videos verlinkt.
Ich zeichne "Controls" einfach in ein Bitmap und verwalte die gezeichneten Positionen.
Zunächst ermittle ich das Offset des betreffenden Controls und suche dann die passende X-Position, indem ich den Originaltext immer weiter verkürze und den Länge ermittle. Die Position mit der geringsten Abweichung zur Klickposition nehme ich dann.
Der Cursor selbst wird einfach als Strich in das Bild gezeichnet. Der blinkende Cursor wird durch zyklisches Neuzeichnen mit und ohne Cursorstrich erreicht.
Ich glaube nicht, dass Di der Code hilft, aber für alle Fälle füge ich ihn mal ein:
Delphi-Quellcode:
if (fCaretCalcPos) then
begin
if (fCaretXPosNear > 0) then
begin
DX := fCaretXPosNear - ClientRect.Left;
fCaretXPosNear := 0;
end
else
DX := _MX;
L := 0;
R := Length(lText);
CaretXPos := 0;
XD := MaxInt;
repeat
XC := L + ((R - L) div 2);
XP := X + aBitmap.Canvas.TextExtent(Copy(lText, 1, XC)).Width - 1;
XD_ := Abs(DX - XP);
if (XD_ < XD) then
begin
CaretXPos := XC;
XD := XD_;
end;
if (DX <= XP) then
begin
if (R > XC) then
R := XC
else
R := Pred(XC);
end
else
begin
if (L < XC) then
L := XC
else
L := Succ(XC);
end;
until (L > R);
fCaretCalcPos := False;
end;