2010-12-30 29 views
3

Meine Frage ist nicht sprachbasiert oder OS basiert. Ich denke, jedes System bietet eine Art von TextOut (Text, x, y) -Methode. Ich bin auf der Suche nach einigen Richtlinien oder Artikeln, wie soll ich die Auswahl von outputed Text implementieren. Konnte keine Informationen darüber finden.Wie implementiert man Textauswahl?

Das einzige, was mir in den Sinn kommt, ist wie folgt:

Wenn Benutzer klickt auf einen Punkt auf den Text Leinwand ich die Koordinaten dieses Punktes kennen. Ich muss berechnen, wo genau es in meinem Textpuffer sein wird. Also beginne ich vom Anfang des Puffers und ich gebe jedem Zeichen (oder Textblock) einen Stil (wenn es einen hat). Danach weiß ich, dass nach gegebenem Stil der Brief Größe gegeben hat. Ich addiere seine Breite und Höhe zu vorher berechneten X, Y Koordinaten. Auf diese Weise durchquere ich den Puffer, bis die berechnete Position nicht den Punkt erreicht hat, auf den der Benutzer geklickt hat. Nachdem ich den Punkt erreicht habe, der in einem gewissen Abstand liegt, habe ich einen Startpunkt für die Auswahl.

Dies ist die Grundidee. Ich weiß nicht, ob das gut ist, ich würde gerne wissen, wie dies zum Beispiel in Firefox wirklich gemacht wird. Ich weiß, dass ich die Quellen durchsuchen kann und wenn ich keine Wahl habe, werde ich es tun. Aber zuerst versuche ich, einen Artikel darüber zu finden ...

+0

Sehr interessant in der Tat. Ich würde empfehlen, sich den Quellcode anzusehen, um zu sehen, wie andere dieses Problem gelöst haben. –

Antwort

0

Sie denken auf einem viel niedrigeren Niveau als notwendig (keine Beleidigung. Sie denken, dass Sie viel mehr Arbeit machen müssen, als Sie brauchen). Die meisten (wenn nicht alle) Sprachen mit GUI-Unterstützung haben auch eine Form von selectionRange, die Ihnen entweder die Zeichenfolge, die ausgewählt wurde, oder die Start- und Stoppindizes in der Zeichenfolge gibt.

Mit einer modernen Sprache sollten Sie niemals Pixel und Zeichenbreiten berechnen müssen.

Für Textauswahl in Javascript, sehen diese Frage: Understanding what goes on with textarea selection with JavaScript

+2

Danke für die Antwort :) Allerdings muss ich auf niedrigere Ebene gehen. Was ist, wenn ich meinen eigenen Textbereich implementieren möchte? Genau das möchte ich tun, ich möchte einen Bereich implementieren, in dem ich den Text mit verschiedenen Formatierungen versehen und mit Bildern kombinieren kann. Deshalb habe ich nach den Implementierungsdetails gefragt, weil ich wissen möchte, wie ich das selbst machen kann ... – Wodzu

+0

Sie werden wahrscheinlich keinen Artikel darüber finden, wie Browser es tun, da dies nur die hartnäckigen Leute sind, die es sind sie tatsächlich zu schreiben, denke darüber nach. – Lathan

1

Auswählen von Text ist von Natur aus spezifisch für die Kontrolle, die sie und die Mittel enthält es diesen Text speichert. Ein sehr einfaches (wenn auch fraglich ineffizientes Mittel) ist es, den Textflussalgorithmus auszuführen, den Sie verwenden, wenn Sie auf einen Punkt klicken und den Algorithmus stoppen, wenn Sie den Punkt erreicht haben, der diesem Punkt am nächsten kommt. Erweiterte Steuerelemente können das Textlayout zwischenspeichern, um Auswahlen zu treffen oder ihren Inhalt effizienter zu zeichnen. Abhängig davon, wie viel Sie CPU-Zeit oder Speicher schätzen, gibt es Möglichkeiten, Caches und Spezialfälle zu verwenden, um diesen "Hit-Test" billiger zu machen.

Wenn Sie irgendwelche Behauptungen machen können (nur eine Schriftart im Steuerelement, also jede Zeile hat die gleiche Höhe), dann ist es möglich, diese Tests billiger zu machen, indem Sie das Fontlayout nach Zeilen indexieren und dann einfache Arithmetik durchführen Auf welche Zeile wurde geklickt. Wenn Ihr Textsteuerelement auch Monospace-Fonts verwendet (jedes Zeichen hat die gleiche Breite und Höhe), haben Sie noch mehr Glück, da Sie direkt über eine Nachschlagetabelle und zwei einfache Unterteilungen zu den Zeicheninformationen springen können.

Denken Sie daran, dass das Schreiben einer Textsteuerung von Grund auf obszön schwierig ist. Für eine optimale Vorgehensweise sollten Sie den Inhalt des Dokuments von den Anzeigeinformationen trennen. Der Grund dafür ist, dass der Text selbst oft bearbeitet werden muss, so dass Algorithmen wie Ropes oder Gap Buffer auf der Datenseite verwendet werden können, um eine schnellere Einfügung um den Caret zu ermöglichen. Jedes Mal, wenn ein Text bearbeitet wird, muss er auch gerendert werden. Dazu müssen diese Daten genommen und durch eine Art von Formatierungs-/Flussalgorithmen geführt werden, um zu bestimmen, wie sie dem Benutzer angezeigt werden müssen. Beide Seiten erfordern eine Menge von Algorithmen, die stören können, um richtig zu machen.

Leider hilft Ihnen die Verwendung der nativen TextOut-Funktionen nicht. Sie müssen Methoden verwenden, die Ihnen die Textbereiche für einzelne Zeichen zur Verfügung stellen, und komplexere (z. B. mehrzeilige) Steuerelemente müssen ihre eigenen Zeichen mit diesen Informationen darstellen. Funktionen wie TextOut sind nicht zum Beispiel für blinkende Einfügevorgaben oder für inkrementelle Aktualisierungen von Textlayouts geeignet. Während einige TextOut-Stil-Funktionen die Zeilenumbruch und -ausrichtung für Sie unterstützen können, müssen sie auch die gesamte Zeichenfolge neu rendern, was im Verhältnis zu der Menge an Text, mit der Sie in Ihrem Steuerelement arbeiten müssen, unerwünschter wird.