Text- und TextRange-Steuerelementmuster
Beschreibt Richtlinien und Konventionen für die Implementierung von ITextProvider, ITextProvider2und ITextRangeProvider,einschließlich Informationen zu Eigenschaften und Methoden. Mit dem Text-Steuerelementmuster können Anwendungen und Steuerelemente ein einfaches Textobjektmodell verfügbar machen, sodass Clients Textinhalte, Textattribute und eingebettete Objekte aus textbasierten Steuerelementen abrufen können.
Um das Text-Steuerelementmuster zu unterstützen, implementieren Steuerelemente die Schnittstellen ITextProvider und ITextProvider2. Steuerelementtypen, die das Text-Steuerelementmuster unterstützen sollen, umfassen die Steuerelementtypen Bearbeiten und Dokument sowie alle anderen Steuerelementtypen, die es dem Benutzer ermöglichen, Text einzugeben oder schreibgeschützten Text auszuwählen.
Das Text-Steuerelementmuster kann mit anderen Microsoft Benutzeroberflächenautomatisierung-Steuerelementmustern verwendet werden, um verschiedene Typen eingebetteter Objekte im Text zu unterstützen, einschließlich Tabellen, Links und Befehlsschaltflächen.
Die Schnittstellen ITextProvider und ITextProvider2 enthalten eine Reihe von Methoden zum Abrufen von Textbereichen. Ein Textbereich ist ein Objekt, das eine zusammenhängende Textspanne (oder mehrere, unzusammenhängende Textbereiche) in einem Textcontainer darstellt. Eine ITextProvider-Methode erhält einen Textbereich, der das gesamte Dokument darstellt, während andere Textbereiche abrufen, die einen Teil des Dokuments darstellen, z. B. den ausgewählten Text, den sichtbaren Text oder ein in den Text eingebettetes Objekt.
Ein Textbereichsobjekt wird durch das TextRange-Steuerelementmuster dargestellt, das über die ITextRangeProvider-Schnittstelle implementiert wird. Das TextRange-Steuerelementmuster stellt Methoden und Eigenschaften bereit, die verwendet werden, um Informationen zum Text im Bereich verfügbar zu machen, die Endpunkte des Bereichs zu verschieben, Text auszuwählen oder die Auswahl aufzuheben, den Bereich in die Ansicht zu scrollen usw.
Weitere Informationen zu den Text- und TextRange-Steuerelementmustern finden Sie unter Benutzeroberflächenautomatisierung-Unterstützung für Textinhalte.
Ab Windows 8.1 Anbieter die ITextRangeProvider2-Schnittstelle implementieren können. Dies ermöglicht das Aufrufen von Kontextmenüs, die einem Textbereich zugeordnet sind. Dies unterstützt Szenarien wie die automatische Textkorrektur oder die Ime-Kandidatenauswahl (Input Method Editor).
Dieses Thema enthält folgende Abschnitte:
- Implementierungsrichtlinien und -konventionen
- Erforderliche Member für ITextProvider
- Erforderliche Member für ITextRangeProvider
- Unterstützen von Textbereichen
- Interoperabilität mit dem System caret
- Zugehörige Themen
Implementierungsrichtlinien und -konventionen
Beachten Sie beim Implementieren des Text-Steuerelementmusters die folgenden Richtlinien und Konventionen:
- Jedes Steuerelement, das den Zugriff auf Text ermöglicht (z. B. das Eingeben von Text oder das Auswählen von schreibgeschütztem Text), sollte das Text-Steuerelementmuster unterstützen.
- Das Text-Steuerelementmuster kann mit jedem Benutzeroberflächenelement verwendet werden, das Text darstellt, sogar mit einer statischen Bezeichnung auf einem Standardschaltflächensteuerelement. Für statische Textsteuerelemente, die nicht ausgewählt werden können oder über keine Einfügemarke verfügen, ist dies jedoch nicht erforderlich.
- Um sicherzustellen, dass der Text vollständig zugänglich ist, sollten Steuerelemente, die ITextProvider implementieren, auch die IValueProvider-Schnittstelle unterstützen. IValueProvider ergänzt ITextProvider durch eine programmgesteuerte Möglichkeit zum Ändern des Texts. Außerdem bietet es eine bessere Kompatibilität mit Clientanwendungen für Hilfstechnologien, einschließlich anwendungen, die auf älteren Technologien wie Microsoft Active Accessibility basieren. Wenn beide Steuerelementmuster implementiert werden, entsprechen das TextChanged-Ereignis (UIA _ _ TextChangedEventId) und das AutomationPropertyChanged-Ereignis (UIA _ AutomationPropertyChangedEventId) der Value-Eigenschaft (UIA _ ValueValuePropertyId). Beide Ereignisse müssen unterstützt werden.
- Das Text-Steuerelementmuster unterstützt nur einen Textstream und einen Viewport pro Steuerelement. Wenn die Anwendung mehrere Ansichten von Dokumenten in Bereichen anbietet, sollte jede Ansicht (Steuerelement) ITextProvider unabhängig unterstützen.
- Die ITextProvider::GetSelection-Methode gibt möglicherweise einen einzelnen Textbereich zurück, der den aktuell ausgewählten Text darstellt. Wenn ein Steuerelement die Auswahl mehrerer, nicht zusammenhängender Textbereiche unterstützt, sollte die GetSelection-Methode ein Array zurückgeben, das eine ITextRangeProvider-Schnittstelle für jede ausgewählte Textspanne enthält.
- Das Text-Steuerelementmuster stellt die Einfügemarke als degenerieren (leeren) Textbereich dar. Die ITextProvider::GetSelection-Methode sollte einen degenerieren Textbereich zurückgeben, wenn die Einfügemarke vorhanden ist und kein Text ausgewählt ist. Weitere Informationen finden Sie unter Interoperabilität mit dem System caret.
- Die ITextProvider::GetVisibleRanges-Methode gibt möglicherweise einen einzelnen Textbereich zurück, wenn ein zusammenhängender Textbereich im Viewport sichtbar ist, oder sie gibt ein Array von nicht zusammenhängenden Textbereichen zurück, die mehrere teilweise sichtbare Textzeilen darstellen.
- Die ITextProvider::RangeFromChild-Methode sollte einen degenerieren Bereich zurückgeben, wenn das untergeordnete Element keinen Text enthält. Da ein eingebettetes Objekt Text enthalten kann, gibt die RangeFromChild-Methode möglicherweise nicht immer einen degenerieren Textbereich zurück. Weitere Informationen finden Sie unter So macht Benutzeroberflächenautomatisierung eingebettete Objekte verfügbar.
- Die ITextProvider::RangeFromPoint-Methode führt Treffertests im Dokumentbereich mit den angegebenen Bildschirmkoordinaten durch. Der resultierende Textbereich sollte mit der Einfügemarke oder Auswahl konsistent sein, die sich aus dem Klicken auf die Position an den angegebenen Bildschirmkoordinaten ergeben würde. Wenn sich beispielsweise ein Bild an den angegebenen Bildschirmkoordinaten befindet, sollte der resultierende Textbereich mit dem Textbereich identisch sein, den die ITextProvider::RangeFromChild-Methode für das Bild abrufen würde. Wenn eine Clientanwendung einen Textbereich für die Position in der Mitte des Systemeinfügezeichens (die Einfügemarke) anfordert, sollte der resultierende Textbereich dem Textbereich des Systems entsprechen.
- Die ITextProvider::D ocumentRange-Eigenschaft sollte immer einen Textbereich bereitstellen, der den gesamten Text enthält, der von der entsprechenden ITextProvider-Implementierung unterstützt wird.
- Das UIA _ _ TextChangedEventId-Ereignis muss nach einer Textänderung ausgelöst werden, auch wenn die Änderung im Viewport nicht sichtbar ist. Beispielsweise sollte der Anbieter das -Ereignis auslösen, auch wenn der Benutzer genau den gleichen Text über den ausgewählten Text eingibt.
- Die UIA _ _ TextSelectionChangedEventId muss immer dann ausgelöst werden, wenn sich die Textauswahl ändert oder die Einfügemarke (Caretzeichen) zwischen dem Text verschoben wird.
Beachten Sie beim Implementieren des TextRange-Steuerelementmusters die folgenden Richtlinien und Konventionen:
- Alle Methoden des TextRange-Steuerelementmusters sollten Textvorgänge unabhängig vom Sichtbarkeitszustand des Texts ausführen. Die Sichtbarkeit eines Textbereichs kann immer durch Abfragen des IsHidden-Textattributs (UIA _ IsHiddenAttributeId)bestimmt werden.
- Wenn möglich, sollte ein Anbieter sicherstellen, dass alle Textänderungen, z. B. Löschungen, Einfügungen und Verschiebungen, in den zugeordneten Textbereichsobjekten (Instanzen der ITextRangeProvider-Schnittstelle) widergespiegelt werden, und ein UIA _ _ TextChangedEventId-Ereignis auslösen. Clients können das -Ereignis als Hinweis verwenden, um änderungen zu bestätigen, die an dem Text eines Steuerelements vorgenommen wurden.
- Alle Textbereichsobjekte, die von den Methoden ITextRangeProvider::Compare, CompareEndpointsund MoveEndpointByRange verwendet werden, müssen Peers der gleichen Text-Steuerelementmusterimplementierungen sein.
- Obwohl dies nicht erforderlich ist, kann der von der ITextRangeProvider::CompareEndpoints-Methode abgerufene pRetVal-Wert den Abstand zwischen den beiden Endpunkten in Zeichen (TextUnit-Zeichen) _angeben. Clientanwendungen sollten jedoch nicht von der Genauigkeit von pRetVal über den positiven oder negativen Wert hinaus abhängen.
- Die Methoden ITextRangeProvider::ExpandToEnclosingUnit, Moveund MoveEndpointByUnit erfordern eine sorgfältige Berücksichtigung der angegebenen Texteinheit. Weitere Informationen finden Sie unter Bearbeiten eines Textranges nach Texteinheit.
- Implementierungsanforderungen im Zusammenhang mit den Methoden ITextRangeProvider::Select, AddToSelectionund RemoveFromSelection finden Sie unter Auswählen von Text in einem Textbereich.
- Die Methoden ITextRangeProvider::FindText und FindAttribute suchen vorwärts oder rückwärts nach einer einzelnen übereinstimmenden Textzeichenfolge oder einem Textattribut. Sie sollten NULL zurückgeben, wenn keine Übereinstimmung gefunden wird.
- Die ITextRangeProvider::GetAttributeValue-Methode muss die von der Funktion UiaGetReservedMixedAttributeValue oder UiaGetReservedNotSupportedValue erhaltene Adresse zurückgeben, wenn das zugeordnete Attribut im Bereich variiert oder wenn das Attribut vom Textsteuerelement nicht unterstützt wird. Die TextRange-Steuerelementmusterspezifikation lässt weder das Hinzufügen neuer Textattributbezeichner noch das Ändern der Definition der vorhandenen Attribute zu.
- Nach Möglichkeit sollte die ITextRangeProvider::GetBoundingRectangles-Methode ein Array zurückgeben, das ein umschließendes Rechteck für jede vollständig oder teilweise sichtbare Textzeile in einem Textbereich enthält. Wenn dies nicht möglich ist, kann der Anbieter ein Array zurückgeben, das die umgrenzten Rechtecke nur vollständig sichtbarer Linien enthält. Dies schränkt jedoch die Fähigkeit einer Clientanwendung ein, genau zu beschreiben, wie der Text auf dem Bildschirm dargestellt wird.
- Die ITextRangeProvider::GetChildren-Methode sollte alle untergeordneten Elemente zurückgeben, die in einen Textbereich eingebettet sind, sie muss jedoch keine untergeordneten Elemente der untergeordneten Elemente zurückgeben. Wenn ein Textbereich beispielsweise eine Tabelle enthält, die über eine Reihe von untergeordneten Zellen verfügt, gibt die GetChildren-Methode möglicherweise nur das Tabellenelement und nicht die Zellenelemente zurück. Aus Leistungs- oder Architekturgründen kann ein Anbieter möglicherweise nicht alle eingebetteten Objekte verfügbar machen, die in einem Dokument in der Automatisierungsstruktur gehostet werden. In diesem Fall sollte der Anbieter zumindest die Aufzählung von untergeordneten Objekten über die GetChildren-Methode unterstützen und als Option das VirtualizedItem-Steuerelementmuster für die Unterstützung der Devirtualisierung unterstützen.
- Die ITextRangeProvider::GetEnclosingElement-Methode gibt in der Regel den Textanbieter zurück, der den Textbereich angibt. Wenn der Textanbieter jedoch untergeordnete Objekte wie Tabellen oder Links unterstützt, kann das einschließende Element ein Nachfolger des Textanbieters sein. Das von GetEnclosingElement zurückgegebene Element sollte das Element sein, das dem angegebenen Textbereich am nächsten liegt. Wenn sich der Textbereich beispielsweise in einer Zelle einer Tabelle befindet, sollte GetEnclosingElement die enthaltende Zelle anstelle des Tabellenelements zurückgeben.
- Die ITextRangeProvider::GetText-Methode sollte den Nur-Text im Bereich zurückgeben. Weitere Informationen finden Sie unter Abrufen von Text aus einem Textbereich.
- Durch Aufrufen von ITextRangeProvider::ScrollIntoView sollte der Text im Viewport des Textsteuerfelds ausgerichtet werden, wie durch den alignToTop-Parameter angegeben. Obwohl es in Bezug auf die horizontale Ausrichtung keine Anforderung gibt, sollte der Textbereich sowohl horizontal als auch vertikal sichtbar sein. Beim Auswerten des alignToTop-Parameters muss ein Anbieter die Ausrichtung des Textsteuerfelds und die Flussrichtung des Texts berücksichtigen. Wenn alignToTop beispielsweise für ein vertikal ausgerichtetes Textsteuerfeld TRUE ist, das Text enthält, der von rechts nach links fließt, sollte der Anbieter den Textbereich an der rechten Seite des Viewports ausrichten.
- Wenn der Textbereich durch ein Dokument durch TextUnit _ Linein eine eingebettete Tabelle eintritt, sollte jede Textzeile in einer Zelle als Zeile behandelt werden.
Erforderliche Member für ITextProvider
Die folgenden Eigenschaften und Methoden sind für die Implementierung der ITextProvider-Schnittstelle erforderlich.
| Erforderliche Member | Memberart | Hinweise |
|---|---|---|
| DocumentRange | Eigenschaft | Keine |
| SupportedTextSelection | Eigenschaft | Keine |
| GetSelection | Methode | Keine |
| GetVisibleRanges | Methode | Keine |
| RangeFromChild | Methode | Keine |
| RangeFromPoint | Methode | Keine |
| UIA _ Text _ TextChangedEventId | Ereignis | Keine |
| UIA _ Text _ TextSelectionChangedEventId | Ereignis | Keine |
Die folgenden zusätzlichen Eigenschaften und Methoden sind für die Implementierung der ITextProvider2-Schnittstelle erforderlich.
| Erforderliche Member | Memberart | Hinweise |
|---|---|---|
| GetCaretRange | Methode | Keine |
| RangeFromAnnotation | Methode | Keine |
Erforderliche Member für ITextRangeProvider
Die folgenden Eigenschaften und Methoden sind für die Implementierung der ITextRangeProvider-Schnittstelle erforderlich.
| Erforderliche Member | Memberart | Hinweise |
|---|---|---|
| AddToSelection | Methode | Keine |
| Klon | Methode | Keine |
| Vergleich | Methode | Keine |
| CompareEndpoints | Methode | Keine |
| ExpandToEnclosingUnit | Methode | Keine |
| FindAttribute | Methode | Keine |
| Findtext | Methode | Keine |
| GetAttributeValue | Methode | Keine |
| GetBoundingRectangles | Methode | Keine |
| GetChildren | Methode | Keine |
| GetEnclosingElement | Methode | Keine |
| GetText | Methode | Keine |
| Move | Methode | Keine |
| MoveEndpointByUnit | Methode | Keine |
| MoveEndpointByRange | Methode | Keine |
| Select | Methode | Keine |
| ScrollIntoView | Methode | Keine |
Die folgenden zusätzlichen Eigenschaften und Methoden sind für die Implementierung der ITextRangeProvider2-Schnittstelle erforderlich.
| Erforderliche Member | Memberart | Hinweise |
|---|---|---|
| ShowContextMenu | Methode | Weitere Informationen finden Sie im Abschnitt "Implementieren von ShowContextMenu". |
Dem TextRange-Steuerelementmuster sind keine Ereignisse zugeordnet.
Unterstützen von Textbereichen
In diesem Abschnitt wird beschrieben, wie ein Anbieter verschiedene Methoden der Schnittstellen ITextRangeProvider und ITextRangeProvider2 implementieren sollte, um das TextRange-Steuerelementmuster zu unterstützen.
Bearbeiten eines Textbereichs nach Texteinheit
Die ITextRangeProvider-Schnittstelle stellt mehrere Methoden zum Bearbeiten und Navigieren in Textbereichen in einem textbasierten Steuerelement bereit. Die Methoden ITextRangeProvider::Move, MoveEndpointByUnitund ExpandToEnclosingUnit verschieben einen Textbereich oder einen seiner Endpunkte durch die angegebene Texteinheit, z. B. Zeichen, Wort, Absatz usw. Weitere Informationen finden Sie unter Benutzeroberflächenautomatisierung Texteinheiten.
Trotz ihres Namens erweitert die ITextRangeProvider::ExpandToEnclosingUnit-Methode nicht notwendigerweise einen Textbereich. Stattdessen wird ein Textbereich "normalisiert", indem die Endpunkte so verschoben werden, dass der Bereich die angegebene Texteinheit umfasst. Der Bereich wird erweitert, wenn er kleiner als die angegebene Einheit ist, oder verkürzt, wenn er länger als die angegebene Einheit ist. Es ist wichtig, dass die ExpandToEnclosingUnit-Methode Textbereiche immer konsistent normalisiert. Andernfalls wären andere Aspekte der Bearbeitung des Textbereichs nach Texteinheit unvorhersehbar. Das folgende Diagramm zeigt, wie ExpandToEnclosingUnit einen Textbereich normalisiert, indem die Endpunkte des Bereichs verschoben werden.

Wenn der Textbereich am Anfang einer Texteinheit beginnt und am Anfang oder vor der nächsten Texteinheitsgrenze endet, wird der Endpunkt an die nächste Texteinheitsgrenze verschoben (siehe 1 und 2 im vorherigen Diagramm).
Wenn der Textbereich am Anfang einer Texteinheit beginnt und bei oder nach der nächsten Einheitengrenze endet, bleibt der Endendpunkt erhalten oder wird nach dem Startendpunkt zurück zur nächsten Einheitengrenze verschoben (siehe 3 und 4 in der vorherigen Abbildung). Wenn zwischen dem Start- und dem Endendpunkt mehr als eine Texteinheitsgrenze vorhanden ist, wird der Endendpunkt nach dem Startendpunkt zurück zur nächsten Einheitengrenze verschoben, was zu einem Textbereich führt, der eine Texteinheit lang ist.
Wenn der Textbereich in einer Mitte der Texteinheit beginnt, wird der Startendpunkt rückwärts an den Anfang der Texteinheit verschoben, und der Endpunkt wird nach Bedarf vorwärts oder rückwärts zur nächsten Einheitengrenze nach dem Startendpunkt verschoben (siehe 5 bis 8 im vorherigen Diagramm).
Wenn die ITextRangeProvider::Move-Methode aufgerufen wird, normalisiert der Anbieter den Textbereich anhand der angegebenen Texteinheit mit der gleichen Normalisierungslogik wie die ExpandToEnclosingUnit-Methode. Anschließend verschiebt der Anbieter den Bereich um die angegebene Anzahl von Texteinheiten rückwärts oder vorwärts. Beim Verschieben des Bereichs sollte der Anbieter die Grenzen aller eingebetteten Objekte im Text ignorieren. (Die Einheitengrenze selbst kann jedoch durch das Vorhandensein eines eingebetteten Objekts beeinflusst werden.) Das folgende Diagramm zeigt, wie die Move-Methode einen Textbereich unitweise über eingebettete Objekte und Texteinheitsgrenzen verschiebt.

Die ITextRangeProvider::MoveEndpointByUnit-Methode verschiebt einen der Endpunkte nach der angegebenen Texteinheit vorwärts oder rückwärts, wie in der folgenden Abbildung dargestellt.

Mit der ITextRangeProvider::MoveEndpointByRange-Methode kann eine Clientanwendung einen Endpunkt eines Textbereichs auf den gleichen Speicherort wie den angegebenen Endpunkt eines zweiten Textbereichs festlegen.
Auswählen von Text in einem Textbereich
Die ITextRangeProvider-Schnittstelle enthält mehrere Methoden zum Steuern der Textauswahl in einem textbasierten Steuerelement.
Die ITextRangeProvider::Select-Methode sollte den Text auswählen, der einem Textbereich entspricht, und ggf. die vorherige Auswahl aus dem Textsteuerelement entfernen. Wenn Select für einen degenerierte Textbereich aufgerufen wird, sollte der Anbieter die Einfügemarke an die Position des Textbereichs verschieben, ohne Text auszuwählen.
Wenn ein Steuerelement die Auswahl mehrerer, unzusammenhängender Textbereiche unterstützt, fügen die Methoden ITextRangeProvider::AddToSelection und RemoveFromSelection der Auflistung ausgewählter Textbereiche Textbereiche hinzu und entfernen sie daraus. Wenn das Steuerelement jeweils nur einen ausgewählten Textbereich unterstützt, der Auswahlvorgang jedoch zur Auswahl mehrerer unzusammenhängender Textbereiche führen würde, sollte der Anbieter entweder einen E _ INVALIDOPERATION-Fehler zurückgeben oder die aktuelle Auswahl erweitern oder abschneiden. Die ITextProvider::SupportedTextSelection-Eigenschaft sollte angeben, ob ein Steuerelement die Auswahl einzelner oder mehrerer Textspannen oder gar keine unterstützt.
Wenn ein textbasiertes Steuerelement Texteinfügungen unterstützt, sollte das Aufrufen von ITextRangeProvider::AddToSelection oder RemoveFromSelection für einen degenerieren Textbereich im Steuerelement die Einfügemarke verschieben, aber keinen Text auswählen.
Abrufen von Text aus einem Textbereich
Die ITextRangeProvider::GetText-Methode sollte den Nur-Text eines Textbereichs zurückgeben. Der Nur-Text sollte alle Steuerzeichen enthalten, die im Quelltext enthalten sind, z. B. Wagenrückläufe und die Unicode-Markierung von links nach rechts (LRM). Der Nur-Text sollte keine Markuptags wie HTML enthalten, die möglicherweise im Quelltext vorhanden sind. Außerdem sollten alle Escapecodes im Quelltext in die Nur-Text-Entsprechungen konvertiert werden. Beispielsweise sollte " " in ein einfaches Leerzeichen konvertiert werden.
Wenn ein eingebettetes Objekt einen Textbereich umfasst, sollte der Nur-Text den inneren Text des Objekts enthalten, jedoch nicht den alternativen Text (die Namenseigenschaft des eingebetteten Objekts), da er mit dem beschreibenden inneren Text inkonsistent sein kann. Weitere Informationen finden Sie unter So macht Benutzeroberflächenautomatisierung eingebettete Objekte verfügbar.
Implementieren von ShowContextMenu
ITextRangeProvider2::ShowContextMenu sollte immer das Kontextmenü am Anfangsendpunkt des Bereichs anzeigen. Dies sollte dem entsprechen, was passieren würde, wenn der Benutzer die Kontextmenütaste oder UMSCHALT+ F10 mit der Einfügemarke am Anfang des Bereichs gedrückt hätte.
Wenn das Anzeigen des Kontextmenüs in der Regel dazu führen würde, dass die Einfügemarke an eine bestimmte Position verschoben wird, sollte dies auch für programmgesteuertes Aufrufen von ShowContextMenu für Benutzeroberflächenautomatisierung Unterstützung erfolgen.
Interoperabilität mit dem System caret
Die ordnungsgemäße Unterstützung der Einfügemarke ist für viele Clientanwendungen von entscheidender Bedeutung, einschließlich derjenigen, die nicht auf Benutzeroberflächenautomatisierung basieren. Im Text-Steuerelementmuster wird die Einfügemarke durch einen degenerieren (leeren) Textbereich an der Position des Systemeinfügezeichens dargestellt. Wenn die Einfügemarke verschoben wird, sollte ein Steuerelement das TextSelectionChanged-Ereignis auslösen (UIA _ _ TextSelectionChangedEventId). Einige Clientanwendungen sind von diesem Ereignis abhängig, um die Position der Einfügemarke zu überwachen und die Textauswahl nachzuverfolgen.
Wenn ein Steuerelement ausgewählten Text enthält, bietet der aktuelle Entwurf des Text-Steuerelementmusters keine Möglichkeit, die Position der Einfügemarke direkt einem bestimmten Textbereich zuzuordnen. Der Anbieter muss die Textauswahl nachverfolgen und die Position der Einfügemarke entsprechend festlegen. Da die Textauswahl in der Regel durch Verschieben der Einfügemarke erfolgt, während die UMSCHALTTASTE, STRG oder beides gedrückt gehalten wird, kann ein Anbieter die Textauswahl nachverfolgen, indem er den Status dieser Schlüssel überprüft, wenn sich die Auswahl ändert.
Da das Barrierefreiheitsframework integrierte Unterstützung für das System caret, aber nicht für ein benutzerdefiniertes Caretzeichen bereitstellt, sollten textbasierte Steuerelemente nach Möglichkeit das System-Caretzeichen verwenden. Steuerelemente, die ein benutzerdefiniertes Caretzeichen verwenden, können sicherstellen, dass auf das Caretzeichen zugegriffen werden kann, indem ein System-Caretzeichen erstellt wird, das die gleichen Dimensionen wie das benutzerdefinierte Caretzeichen aufweist, und das System caret an derselben Position in der Benutzeroberfläche des Steuerelements positioniert wie das benutzerdefinierte Caretzeichen, d. h. an der Einfügemarke. Alternativ kann ein Steuerelement, das ein benutzerdefiniertes Caretelement verwendet, einen Microsoft Active Accessibility-Anbieter für OBJID _ CARET implementieren, um Barrierefreiheitsinformationen direkt für Ihr benutzerdefiniertes Caretelement bereitzustellen.
Weitere Informationen zum System caret finden Sie unter Carets.
Verwenden Sie die Tools Inspect and Accessible Event Watcher , um zu testen, ob das Steuerelement den Speicherort des System caret-Steuerelements ordnungsgemäß verfügbar macht.
Die Bildschirmkoordinaten der Mitte der Einfügemarke-Bitmap sollten immer mit der Position der Einfügemarke übereinstimmen. Auf diese Weise kann ein Client die Caretbildschirmkoordinaten in einem Aufruf von ITextProvider::RangeFromPoint verwenden, um einen Textbereich abzurufen, der die Position der Einfügemarke genau darstellt.