다음을 통해 공유


고급 인식 샘플

고급 인식 샘플은 필기 인식에 사용되는 Microsoft Tablet PC Automation API(애플리케이션 프로그래밍 인터페이스)의 고급 기능을 보여 줍니다.

이 관리 팩에는 다음과 같은 기능이 포함되어 있습니다.

  • 설치된 인식기 열거
  • 특정 언어로 인식기 컨텍스트 만들기
  • 인식기 개체 사용
  • 인식 factoid 및 단어 목록 설정
  • 가이드를 사용하여 인식 품질 향상
  • 동적 배경 인식
  • 제스처 인식

사용되는 인터페이스는 IInkRecognizer, IInkRecoContext, IInkRecognitionResult, IInkRecognitionGuide, IInkWordList, IInkGesture, IInkCollector, IInkDisp, IInkRenderer, IInkDrawingAttributes, IInkStrokesIInkStroke입니다.

잉크 및 프로젝트 헤더

먼저 태블릿 PC 자동화 인터페이스에 대한 헤더를 포함합니다. 태블릿 PC 플랫폼 SDK와 함께 설치됩니다. TpcError.h 파일에는 태블릿 PC API 오류 코드 정의가 포함되어 있습니다.

#include <msinkaut.h>
#include <msinkaut_i.c>
#include <TpcError.h>

EventSinks.h 파일은 IInkEventsImplIInkRecognitionEventsImpl 인터페이스를 정의하고 RecognitionWithAlternates, StrokeGesture 이벤트를 설정합니다.

#include "EventSinks.h"

ChildWnds.h 파일에는 ATL의 CWindowImpl에서 파생되고 샘플의 자식 창을 만드는 데 사용되는 CInkInputWndCRecoOutputWnd 클래스의 정의가 포함되어 있습니다.

#include "ChildWnds.h"

AdvReco.h 파일은 이 샘플의 애플리케이션 창 클래스인 CAdvRecoApp 클래스를 선언합니다.

#include "AdvReco.h"

애플리케이션 창 초기화

창의 Run 메서드는 CAdvRecoApp 개체를 설정하고, 창의 메뉴와 아이콘을 로드하고, 기본 인식기에 대한 InkRecognizerContext 개체를 만들고, 창의 메시지 루프를 시작합니다.

창의 OnCreate 메서드는 WM_CREATE 이벤트를 처리하고 자식 창을 만듭니다. InkCollector 개체는 잉크 수집기 이벤트 원본에 연결하고 입력 창에서 잉크 입력을 사용하도록 설정합니다. 그런 다음 InkRecognizerGuide 개체를 만들고 잉크 수집기의 렌더러 속성을 사용하여 인식 가이드 상자 사각형을 잉크 공간으로 변환합니다. 마지막으로 OnCreate 메서드는 InkWordList 개체를 만듭니다.

잉크 수집기 이벤트 처리

창의 OnStroke 메서드는 잉크 수집기 Stroke 이벤트를 처리합니다. 새 IInkStrokeDisp 개체가 잉크 수집기 Ink 속성의 InkStrokes에 추가됩니다.

창의 OnGesture 메서드는 잉크 수집기 제스처 이벤트를 처리합니다. OnGesture 메서드는 가장 높은 신뢰도 제스처를 사용하여 제스처를 먼저 식별하고 창이 이 특정 제스처를 지원하는지 확인합니다. 제스처가 지원되면 제스처가 스트로크 컬렉션에서 제거되므로 제스처의 경계 상자가 무효화됩니다. 제스처가 지원되지 않으면 제스처 이벤트가 취소되어 잉크 수집기가 Stroke 이벤트를 발생합니다. 마지막으로 결과 창이 업데이트됩니다.

Recognizer 컨텍스트 이벤트 처리

창의 OnRecognitionWithAlternates 메서드는 인식기 컨텍스트의 RecognitionWithAlternates 이벤트를 처리합니다. OnRecognitionWithAlternates 메서드는 결과 창에 인식 결과를 표시합니다.

메뉴 명령 처리

창의 OnRecognizer 메서드는 인식기 메뉴의 명령을 처리합니다. Default 명령을 선택한 경우 InkRecognizersGetDefaultRecognizer 메서드를 사용하여 기본 인식기를 검색합니다. 그렇지 않으면 선택한 인식기가 검색됩니다. 그런 다음 인식기 컨텍스트가 만들어지고 사용되고 메뉴 및 상태 표시줄이 업데이트됩니다.

창의 OnFactoidWordlist 메서드는 Factoid 메뉴에서 Wordlist 사용 명령을 처리합니다. 인식기 컨텍스트의 Strokes 속성은 인식기 컨텍스트를 다시 설정하기 위해 NULL 로 설정됩니다. Wordlist 사용 옵션이 꺼져 있으면 인식기 컨텍스트의 WordList 속성이 NULL로 설정됩니다. 그렇지 않으면 인식기 컨텍스트의 WordList 속성이 OnCreate 메서드에서 만든 InkWordList로 설정됩니다. 마지막으로 잉크 수집기의 InkStrokes 가 인식기 컨텍스트에 다시 연결되고 인식기 컨텍스트의 BackgroundRecognizeWithAlternates 메서드가 호출되고 메뉴가 업데이트됩니다.

창의 OnFactoid 메서드는 Factoid 메뉴의 factoid 명령을 처리합니다. 먼저 인식기 컨텍스트의 Strokes 속성을 NULL로 설정하고, 인식기 컨텍스트의 Factoid 속성을 선택한 factoid 로 설정하고, 잉크 수집기의 InkStrokes 를 인식기 컨텍스트에 다시 할당합니다. Factoid 개체가 인식기 컨텍스트에서 지원되는 경우 인식기 컨텍스트의 BackgroundRecognizeWithAlternates 메서드가 호출됩니다. 그렇지 않으면 오류 메시지가 표시됩니다. 마지막으로 메뉴 및 상태 표시줄이 업데이트됩니다.

창의 OnGuide 메서드는 가이드 메뉴의 명령을 처리합니다. 인식기 컨텍스트가 가이드 옵션을 지원하는 경우 OnGuide 메서드는 인식기 컨텍스트의 Strokes 속성을 NULL로 설정하고, 인식기 컨텍스트의 Guide 속성을 선택한 가이드 설정으로 설정하고, 잉크 수집기의 InkStrokes 를 인식기 컨텍스트에 다시 할당하고, 인식기 컨텍스트의 BackgroundRecognizeWithAlternates 메서드를 호출합니다. 그렇지 않으면 오류 메시지가 표시됩니다. 마지막으로 입력 창, 메뉴 및 상태 표시줄이 업데이트됩니다.

창의 OnMode 메서드는 모드 메뉴의 명령을 처리합니다. 잉크 수집기를 사용하지 않도록 설정하고, 잉크 수집기 CollectionMode 속성을 업데이트하고, 메뉴를 업데이트하고, 제스처 목록을 표시하거나 숨깁니다. 마지막으로 잉크 수집기가 사용하도록 설정됩니다.

창의 OnRecognize 메서드는 잉크 메뉴의 Recognize 명령을 처리합니다. 인식기 컨텍스트의 EndInkInput 메서드를 호출하여 잉크가 인식기 컨텍스트에 추가되지 않도록 합니다. 일부 인식기가 부분 인식을 지원하는 것은 아니어도 됩니다. 그런 다음, 인식기 컨텍스트의 Recognize 메서드를 호출하고 결과를 창의 OnRecognitionWithAlternates 메서드에 전달합니다. 마지막으로 잉크 수집기의 InkStrokes 가 인식기 컨텍스트에 다시 할당됩니다.

창의 OnClear 메서드는 잉크 메뉴에서 Clear 명령을 처리합니다. 잉크 수집기 잉크 속성에서 스트로크를 삭제하고, 이전 스트로크 컬렉션을 해제하고, 잉크 수집기 잉크 속성에 대한 새 스트로크 컬렉션을 만들고, 새 스트로크 컬렉션을 인식기 컨텍스트에 연결합니다.

창의 OnExit 메서드는 잉크 메뉴에서 Exit 명령을 처리하고 WM_CLOSE 이벤트를 발생합니다.

도우미 메서드

창의 LoadMenu 메서드는 창의 Run 메서드에서 호출되고 지원되는 인식기 목록과 지원되는 팩토이드 목록을 메뉴에 추가합니다. 먼저 InkRecognizers를 검색합니다. 그런 다음 사용 가능한 인식기를 반복하고 Languages 속성에 언어 목록이 있는 인식 메뉴에 추가되는 언어 목록만 선택합니다. 마지막으로 Factoid 메뉴를 전역 상수로 정의된 factoid 목록으로 채웁니다.

창의 UseRecognizer 메서드는 사용자가 새 인식기를 선택할 때 창의 OnRecognizer 메서드에서 호출됩니다. 인식기 컨텍스트를 만들고, 인식기 이벤트 싱크에서 이전 컨텍스트를 분리하고, 이전 컨텍스트를 지우고 해제하고, 새 컨텍스트를 인식기 이벤트 싱크에 연결합니다.

그런 다음 UseRecognizer 메서드는 InkRecognizerCapabilities 값을 반환하는 인식기 Capabilities 속성을 확인합니다. 인식기가 줄 바꿈 입력을 지원하는 경우 안내선 메뉴의 명령이 사용하도록 설정됩니다. 인식기가 박스형 입력을 지원하는 경우 Boxs 명령이 활성화됩니다. 인식기가 무료 입력을 지원하지 않으면 None 명령이 비활성화됩니다. 현재 가이드 선택이 지원되지 않으면 인식기 컨텍스트의 Guide 속성과 메뉴가 모두 업데이트됩니다.

그런 다음 UseRecognizer 메서드는 인식기 컨텍스트의 WordListFactoid 속성을 설정하려고 시도합니다. 두 설정 중 하나가 인식기에서 지원되지 않는 경우 기본값이 사용되고 메뉴가 업데이트됩니다.

마지막으로 UseRecognizer 메서드는 잉크 수집기 InkDisp 개체의 Strokes 속성을 인식기 컨텍스트에 연결하고, 출력 창의 글꼴을 인식기의 언어에서 지원하는 글꼴로 변경하고, 출력 창을 다시 설정하며, 인식기 컨텍스트의 BackgroundRecognizeWithAlternates 메서드를 호출하여 인식 결과를 업데이트합니다.

창의 GetGestureName 메서드는 창의 OnGesture 메서드에서 호출됩니다. 제스처를 검색하고 AdvReco.rc 파일의 문자열 테이블에 저장된 제스처 이름에 대한 인덱스 를 반환합니다.