![]() |
Buchstabe/Position unter Maus auslesen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich plane grade ein eigenes Control zur Darstellung und Editierung von formatierten Texten. Vorweg, ich weiß, es gibt eine Menge existierender Controls ABER ich möchte mir alleine ein solches von Grundauf entwickeln. Ich habe zum einen die Datenstruktur für einen Absatz, der aus Zeilen besteht, aus x Zeilen besteht, die x StyleRun Objekte aufnehmen kann. Ich konvertiere die Datenstruktur in ein gerendertes Absatzobjekt und teile die StyleRuns in den einzelnen Zeilen-Objekte innerhalb der Absatzklasse auf. Die Navigation mit der Tastatur innerhalb der Zeilen und StyleRuns ist nicht das Problem. Ich suche nach Ansätzen, Herangehensweisen, Ideen, wie man den Cursor mithilfe eines Mausklicks an der entsprechenden Stelle einer Zeile setzen kann. Im Anhang findet ihr eine schematische Darstellung eines Absatz-Objektes mit einer Zeile und drei StyleRuns. Wie könnte ich nach einem Klick in StyleRun 2 das gewünschte Ergebnis (siehe Grafik) erhalten? Vielen Dank. |
AW: Buchstabe/Position unter Maus auslesen
Hallo,
ich habe selber so was schon mal gemacht, ist aber schon über 20 Jahre her. Beim "Malen" des Textes werden die Positionen gespeicehrt. Zuerst zeilenweise dann jeweils innerhalb einer Zeile. bei der Mausposition geht man dann erst zeilenweise durch so lange bis man die die Position erreicht hat. Dann das gleiche in der Zeile. Innherhalb eines Wortes (oder so) wird dann nicht gespeichert sondern auch dann berechent. |
AW: Buchstabe/Position unter Maus auslesen
Hallo freimatz,
genau. Ich lese die Zeile unter der Maus Position und das StyleRun darunter bereits erfolgreich aus. Sagen wir das StyleRun beginnt bei der x-Position 365, die Maus befindet sich aber bei der x-Position 420. Erinnerst Du Dich noch, wie Du dann die Position des aktuellen Buchstabens unter der Maus ermittelt hast? |
AW: Buchstabe/Position unter Maus auslesen
Ich hatte das Thema eigener Controls und der Caret-Position auch schon einmal.
Du kannst mal hier schauen: ![]() 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; |
AW: Buchstabe/Position unter Maus auslesen
Das kommt darauf an wie du den Text renderst. Unterschiedliche Schriftgrößen, -grade und -arten müssten berücksichtigt werden (siehe TCanvas.TextWidth, TextHeight usw.). Notfalls müsste jeder Textabschnitt mit abweichender Formatierung als eigenes Objekt gespeichert werden, das dann auch Koordinaten enthält. Dann wäre es ein einfaches PtInRect.
|
AW: Buchstabe/Position unter Maus auslesen
Entweder man verwaltet jeden Buchstaben als Objekt (dann könnte PtInRect reichen oder noch die Unterscheidung ober rechts oder links von der Mitte) oder jedes einheitlich formatierte Wort wird als Objekt gespeichert, dann muss man später die Länge der einzelnen Buchstaben ermitteln.
Ich habe mich für die zweite Variante entschieden. |
AW: Buchstabe/Position unter Maus auslesen
Zitat:
|
AW: Buchstabe/Position unter Maus auslesen
Die Position des aktuellen Buchstabens unter der Maus ermittele ich analog - Buchstabe für Buchstabe. Die Breite der Buchstaben hole ich über eine separate Klasse ab wo für jeden von mir verwendeten Font und Char die Breite gespeichert wird. (Bei den Surrogaten von Unicode sehr spassig :kotz:)
|
AW: Buchstabe/Position unter Maus auslesen
Vielen lieben Dank meinen Vorrednern für deren Input.
Mir fehlt tatsächlich nur der letzte Schritt. Nehmen wir an, ich habe die aktuelle Zeile, sagen wir Nummer 2, und das aktuelle StyleRun der Zeile, sagen wir Nummer 4, identifiziert. Das Style<run beginnt an der x-Position 760 und die Maus befindet sich an Position 820. Mir fehlt nur der Ansatz, wie ich jetzt die Buchstaben ermittle. Also, muss man da eine Schleife verwenden und solange immer wieder die Textbreite abfragen, bis man die Koordinate erreicht hat? Wie könnte so ein Pseudo-Code aussehen? |
AW: Buchstabe/Position unter Maus auslesen
Das macht mein Code oben eigentlich genau.
In DX wird zunächst die X-KlickPosition vom aktuellen WordOffset aus definiert bzw. die Zielposition wo der Cursor sein soll. Dann wird von der Mitte aus geschaut, ob diese rechts oder links von dieser Position aus ist. Dann wird der gefundene rechte oder linke Bereich immer weiter eingeschränkt, bis der Buchstabe gefunden wird, der der Zielposition am nächsten ist. In CaretXPos wird das Ergebnis zurück geliefert. |
AW: Buchstabe/Position unter Maus auslesen
Was machen denn die Funktionen Pred und Succ?
|
AW: Buchstabe/Position unter Maus auslesen
Pred = Wert -1
Succ = Wert +1 |
AW: Buchstabe/Position unter Maus auslesen
Gibt es einen Unterschied zu Inc und Dec?
Was ist fCaretXPosNear und _MX? |
AW: Buchstabe/Position unter Maus auslesen
Zitat:
Grüße Dalai |
AW: Buchstabe/Position unter Maus auslesen
Zitat:
Inc(..) und Dec(..) kannst Du für Integer-Werte verwenden: Sie sind schneller als i+1 oder i-1. Pred(..) und Succ(..) sind für Aufzählungstypen verwendbar wie z.B.
Delphi-Quellcode:
ABER
Type
MeineFarben = (keineFarbe, Blau, Gelb, Rot); VAR Farbe: MeineFarben; ... Farbe:= Blau; Succh(Farbe); // ergibt 'Gelb' Pred(Farbe); // ergibt 'Blau' ... Inc(Farbe) oder Dec(Farbe) lässt sich dagegen nicht kompilieren. Gruß, Andreas |
AW: Buchstabe/Position unter Maus auslesen
fCaretXPosNear ist eine Cursor-Zielposition, wenn man z.B. in einem Gitter nach oben oder unten zwischen den Zellen wechselt.
(Hier ist das näher beschrieben: ![]() _MX ist eine temporäre Mausposition. --- Inc und Dec ändern den Wert der übergebenen Variable. Succ und Pred geben einen Berechnungsergebnis zurück und lassen die übergebene Variable in Ruhe. |
AW: Buchstabe/Position unter Maus auslesen
Zitat:
|
AW: Buchstabe/Position unter Maus auslesen
Hallo,
ich habe vorgestern einen vorerst anderen Weg für mich gefunden. Ich ermittle das aktuelle StyleRun, über dem sich die Maus befindet, und splitte den Text in einzelne Buchstaben auf. Dann durchlaufe ich diese und erzeuge ein Array, welches aus TRects besteht, die im Wesentlichen als Breite die String Breite eines jeden Buchstabens enthalten. Dann kann ich mittels TRect.Contains einfach abfragen, ob die Koordinaten der Maus über einem Buchstaben des TRect Arrays sind. Danke allen für den bisherigen Input. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz