프로젝트에 ImageForm을 추가하세요. ImageForm에는 선택한 평가 프로젝트의 자동화 요소를 계층적으로 보여주는 트리 뷰와 평가 대상 프로세스의 메인 창 이미지를 보여주는 PictureControl을 자식으로 배치합니다.
번호 | 컨트롤 형식 | 컨트롤 이름 | 특이 사항 |
1 | TreeView | tv_hierarchy | |
2 | PictureBox | pb_image | SizeMode 속성을 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