텍스트 및 TextRange 컨트롤 패턴

속성 및 메서드에 대한 정보를 포함하여 ITextProvider, ITextProvider2ITextRangeProvider를 구현하기 위한 지침 및 규칙에 대해 설명합니다. 텍스트 컨트롤 패턴을 사용하면 애플리케이션과 컨트롤이 간단한 텍스트 개체 모델을 노출할 수 있으므로 클라이언트는 텍스트 기반 컨트롤에서 텍스트 콘텐츠, 텍스트 특성 및 포함된 개체를 검색할 수 있습니다.

텍스트 컨트롤 패턴을 지원하기 위해 컨트롤은 ITextProviderITextProvider2 인터페이스를 구현합니다. 텍스트 컨트롤 패턴을 지원해야 하는 컨트롤 형식에는 편집문서 컨트롤 형식과 사용자가 텍스트를 입력하거나 읽기 전용 텍스트를 선택할 수 있는 다른 컨트롤 형식이 포함됩니다.

텍스트 컨트롤 패턴을 다른 Microsoft UI 자동화 컨트롤 패턴과 함께 사용하여 표, 하이퍼링크 및 명령 단추를 포함하여 텍스트에 포함된 여러 유형의 개체를 지원할 수 있습니다.

ITextProviderITextProvider2 인터페이스에는 텍스트 범위를 가져오는 여러 메서드가 포함됩니다. 텍스트 범위는 텍스트 컨테이너의 연속된 텍스트 범위 또는 여러 개의 연결되지 않은 텍스트 범위를 나타내는 개체입니다. 한 ITextProvider 메서드는 전체 문서를 나타내는 텍스트 범위를 가져오고, 다른 하나는 선택한 텍스트, 표시되는 텍스트 또는 텍스트에 포함된 개체와 같이 문서의 일부를 나타내는 텍스트 범위를 가져옵니다.

텍스트 범위 개체는 ITextRangeProvider 인터페이스를 통해 구현되는 TextRange 컨트롤 패턴으로 표시됩니다. TextRange 컨트롤 패턴은 범위의 텍스트에 대한 정보를 노출하고, 범위의 엔드포인트를 이동하고, 텍스트를 선택하거나 선택 취소하고, 범위를 보기로 스크롤하는 데 사용되는 메서드와 속성을 제공합니다.

Text 및 TextRange 컨트롤 패턴에 대한 자세한 내용은 텍스트 콘텐츠에 대한 UI 자동화 지원을 참조하세요.

Windows 8.1 공급자부터는 ITextRangeProvider2 인터페이스를 구현할 수 있습니다. 이렇게 하면 텍스트 범위와 연결된 상황에 맞는 메뉴를 호출할 수 있습니다. 텍스트 자동 고침 또는 IME(입력 방법 편집기) 후보 선택과 같은 시나리오를 지원합니다.

이 항목에는 다음과 같은 섹션이 포함되어 있습니다.

구현 지침 및 규칙

텍스트 컨트롤 패턴을 구현할 때 다음 지침 및 규칙을 확인합니다.

  • 텍스트에 액세스할 수 있는 모든 컨트롤(예: 텍스트 입력 또는 읽기 전용 텍스트 선택)은 텍스트 컨트롤 패턴을 지원해야 합니다.
  • 텍스트 컨트롤 패턴은 텍스트를 표시하는 모든 UI 요소와 함께 사용할 수 있으며 표준 단추 컨트롤의 정적 레이블도 사용할 수 있습니다. 그러나 선택할 수 없거나 삽입 지점이 없는 정적 텍스트 컨트롤에는 필요하지 않습니다.
  • 텍스트에 완전히 액세스할 수 있도록 하려면 ITextProvider 를 구현하는 컨트롤도 IValueProvider 인터페이스를 지원해야 합니다. IValueProvider 는 텍스트를 변경하는 프로그래밍 방식을 제공하여 ITextProvider 를 보완합니다. 또한 Microsoft Active Accessibility와 같은 레거시 기술을 기반으로 하는 애플리케이션을 포함하여 보조 기술 클라이언트 애플리케이션과의 더 큰 호환성을 제공합니다. 두 컨트롤 패턴이 모두 구현되면 TextChanged 이벤트(UIA_Text_TextChangedEventId) 및 AutomationPropertyChanged 이벤트(UIA_AutomationPropertyChangedEventId)는 Value 속성(UIA_ValueValuePropertyId)과 동일합니다. 두 이벤트 모두 지원되어야 합니다.
  • 텍스트 컨트롤 패턴은 하나의 텍스트 스트림과 컨트롤당 하나의 뷰포트만 지원합니다. 애플리케이션이 창에서 문서의 여러 보기를 제공하는 경우 각 보기(컨트롤)는 ITextProvider를 독립적으로 지원해야 합니다.
  • ITextProvider::GetSelection 메서드는 현재 선택한 텍스트를 나타내는 단일 텍스트 범위를 반환할 수 있습니다. 컨트롤이 인접하지 않은 여러 텍스트 범위 선택을 지원하는 경우 GetSelection 메서드는 선택한 각 텍스트 범위에 대해 하나의 ITextRangeProvider 인터페이스가 포함된 배열을 반환해야 합니다.
  • 텍스트 컨트롤 패턴은 삽입 지점을 퇴화(빈) 텍스트 범위로 나타냅니다. ITextProvider::GetSelection 메서드는 삽입 지점이 있고 텍스트가 선택되지 않은 경우 퇴화 텍스트 범위를 반환해야 합니다. 자세한 내용은 System Caret와의 상호 운용성을 참조하세요.
  • ITextProvider::GetVisibleRanges 메서드는 연속된 텍스트 범위가 뷰포트에 표시되거나 부분적으로 표시되는 여러 텍스트 줄을 나타내는 연결되지 않은 텍스트 범위의 배열을 반환할 수 있는 경우 단일 텍스트 범위를 반환할 수 있습니다.
  • 자식 요소에 텍스트가 없는 경우 ITextProvider::RangeFromChild 메서드는 degenerate 범위를 반환해야 합니다. 포함된 개체에 텍스트가 포함될 수 있으므로 RangeFromChild 메서드는 항상 퇴화 텍스트 범위를 반환하지 않을 수 있습니다. 자세한 내용은 UI 자동화 포함된 개체를 노출하는 방법을 참조하세요.
  • ITextProvider::RangeFromPoint 메서드는 지정된 화면 좌표를 사용하여 문서 영역에서 적중 테스트를 수행합니다. 결과 텍스트 범위는 지정된 화면 좌표에서 위치를 클릭하면 나타나는 삽입 지점 또는 선택 영역과 일치해야 합니다. 예를 들어 이미지가 지정된 화면 좌표에 있는 경우 결과 텍스트 범위는 이미지에 대해 ITextProvider::RangeFromChild 메서드가 가져올 텍스트 범위와 동일해야 합니다. 마찬가지로 클라이언트 애플리케이션이 시스템 caret(삽입 지점)의 중심에 있는 위치에 대한 텍스트 범위를 요청하는 경우 결과 텍스트 범위는 시스템 캐리트 위치와 동일해야 합니다.
  • ITextProvider::D ocumentRange 속성은 항상 해당 ITextProvider 구현에서 지원하는 모든 텍스트를 포함하는 텍스트 범위를 제공해야 합니다.
  • 변경 내용이 뷰포트에 표시되지 않더라도 텍스트 변경이 발생한 후 UIA_Text_TextChangedEventId 이벤트가 발생해야 합니다. 예를 들어 공급자는 사용자가 선택한 텍스트에 정확히 동일한 텍스트를 붙여넣더라도 이벤트를 발생시켜야 합니다.
  • 텍스트 선택 영역이 변경되거나 삽입 지점(caret)이 텍스트 간에 이동할 때마다 UIA_Text_TextSelectionChangedEventId 발생해야 합니다.

TextRange 컨트롤 패턴을 구현할 때 다음 지침 및 규칙을 확인합니다.

  • TextRange 컨트롤 패턴의 모든 메서드는 텍스트의 표시 유형 상태에 관계없이 텍스트 작업을 수행해야 합니다. 텍스트 범위의 표시 유형은 항상 isHidden 텍스트 특성(UIA_IsHiddenAttributeId)을 쿼리하여 확인할 수 있습니다.
  • 가능한 경우 공급자는 삭제, 삽입 및 이동과 같은 텍스트 변경 내용이 연결된 텍스트 범위 개체( ITextRangeProvider 인터페이스의 인스턴스)에 반영되도록 하고 UIA_Text_TextChangedEventId 이벤트를 발생시켜야 합니다. 클라이언트는 이벤트를 힌트로 사용하여 컨트롤의 텍스트에 대한 편집 변경 내용을 확인할 수 있습니다.
  • ITextRangeProvider::Compare, CompareEndpointsMoveEndpointByRange 메서드에서 사용하는 모든 텍스트 범위 개체는 동일한 텍스트 컨트롤 패턴 구현의 피어여야 합니다.
  • 필수는 아니지만 ITextRangeProvider::CompareEndpoints 메서드에서 검색한 pRetVal 값은 두 엔드포인트 사이의 거리(TextUnit_Character)를 나타낼 수 있습니다. 그러나 클라이언트 애플리케이션은 pRetVal 의 정확도가 양수 또는 음수 값을 넘어서는 정확도에 의존해서는 안 됩니다.
  • ITextRangeProvider::ExpandToEnclosingUnit, MoveMoveEndpointByUnit 메서드는 지정된 텍스트 단위를 신중하게 고려해야 합니다. 자세한 내용은 텍스트 단위로 TextRange 조작을 참조하세요.
  • ITextRangeProvider::Select, AddToSelectionRemoveFromSelection 메서드와 관련된 구현 요구 사항은 텍스트 범위에서 텍스트 선택을 참조하세요.
  • ITextRangeProvider::FindTextFindAttribute 메서드는 일치하는 단일 텍스트 문자열 또는 텍스트 특성을 앞뒤로 검색합니다. 일치하는 항목이 없으면 NULL 을 반환해야 합니다.
  • ITextRangeProvider::GetAttributeValue 메서드는 UiaGetReservedMixedAttributeValue 또는 UiaGetReservedNotSupportedValue 함수에서 가져온 주소를 반환해야 합니다. 연결된 특성이 범위에 따라 다르거나 텍스트 컨트롤에서 특성을 지원하지 않는 경우 입니다. TextRange 컨트롤 패턴 사양에서는 새 텍스트 특성 식별자를 추가하거나 기존 특성이 정의되는 방식을 변경할 수 없습니다.
  • 가능한 경우 ITextRangeProvider::GetBoundingRectangles 메서드는 텍스트 범위에서 완전히 또는 부분적으로 표시되는 각 텍스트 줄에 대해 하나의 경계 사각형이 포함된 배열을 반환해야 합니다. 이렇게 할 수 없는 경우 공급자는 완전히 표시되는 선의 경계 사각형만 포함하는 배열을 반환할 수 있습니다. 그러나 이렇게 하면 화면에 텍스트가 표시되는 방식을 정확하게 설명하는 클라이언트 애플리케이션의 기능이 제한됩니다.
  • ITextRangeProvider::GetChildren 메서드는 텍스트 범위에 포함된 모든 자식 요소를 반환해야 하지만 자식 요소의 자식을 반환할 필요는 없습니다. 예를 들어 텍스트 범위에 여러 자식 셀이 있는 표가 포함된 경우 GetChildren 메서드는 셀 요소가 아닌 테이블 요소만 반환할 수 있습니다. 성능 또는 아키텍처상의 이유로 공급자가 자동화 트리의 문서에 호스트되는 모든 포함된 개체를 노출하지 못할 수 있습니다. 이 경우 공급자는 적어도 GetChildren 메서드를 통해 자식 개체의 열거를 지원해야 하며, 옵션으로 가상화 해제 지원을 위한 VirtualizedItem 컨트롤 패턴을 지원해야 합니다.
  • ITextRangeProvider::GetEnclosingElement 메서드는 일반적으로 텍스트 범위를 제공하는 텍스트 공급자를 반환합니다. 그러나 텍스트 공급자가 테이블 또는 하이퍼링크와 같은 자식 개체를 지원하는 경우 바깥쪽 요소는 텍스트 공급자의 하위 항목일 수 있습니다. GetEnclosingElement에서 반환되는 요소는 지정된 텍스트 범위와 가장 가까운 요소여야 합니다. 예를 들어 텍스트 범위가 테이블의 셀에 있는 경우 GetEnclosingElement 는 table 요소 대신 포함된 셀을 반환해야 합니다.
  • ITextRangeProvider::GetText 메서드는 범위의 일반 텍스트를 반환해야 합니다. 자세한 내용은 텍스트 범위에서 텍스트 획득을 참조하세요.
  • ITextRangeProvider::ScrollIntoView를 호출하면 alignToTop 매개 변수에 지정된 대로 텍스트 컨트롤의 뷰포트에 있는 텍스트를 정렬해야 합니다. 가로 맞춤 측면에서는 요구 사항이 없지만 텍스트 범위는 가로 및 세로로 모두 표시되어야 합니다. alignToTop 매개 변수를 평가할 때 공급자는 텍스트 컨트롤의 방향과 텍스트의 흐름 방향을 고려해야 합니다. 예를 들어 오른쪽에서 왼쪽으로 흐르는 텍스트를 포함하는 세로 방향 텍스트 컨트롤에 대해 alignToTopTRUE 인 경우 공급자는 텍스트 범위를 뷰포트의 오른쪽에 맞춰야 합니다.
  • TextUnit_Line 문서를 이동할 때 텍스트 범위가 포함된 표에 들어가면 셀의 각 텍스트 줄을 한 줄로 처리해야 합니다.

ITextProvider에 필요한 멤버

ITextProvider 인터페이스를 구현하려면 다음 속성과 메서드가 필요합니다.

필요한 멤버 멤버 형식 참고
DocumentRange 속성 없음
SupportedTextSelection 속성 없음
GetSelection 방법 없음
GetVisibleRanges 방법 없음
RangeFromChild 방법 없음
RangeFromPoint 방법 없음
UIA_Text_TextChangedEventId 이벤트 없음
UIA_Text_TextSelectionChangedEventId 이벤트 없음

 

ITextProvider2 인터페이스를 구현하려면 다음과 같은 추가 속성과 메서드가 필요합니다.

필요한 멤버 멤버 형식 참고
GetCaretRange 방법 없음
RangeFromAnnotation 방법 없음

 

ITextRangeProvider에 필요한 멤버

ITextRangeProvider 인터페이스를 구현하려면 다음 속성과 메서드가 필요합니다.

필요한 멤버 멤버 형식 참고
AddToSelection 방법 없음
복제 방법 없음
비교 방법 없음
CompareEndpoints 방법 없음
ExpandToEnclosingUnit 방법 없음
FindAttribute 방법 없음
Findtext 방법 없음
GetAttributeValue 방법 없음
GetBoundingRectangles 방법 없음
GetChildren 방법 없음
GetEnclosingElement 방법 없음
Gettext 방법 없음
이동 방법 없음
MoveEndpointByUnit 방법 없음
MoveEndpointByRange 방법 없음
Select 방법 없음
ScrollIntoView 방법 없음

 

ITextRangeProvider2 인터페이스를 구현하려면 다음과 같은 추가 속성과 메서드가 필요합니다.

필요한 멤버 멤버 형식 참고
ShowContextMenu 메서드 "ShowContextMenu 구현" 섹션을 참조하세요.

 

TextRange 컨트롤 패턴에는 연결된 이벤트가 없습니다.

지원 텍스트 범위

이 섹션에서는 공급자가 TextRange 컨트롤 패턴을 지원하기 위해 ITextRangeProviderITextRangeProvider2 인터페이스의 다양한 메서드를 구현하는 방법을 설명합니다.

텍스트 단위로 텍스트 범위 조작

ITextRangeProvider 인터페이스는 텍스트 기반 컨트롤에서 텍스트 범위를 조작하고 탐색하는 여러 메서드를 제공합니다. ITextRangeProvider::Move, MoveEndpointByUnitExpandToEnclosingUnit 메서드는 문자, 단어, 단락 등 지정된 텍스트 단위로 텍스트 범위 또는 해당 엔드포인트 중 하나를 이동합니다. 자세한 내용은 UI 자동화 텍스트 단위를 참조하세요.

이름에도 불구하고 ITextRangeProvider::ExpandToEnclosingUnit 메서드가 반드시 텍스트 범위를 확장할 필요는 없습니다. 대신 범위가 지정된 텍스트 단위를 포함하도록 엔드포인트를 이동하여 텍스트 범위를 "정규화"합니다. 범위가 지정된 단위보다 작으면 확장되거나 지정된 단위보다 길면 줄입니다. ExpandToEnclosingUnit 메서드는 항상 일관된 방식으로 텍스트 범위를 정규화하는 것이 중요합니다. 그렇지 않으면 텍스트 단위에 의한 텍스트 범위 조작의 다른 측면을 예측할 수 없습니다. 다음 다이어그램에서는 ExpandToEnclosingUnit 이 범위의 엔드포인트를 이동하여 텍스트 범위를 정규화하는 방법을 보여 줍니다.

expandtoenclosingunit 호출 전후의 텍스트 범위 엔드포인트 위치를 보여 주는 다이어그램

텍스트 범위가 텍스트 단위의 시작 부분에서 시작되고 다음 텍스트 단위 경계의 시작 또는 이전에서 끝나는 경우 끝 엔드포인트는 다음 텍스트 단위 경계로 이동됩니다(이전 다이어그램의 1과 2 참조).

텍스트 범위가 텍스트 단위의 시작 부분에서 시작되고 다음 단위 경계에서 또는 그 이후에 끝나는 경우 끝 엔드포인트가 유지되거나 시작 엔드포인트 이후의 다음 단위 경계로 뒤로 이동됩니다(이전 그림의 3 및 4 참조). 시작 엔드포인트와 끝 엔드포인트 사이에 두 개 이상의 텍스트 단위 경계가 있는 경우 끝 엔드포인트는 시작 엔드포인트 뒤의 다음 단위 경계로 뒤로 이동하여 텍스트 단위 길이가 1개인 텍스트 범위를 만듭니다.

텍스트 범위가 텍스트 단위 중간에 시작되면 시작 엔드포인트가 텍스트 단위의 시작 부분으로 뒤로 이동되고 필요에 따라 끝 엔드포인트가 시작 엔드포인트 뒤의 다음 단위 경계로 앞으로 또는 뒤로 이동됩니다(이전 다이어그램의 5~8 참조).

ITextRangeProvider::Move 메서드가 호출되면 공급자는 ExpandToEnclosingUnit 메서드와 동일한 정규화 논리를 사용하여 지정된 텍스트 단위로 텍스트 범위를 정규화합니다. 그런 다음 공급자는 지정된 텍스트 단위 수만큼 범위를 뒤로 또는 앞으로 이동합니다. 범위를 이동할 때 공급자는 텍스트에 포함된 개체의 경계를 무시해야 합니다. 그러나 단위 경계 자체는 포함된 개체의 존재에 의해 영향을 받을 수 있습니다. 다음 다이어그램에서는 Move 메서드가 포함된 개체 및 텍스트 단위 경계에서 단위 단위로 텍스트 범위를 이동하는 방법을 보여 줍니다.

이동 메서드가 개체 및 텍스트 단위 경계를 넘어 범위 엔드포인트를 이동하는 방법을 보여 주는 다이어그램

다음 그림과 같이 ITextRangeProvider::MoveEndpointByUnit 메서드는 지정된 텍스트 단위에 따라 엔드포인트 중 하나를 앞뒤로 이동합니다.

moveendpointbyunit이 범위의 엔드포인트를 이동하는 방법을 보여 주는 다이어그램

ITextRangeProvider::MoveEndpointByRange 메서드를 사용하면 클라이언트 애플리케이션이 텍스트 범위의 엔드포인트 하나를 두 번째 텍스트 범위의 지정된 엔드포인트와 동일한 위치로 설정할 수 있습니다.

텍스트 범위에서 텍스트 선택

ITextRangeProvider 인터페이스에는 텍스트 기반 컨트롤에서 텍스트 선택을 제어하는 여러 메서드가 포함되어 있습니다.

ITextRangeProvider::Select 메서드는 텍스트 범위에 해당하는 텍스트를 선택하고 텍스트 컨트롤에서 이전 선택 영역(있는 경우)을 제거해야 합니다. 퇴행 텍스트 범위에서 Select 를 호출하는 경우 공급자는 텍스트를 선택하지 않고 삽입 지점을 텍스트 범위의 위치로 이동해야 합니다.

컨트롤이 여러 개의 연결되지 않은 텍스트 범위 선택을 지원하는 경우 ITextRangeProvider::AddToSelectionRemoveFromSelection 메서드는 선택한 텍스트 범위의 컬렉션에 텍스트 범위를 추가하고 제거합니다. 컨트롤이 한 번에 하나의 선택한 텍스트 범위만 지원하지만 선택 작업으로 인해 여러 개의 비연속 텍스트 범위가 선택되는 경우 공급자는 E_INVALIDOPERATION 오류를 반환하거나 현재 선택 영역을 확장하거나 잘라야 합니다. ITextProvider::SupportedTextSelection 속성은 컨트롤이 단일 또는 여러 텍스트 범위의 선택을 지원하는지 아니면 전혀 지원하지 않는지를 나타내야 합니다.

텍스트 기반 컨트롤이 텍스트 삽입을 지원하는 경우 컨트롤의 퇴행 텍스트 범위에서 ITextRangeProvider::AddToSelection 또는 RemoveFromSelection 을 호출하면 삽입 지점이 이동되지만 텍스트를 선택해서는 안 됩니다.

텍스트 범위에서 텍스트 획득

ITextRangeProvider::GetText 메서드는 텍스트 범위의 일반 텍스트를 반환해야 합니다. 일반 텍스트에는 캐리지 리턴 및 유니코드 LRM(왼쪽에서 오른쪽 표시)과 같이 원본 텍스트에 있는 모든 컨트롤 문자가 포함되어야 합니다. 일반 텍스트에는 원본 텍스트에 있을 수 있는 HTML과 같은 태그가 포함되어서는 안 됩니다. 또한 원본 텍스트의 모든 이스케이프 코드는 일반 텍스트에 해당하는 코드로 변환되어야 합니다. 예를 들어 " " 는 단순 공백 문자로 변환되어야 합니다.

포함된 개체가 텍스트 범위에 걸쳐 있는 경우 일반 텍스트에는 개체의 내부 텍스트가 포함되어야 하지만 설명이 포함된 내부 텍스트와 일치하지 않을 수 있으므로 대체 텍스트(포함된 개체의 name 속성)는 포함되지 않아야 합니다. 자세한 내용은 UI 자동화 포함된 개체를 노출하는 방법을 참조하세요.

ShowContextMenu 구현

ITextRangeProvider2::ShowContextMenu 는 항상 범위의 시작 끝점에 상황에 맞는 메뉴를 표시해야 합니다. 이는 사용자가 범위의 시작 부분에 삽입 지점이 있는 상황에 맞는 메뉴 키 또는 SHIFT + F10을 누른 경우 발생하는 상황과 동일해야 합니다.

상황에 맞는 메뉴를 표시하면 삽입 지점이 지정된 위치로 이동하게 되는 경우 프로그래밍 방식으로 ShowContextMenu를 호출하여 UI 자동화 지원도 수행해야 합니다.

System Caret와의 상호 운용성

삽입 지점을 올바르게 지원하는 것은 UI 자동화 기반으로 하지 않는 애플리케이션을 포함하여 많은 클라이언트 애플리케이션에 매우 중요합니다. 텍스트 컨트롤 패턴에서 삽입 지점은 시스템 캐럿의 위치에 있는 퇴화(빈) 텍스트 범위로 표시됩니다. 삽입 지점이 이동하면 컨트롤이 TextSelectionChanged 이벤트(UIA_Text_TextSelectionChangedEventId)를 발생시켜야 합니다. 일부 클라이언트 애플리케이션은 삽입 지점의 위치를 모니터링하고 텍스트 선택을 추적하기 위해 이 이벤트에 의존합니다.

컨트롤에 선택한 텍스트가 포함된 경우 텍스트 컨트롤 패턴의 현재 디자인은 삽입 지점의 위치를 특정 텍스트 범위와 직접 연결하는 방법을 제공하지 않습니다. 공급자는 텍스트 선택을 추적하고 삽입 지점의 위치를 적절하게 설정해야 합니다. 일반적으로 Shift 또는 Ctrl 키를 누른 상태에서 삽입 지점을 이동하거나 둘 다 선택하여 텍스트를 선택하기 때문에 공급자는 선택 항목이 변경 될 때마다 이러한 키의 상태를 확인하여 텍스트 선택을 추적할 수 있습니다.

접근성 프레임워크는 시스템 caret에 대한 기본 제공 지원을 제공하지만 사용자 지정 caret에 대한 지원은 제공하지 않으므로 텍스트 기반 컨트롤은 가능하면 시스템 케어를 사용해야 합니다. 사용자 지정 캐럿을 사용하는 컨트롤은 사용자 지정 캐럿과 동일한 차원의 시스템 캐럿을 만들고, 시스템 캐럿을 사용자 지정 캐럿과 컨트롤의 UI에 있는 동일한 위치, 즉 삽입 지점에 배치하여 캐럿에 액세스할 수 있도록 할 수 있습니다. 또는 사용자 지정 캐럿을 사용하는 컨트롤은 OBJID_CARET 대한 Microsoft Active Accessibility 공급자를 구현하여 사용자 지정 캐럿에 대한 접근성 정보를 직접 제공할 수 있습니다.

시스템 캐럿에 대한 자세한 내용은 Carets를 참조하세요.

컨트롤이 시스템 caret의 위치를 제대로 노출하는지 테스트하려면 검사액세스 가능한 Event Watcher 도구를 사용합니다.

시스템 캐리트 비트맵 중앙의 화면 좌표는 항상 삽입 지점의 위치와 일치해야 합니다. 이렇게 하면 클라이언트는 ITextProvider::RangeFromPoint 호출에서 캐럿 화면 좌표를 사용하여 삽입 지점의 위치를 정확하게 나타내는 텍스트 범위를 검색할 수 있습니다.

컨트롤 형식 및 지원되는 컨트롤 패턴

텍스트 컨트롤 형식

TextEdit 컨트롤 패턴

TextChild 컨트롤 패턴

UI 자동화 컨트롤 패턴 개요

텍스트 콘텐츠에 대한 UI 자동화 지원

UI 자동화 트리 개요