프로그래밍 기술/소프트웨어 접근성, UI 자동화

9. 접근성 평가 도구 만들기 - 7. EHAutoElem 클래스

언제나휴일 2016. 10. 24. 16:53
반응형

9.2.5 EHAutoElem 클래스

 

 자동화 요소와 해당 요소에서 지원하는 컨트롤 패턴을 참조할 있는 클래스입니다. 그리고 추가로 해당 요소의 화면을 캡쳐한 이미지를 멤버로 갖고 있습니다.

 

 자동화 기술을 사용하기 위해 UIAutomationClient.dll, UIAutomationTypes.dll 어셈블리를 참조 추가합니다.

 

 멤버 필드로 컨트롤 유형 열거형을 키로 컨트롤 패턴을 값으로 하는 사전을 생성하여 자동화 요소의 지원 컨트롤 패턴을 보관하고 필요할 참조하기 쉽게 제공할게요.

Dictionary<ENUM_CONTROLObject> pt_dic =

              new Dictionary<ENUM_CONTROLobject>();

 

 접근성 속성을 저장하는 리스트를 두어 참조하기 쉽게 할게요.

List<string> curval = new List<string>();

 

 접근성 요소의 화면 영역을 캡쳐한 비트맵 개체를 참조할 수 있는 멤버 필드를 선언할게요.

Bitmap gray_image = null;

 

 EHAutoElem 클래스의 가장 주요한 역할을 자동화 요소를 래핑하는 것입니다. 따라서 래핑한 자동화 요소를 참조하는 속성을 제공합니다.

public AutomationElement AE

{

    get;

    private set;

}

 

 자동화 평가 도우미에서는 자동화 요소를 검색하면서 계층적인 형태를 TreeNode에 형성할 것입니다. 따라서 자동화 요소와 대응하는 TreeNode를 참조하기 위한 Tag 속성을 제공하는데 TreeNode와 관계를 느슨하게 하기 위해 Object 형식으로 속성을 제공할게요.

public Object Tag

{

    get;

    set;

}

 자동화 요소에 대응하는 Bitmap 이미지와 흑백으로 변환한 이미지를 참조하는 속성도 제공할게요.

public Bitmap Image

{

    get;

    private set;

}

public Bitmap GrayImage

{

    get

    {

        if (gray_image == null)

        {

            MakeGrayImage();

        }

        return gray_image;

    }

}

private void MakeGrayImage()

{

    Bitmap gi = new Bitmap(Image.Width, Image.Height);

    Color color;

    int aver = 0;

    for (int x = 0; x < Image.Width; x++)

    {

        for (int y = 0; y < Image.Height; y++)

        { 

            color = Image.GetPixel(x,y);

            aver = (color.R+color.G+color.B)/3;

            gi.SetPixel(x, y, Color.FromArgb(aver, aver, aver));

        }

    }

    gray_image = gi;

}

 

 

 생성자는 자동화 요소를 입력 인자로 받습니다. 생성자에서는 자동화 요소 속성을 설정하는 것부터 시작합니다. 그리고 Window.Rect 형식의 사각영역 속성을 Rectangle 변환하고 사각 영역의 이미지를 얻어오는 작업과 자동화 속성 정보를 분석하고 지원하는 자동화 컨트롤 패턴을 분석하는 작업을 수행합니다.

public EHAutoElem(AutomationElement ae)

{

    AE = ae;

    try

    {

        Rectangle rect = GetBoundaryRect();

        Image = new Bitmap(rect.Width, rect.Height);

        Graphics g = Graphics.FromImage(Image);

        g.CopyFromScreen(rect.Location, new Point(0, 0), rect.Size);

        g.Save();

    }

    catch { }

    Tag = null;

    try

    {

        CurrentValueParsing();

        CurrentPatternParsing();

    }

    catch {   }

}

 

 자동화 요소의 기본 속성은 자동화 요소의 Current 멤버를 통해 얻어와서 리스트에 추가합니다. 책에서는 평가 내용을 기재하는 부분은 작성하지 않았는데 프로그램을 확장한다면 자동화 요소마다 코멘트를 작성하고 이를 저장할 있게 리스트의 항목을 문자열을 보관하였습니다.

private void CurrentValueParsing()

{

    curval.Add(string.Empty); //평가 내용을 기재하기 위한 필드 - 현재 사용 안함

    curval.Add(AE.Current.AcceleratorKey);

    ... 중략...

}

 

 자동화 요소의 지원 컨트롤 유형은 자동화 요소의 컨트롤 패턴을 얻어오는 메서드를 이용하여 해당 컨트롤 패턴을 지원하면 사전에 보관합니다.

private void CurrentPatternParsing()

{

    Object obj;

    if (AE.TryGetCurrentPattern(DockPattern.Pattern, out obj))

    {

        pt_dic[ENUM_CONTROL.DOCK] = obj as DockPattern;

    }

    if (AE.TryGetCurrentPattern(ExpandCollapsePattern.Pattern, out obj))

    {

        pt_dic[ENUM_CONTROL.EXPANDCOLLAPSE] = obj as ExpandCollapsePattern;

    }

    ... 중략 ...

}

 

  외에도 특정 인덱스로 자동화 요소의 속성을 참조하는 메서드 컨트롤 유형 열거형으로 컨트롤 패턴을 참조하는 메서드 등을 제공할게요.

public string GetAEPropertyByIndex(int index)

{

    return curval[index];

}

public object GetPattern(ENUM_CONTROL dptype)

{

    if (pt_dic.ContainsKey(dptype))

    {

        return pt_dic[dptype];

    }

    return null;

}

 

반응형