5) ImageForm

프로젝트에 ImageForm을 추가하세요. ImageForm에는 선택한 평가 프로젝트의 자동화 요소를 계층적으로 보여주는 트리 뷰와 평가 대상 프로세스의 메인 창 이미지를 보여주는 PictureControl을 자식으로 배치합니다.

[그림 10.13] ImageForm의 자식 컨트롤 배치
번호컨트롤 형식컨트롤 이름특이 사항
1TreeViewtv_hierarchy 
2PictureBoxpb_imageSizeMode 속성을 AutoSize로 설정

[표 10.5] ImageForm의 자식 컨트롤

선택한 요소 이미지의 사각 영역에 하이라이트를 표시하여 평가자가 인식하기 쉽게 할 것입니다. 이를 위한 EHHighlight 형식 멤버 필드를 선언하세요.

EHHighlight eh = null;

하이라이트를 표시할 사각 영역과 기준 사각 영역 및 선택한 요소를 기억할 멤버 필드를 선언합니다.

Rectangle rect;
Rectangle base_rect;
EHAutoElem eae;

이미지 폼의 Load 이벤트 핸들러를 등록하세요.

private void ImageForm_Load(object sender, EventArgs e)
{

평가 프로젝트 매니저 단일체를 구하고 현재 평가 대상 프로젝트를 구합니다.

    EvalManager EM =EvalManager.Manager;
    AccEvalProject aeproject =   EM.CurrentProject;

현재 선택한 평가 대상 프로젝트가 없으면 이벤트 핸들러를 종료합니다.

    if (aeproject == null){    return;    }

평가 대상 프로젝트의 메인 창이 이동하면 시각화할 기준 사각 영역이 바뀌므로 이를 인지할 수 있게 평가 대상 프로젝트 개체의 AEMoved 이벤트에 이벤트 핸들러를 등록합니다.

    aeproject.AEMoved += new AutomationPropertyChangedEventHandler(aeproject_AEMoved);

평가 대상 프로젝트의 메인 창 이미지를 표시합니다.

    pb_image.Image = aeproject.Image;

평가 대상 프로젝트 개체에서 계층 트리에서의 Root 노드를 가져와서 복제합니다.

    TreeNode tr = aeproject.Root as TreeNode;
    TreeNode nd = tr.Clone() as TreeNode;

트리 노드의 Tag에 설정한 EHAutoElem 개체를 가져옵니다. 여기서 가져온 개체는 메인 윈도우 창을 래핑한 EHAutoElem 개체입니다.

    eae = nd.Tag as EHAutoElem;

기준 사각 영역을 설정하고 계층화 트리뷰에 트리 노드를 추가한 후 펼칩니다.

    base_rect = eae.GetBoundaryRect();
    tv_hierarchy.Nodes.Add(nd);
    tv_hierarchy.ExpandAll();
    tv_hierarchy.SelectedNode = tv_hierarchy.Nodes[0];

사각 영역을 계산한 후 EHHighlight 개체를 생성하여 사각 영역에 하이라이트를 표시합니다.

    rect = pb_image.RectangleToScreen(pb_image.ClientRectangle);
    eh = new EHHighlight();
    eh.Visible = true;
    SetDrawRect(base_rect);
}
void aeproject_AEMoved(object sender, AutomationPropertyChangedEventArgs e)
{

평가 대상 프로젝트의 메인 창이 움직였을 때 발생하는 이벤트를 통보 받으면 사각 영역을 얻어와서 기준 사각 영역을 다시 설정합니다.

            base_rect = eae.GetBoundaryRect();
}

시각화할 사각 영역을 계산하는 메서드를 구현합니다.

private void SetDrawRect(Rectangle now_rect)
{

상대적 위치를 반영한 x,y 위치를 구한 후에 이를 반영합니다.

    int x = now_rect.Left - base_rect.Left +rect.Left;
    int y = now_rect.Top - base_rect.Top +rect.Top;
    eh.Rect = new Rectangle(x, y, now_rect.Width, now_rect.Height);
}

트리 뷰의 AfterSelect 이벤트 핸들러를 등록합니다. 선택 노드를 변경하거나 이미지 폼을 이동하면 선택 노드를 그려주어야 합니다. 선택 노드를 그려주는 DrawSelectNode 메서드를 만들어서 호출합니다.

private void tv_hierarchy_AfterSelect(object sender, TreeViewEventArgs e)
{
    DrawSelectNode();
}
void DrawSelectNode()
{

선택 노드가 없으면 메서드를 종료합니다.

    if (tv_hierarchy.SelectedNode == null){    return;    }

선택한 노드의 Tag 속성에 설정한 EHAutoElem 개체를 참조하여 사각 영역을 구하여 하이라이트를 그려줄 사각 영역을 설정하는 SetDrawRect 메서드를 호출합니다.

    TreeNode tr = tv_hierarchy.SelectedNode;
    EHAutoElem eae = tr.Tag as EHAutoElem;
    SetDrawRect(eae.GetBoundaryRect());
}

이미지 폼의 Move 이벤트 핸들러를 등록합니다.

private void ImageForm_Move(object sender, EventArgs e)
{

픽쳐 박스 이미지의 스크린 영역 좌표를 얻어와서 선택한 노드를 그려줍니다.

    rect = pb_image.RectangleToScreen(pb_image.ClientRectangle);
    DrawSelectNode();
}

이미지 폼의 Closed 이벤트 핸들러를 등록합니다.

private void ImageForm_FormClosed(object sender, FormClosedEventArgs e)
{

하이라이트를 표시하기 위한 eh 개체의 Close 메서드를 호출합니다.

    eh.Close();
    eh = null;
}
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Automation;

namespace 접근성_평가_도우미
{
    public partial class ImageForm : Form
    {
        EHHighlight eh = null;
        Rectangle rect;
        Rectangle base_rect;
        EHAutoElem eae;

        public ImageForm()
        {
            InitializeComponent();
        }

        private void ImageForm_Load(object sender, EventArgs e)
        {
            EvalManager EM =EvalManager.Manager;
            AccEvalProject aeproject =   EM.CurrentProject;
            if (aeproject == null){    return;    }
            aeproject.AEMoved += 
                   new AutomationPropertyChangedEventHandler(aeproject_AEMoved);
            pb_image.Image = aeproject.Image;
            TreeNode tr = aeproject.Root as TreeNode;
            TreeNode nd = tr.Clone() as TreeNode;
            eae = nd.Tag as EHAutoElem;
            base_rect = eae.GetBoundaryRect();
            tv_hierarchy.Nodes.Add(nd);
            tv_hierarchy.ExpandAll();
            tv_hierarchy.SelectedNode = tv_hierarchy.Nodes[0];
            rect = pb_image.RectangleToScreen(pb_image.ClientRectangle);
            eh = new EHHighlight();
            eh.Visible = true;
            SetDrawRect(base_rect);
        }
        void aeproject_AEMoved(object sender, AutomationPropertyChangedEventArgs e)
        {
            base_rect = eae.GetBoundaryRect();
        }
        private void SetDrawRect(Rectangle now_rect)
        {
            int x = now_rect.Left - base_rect.Left +rect.Left;
            int y = now_rect.Top - base_rect.Top +rect.Top;
            eh.Rect = new Rectangle(x, y, now_rect.Width, now_rect.Height);
        }
        private void tv_hierarchy_AfterSelect(object sender, TreeViewEventArgs e)
        {
            DrawSelectNode();
        }
        void DrawSelectNode()
        {
            if (tv_hierarchy.SelectedNode == null){    return;   }
            TreeNode tr = tv_hierarchy.SelectedNode;
            EHAutoElem eae = tr.Tag as EHAutoElem;
            SetDrawRect(eae.GetBoundaryRect());
        }
        private void ImageForm_Move(object sender, EventArgs e)
        {
            rect = pb_image.RectangleToScreen(pb_image.ClientRectangle);
            DrawSelectNode();
        }
        private void ImageForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            eh.Close();
            eh = null;
        }
    }
}

[소스 10.13] ImageForm.cs