7. 포커스 소유 UI 요소 정보 수집기 만들기

1장에서 6장까지는 UI 자동화 기술에 관한 전반적인 내용을 살펴보았습니다. 이번 장부터는 UI 자동화 기술을 이용하여 프로그래밍하는 것과 접근성과 연관있는 프로그래밍을 다룰 것입니다.

 

이번 장에서는 포커스를 소유한 자동화 요소의 속성과 컨트롤 패턴을 조사하여 이들의 값들을 표시하는 정보 수집기를 만들어 볼 것입니다. 이번 장에서 실습할 프로그래밍은 새로운 기술을 소개하는 부분은 없으며 앞에서 다룬 기술들을 활용하는 부분입니다.

 

이번 실습은 포커스가 바뀔 때마다 포커스를 점유한 자동화 요소의 속성을 컬렉션에 보관하고 수집한 자동화 요소가 어떠한 컨트롤 패턴인지 정보를 확인할 수 있게 하는 프로그램입니다.

 

[그림 7.01] 실행화면
[그림 7.01] 실행화면

 

먼저 폼의 자식 컨트롤을 추가하세요.

번호 컨트롤 타입 컨트롤 명 설명
1 TreeView tv_aeinfo 자동화 요소 정보를 표시
2 ListBox lbox_snap 수집한 자동화 요소의 정보의 스냅샷을 목록에 표시
3 ListBox lbox_pattern 스냅샷 목록에서 선택한 항목의 컨트롤 패턴 표시

[표 3.5] Form1의 컨트롤

 

포커스 소유 UI 요소 정보 수집기 프로젝트에는 디폴트로 제공하는 Form1 클래스외에도 5개의 형식을 정의합니다. WrapAutoEvent 클래스에서는 포커스 변경 이벤트 핸들러를 등록하고 해제하는 역할을 수행하며 포커스 변경 이벤트 발생할 시점의 정보로 스냅샷 개체를 만들어 이를 이벤트 구독자들에게 통보하는 역할을 수행합니다. 그리고 FocusChangedEventArgs 클래스는 스냅샷 개체를 만들어 이벤트 구독자에게 통보할 때 전달할 이벤트 인자 형식입니다. 그리고 이러한 이벤트를 위해 FocusChangedEventHandler 대리자를 정의합니다. 스냅샷 개체는 SnapAE 이름의 클래스로 정의할 것이며 내부적으로 자동화 컨트롤 패턴을 조사하여 목록으로 갖는 WrapPattern 개체를 만들어 속성으로 제공합니다.

 

[그림 7.02] 정의할 형식
[그림 7.02] 정의할 형식

이번 프로젝트는 Bottom up 방식으로 작성합시다.

 

제일 먼저 WrapPattern을 구현합시다. WrapPattern은 자동화 요소의 패턴 목록을 기억할 개체입니다. 사용하는 곳에서 foreach 문으로 제공하는 패턴 이름을 확인할 수 있게 IEnumerable 인터페이스를 구현 약속합시다.

패턴 이름을 보관할 컬렉션을 멤버로 선언합시다.

자동화 요소를 가져오기 할 수 있는 속성을 제공합니다.

생성자에서는 자동화 요소를 입력 인자로 받습니다.

IEnumerable 인터페이스를 구현 약속하여 GetEnumerator 메서드를 제공해야 합니다. 실제 컨트롤 패턴 이름은 ptlist에 보관해서 ptlist의 GetEnumerator 메서드 호출 결과를 By Pass 합니다.

 

[소스 7.1] WrapPattern.cs

 

 

이번에는 자동화 요소 개체의 현재 정보를 캡쳐하여 관리하는 SnapAE 클래스를 정의합시다.

캡쳐한 순번을 부여할 정적 멤버를 선언합니다.

현재까지 캡쳐한 개수를 가져오기 할 수 있는 정적 멤버를 제공합시다.

자신의 캡쳐 일련번호를 가져오기 할 수 있는 멤버를 제공합시다.

원본 자동화 요소 개체를 가져오기 할 수 있는 멤버를 제공합니다.

자동화 속성마다 가져오기 할 수 있는 멤버를 제공합니다.

캡쳐한 시각을 가져오기 할 수 있는 멤버를 제공합시다.

컨트롤 패턴 이름을 목록화한 개체 WP를 가져오기 할 수 있는 멤버를 제공합니다.

 

생성자는 자동화 요소 개체를 입력 인자로 받습니다.

 

 

속성 정보를 트리 노드를 만들는 메서드도 제공합시다.

 

[소스 7.2] SnapAE.cs

포커스 변경 이벤트가 발생하였을 때 수집한 스냅샷 개체를 전달하는 이벤트 인자 형식을 정의합시다.

 

이벤트에 사용할 대리자도 정의합니다.

 

[소스 7.3] FocusChangedEventArgs.cs

 

이번에는 자동화 포커스 변경 이벤트 핸들러를 등록하게 해제하며 포커스 변경할 때마다 스냅샷 개체를 생성하여 이벤트를 게시하는 WrapAutoEvent 클래스를 정의합시다.

자동화 포커스 변경 이벤트 핸들러를 기억할 멤버를 선언합니다.

스냅샷 개체를 생성할 때 게시할 이벤트 멤버를 선언하세요.

자동화 포커스 변경 이벤트 핸들러를 등록하는 메서드를 제공합시다.

자동화 포커스 변경 이벤트 핸들러를 해제하는 메서드도 제공합니다.

 

[소스 7.5] WrapAutoEvent.cs

 

마지막으로 Form1 을 구현합시다. 먼저 Load 이벤트 핸들러를 등록하세요.

ChangeAE 메서드와 원형이 같은 대리자를 정의하세요.

FormClosing 이벤트 핸들러를 등록하세요.

수집 목록 리스트 박스의 선택 변경 이벤트 핸들러를 등록하세요.

 

[소스 7.6] Form1.cs