연습: 내게 필요한 옵션이 지원되는 Windows 기반 응용 프로그램 만들기
업데이트: 2007년 11월
내게 필요한 옵션이 있는 응용 프로그램을 만드는 것은 비즈니스상 중요한 의미를 갖습니다. 여러 정부에서는 소프트웨어 구입과 관련하여 장애인이 쉽게 사용하기 위한 규정을 두고 있습니다. Certified for Windows 로고에는 내게 필요한 옵션의 조건이 포함되어 있습니다. 대부분이 잠재 고객이지만 미국에서만 약 3천만 명이 소프트웨어에서 제공하는 내게 필요한 옵션에 영향을 받습니다.
이 연습에서는 Certified for Windows 로고에 포함된 5개의 내게 필요한 옵션 조건에 대해 설명합니다. 내게 필요한 옵션이 있는 응용 프로그램은 다음과 같은 기능을 지원해야 합니다.
제어판의 크기, 색, 글꼴 및 입력 설정을 지원해야 합니다. 메뉴 모음, 제목 표시줄, 테두리 및 상태 표시줄은 모두 사용자가 제어판 설정을 변경하면 자체적으로 크기가 조정됩니다. 이 응용 프로그램의 컨트롤 또는 코드에는 추가로 변경할 사항이 없습니다.
고대비 모드를 지원해야 합니다.
키보드로 모든 기능을 사용할 수 있어야 하며 이러한 내용을 문서화해야 합니다.
프로그래밍 방식 및 시각적으로 키보드 포커스의 위치를 노출해야 합니다.
중요한 정보를 소리만으로 전달해서는 안 됩니다.
자세한 내용은 내게 필요한 옵션을 제공하는 응용 프로그램 설계를 위한 리소스, MSDN Online Certified for Windows Program 웹 페이지(https://msdn.microsoft.com/certification/default.asp) 및 Designed for Windows XP Application Specification 웹 페이지(https://go.microsoft.com/fwlink/?LinkId=9775)를 참조하십시오.
자판 배열 변경을 지원하는 데 대한 내용은 지역화 대비 응용 프로그램 개발을 위한 최선의 구현 방법을 참조하십시오.
프로젝트 만들기
이 연습에서는 피자 주문을 받는 응용 프로그램의 사용자 인터페이스를 만듭니다. 이 사용자 인터페이스는 고객 이름을 입력할 수 있는 TextBox, 피자 크기를 선택할 수 있는 RadioButton 그룹, 토핑을 선택할 수 있는 CheckedListBox, 각각 Order와 Cancel이라는 레이블이 붙은 두 개의 Button 컨트롤 및 Exit 명령이 포함된 메뉴로 구성됩니다.
사용자가 고객 이름, 피자 크기 및 원하는 토핑을 입력한 다음 Order 단추를 클릭하면 주문 내용과 가격이 요약되어 메시지 상자에 표시되고 다음 주문을 받기 위해 컨트롤의 내용이 지워집니다. 사용자가 Cancel 단추를 클릭하면 다음 주문을 받기 위해 컨트롤의 내용이 지워지고 Exit 메뉴 항목을 클릭하면 프로그램이 닫힙니다.
이 연습에서는 소매 주문 시스템의 코드가 아니라 사용자 인터페이스에서 제공하는 내게 필요한 옵션에 초점을 둡니다. 이 연습에서는 단추, 라디오 단추, 텍스트 상자 및 레이블을 포함하여 자주 사용되는 몇몇 컨트롤의 내게 필요한 옵션을 보여 줍니다.
응용 프로그램 만들기를 시작하려면
- Visual Basic, Visual C# 또는 Visual J#에서 새 Windows 응용 프로그램을 만듭니다. 프로젝트 이름을 PizzaOrder로 지정합니다. 자세한 내용은 새 솔루션 및 프로젝트 만들기를 참조하십시오.
폼에 컨트롤 추가
폼에 컨트롤을 추가할 때는 내게 필요한 옵션이 있는 응용 프로그램이 되도록 다음 지침을 따라야 합니다.
AccessibleDescription 및 AccessibleName 속성을 설정합니다. 이 예제에서 AccessibleRole은 기본 설정대로 둡니다. 자세한 내용은 Windows Form의 컨트롤에 내게 필요한 옵션 정보 제공을 참조하십시오.
글꼴 크기를 10포인트 이상으로 설정합니다.
참고: 시작할 때 폼의 글꼴 크기를 10으로 설정하면 이후에 이 폼에 추가되는 모든 컨트롤의 글꼴 크기가 10이 됩니다.
TextBox 컨트롤을 설명하는 모든 Label 컨트롤은 탭 순서에서 해당 TextBox 컨트롤 바로 앞에 와야 합니다.
사용자가 탐색할 모든 컨트롤의 Text 속성에 "&" 문자를 사용하여 선택키를 추가합니다.
사용자가 탐색할 컨트롤 앞에 오는 레이블의 Text 속성에 "&" 문자를 사용하여 선택키를 추가합니다. 이 레이블의 UseMnemonic 속성을 true로 설정하여 사용자가 해당 선택키를 누르면 탭 순서의 다음 컨트롤에 포커스가 설정되도록 합니다.
모든 메뉴 항목에 선택키를 추가합니다.
내게 필요한 옵션이 있는 Windows 응용 프로그램을 만들려면
폼에 컨트롤을 추가하고 아래 설명과 같이 속성을 설정합니다. 폼에서 컨트롤을 정렬하는 방법을 보여 주는 모델은 표의 끝에 있는 그림을 참조하십시오.
개체
속성
값
Form1
AccessibleDescription
Order form
AccessibleName
Order form
Font Size
10
Text
Pizza Order Form
PictureBox
Name
logo
AccessibleDescription
A slice of pizza
AccessibleName
Company logo
Image
아이콘 또는 비트맵
Label
Name
companyLabel
Text
Good Pizza
TabIndex
1
AccessibleDescription
Company name
AccessibleName
Company name
BackColor
Blue
ForeColor
Yellow
Font Size
18
Label
Name
customerLabel
Text
&Name
TabIndex
2
AccessibleDescription
Customer name label
AccessibleName
Customer name label
UseMnemonic
True
TextBox
Name
customerName
Text
(없음)
TabIndex
3
AccessibleDescription
Customer name
AccessibleName
Customer name
GroupBox
Name
sizeOptions
AccessibleDescription
Pizza size options
AccessibleName
Pizza size options
Text
Pizza size
TabIndex
4
RadioButton
Name
smallPizza
Text
&Small $6.00
Checked
True
TabIndex
0
AccessibleDescription
Small pizza
AccessibleName
Small pizza
RadioButton
Name
largePizza
Text
&Large $10.00
TabIndex
1
AccessibleDescription
Large pizza
AccessibleName
Large pizza
Label
Name
toppingsLabel
Text
&Toppings ($0.75 each)
TabIndex
5
AccessibleDescription
Toppings label
AccessibleName
Toppings label
UseMnemonic
True
CheckedListBox
Name
toppings
TabIndex
6
AccessibleDescription
Available toppings
AccessibleName
Available toppings
Items
Pepperoni, Sausage, Mushrooms
Button
Name
order
Text
&Order
TabIndex
7
AccessibleDescription
Total the order
AccessibleName
Total order
Button
Name
cancel
Text
&Cancel
TabIndex
8
AccessibleDescription
Cancel the order
AccessibleName
Cancel order
MainMenu
Name
theMainMenu
MenuItem
Name
fileCommands
Text
&File
MenuItem
Name
exitApp
Text
E&xit
완성된 폼은 다음과 같습니다.
고대비 모드 지원
고대비 모드는 시각 장애가 있는 사용자에게 도움이 되는 대비 색과 글꼴 크기를 사용하여 판독성을 향상시키는 Windows 시스템 설정입니다. SystemInformation.HighContrast 속성은 고대비 모드의 설정 여부를 결정하기 위해 제공됩니다.
SystemInformation.HighContrast가 true이면 응용 프로그램이 다음과 같이 작동합니다.
시스템 색 구성표를 사용하여 모든 사용자 인터페이스 요소를 표시합니다.
색을 통해 전달되는 모든 정보를 시각적 큐 또는 소리로써 전달합니다. 예를 들어, 특정 목록 항목이 빨간색 글꼴을 사용하여 강조 표시될 경우, 해당 글꼴을 굵게 표시하여 사용자에게 항목을 강조 표시하는 비 컬러 큐를 제공할 수 있습니다.
텍스트 뒤에 나타나는 모든 이미지와 패턴을 생략합니다.
응용 프로그램은 시작할 때 HighContrast의 설정을 확인하여 UserPreferenceChanged라는 시스템 이벤트에 응답해야 합니다. UserPreferenceChanged 이벤트는 HighContrast의 값이 변경될 때마다 발생합니다.
이 응용 프로그램에서 색에 대해 시스템 설정을 사용하지 않는 유일한 요소는 lblCompanyName입니다. SystemColors 클래스는 레이블의 색 설정을 사용자가 선택한 시스템 색으로 변경하는 데 사용됩니다.
고대비 모드를 효과적으로 사용하려면
레이블 색을 시스템 색으로 설정하는 메서드를 만듭니다.
' Visual Basic Private Sub SetColorScheme() If SystemInformation.HighContrast Then companyLabel.BackColor = SystemColors.Window companyLabel.ForeColor = SystemColors.WindowText Else companyLabel.BackColor = Color.Blue companyLabel.ForeColor = Color.Yellow End If End Sub // C# private void SetColorScheme() { if (SystemInformation.HighContrast) { companyLabel.BackColor = SystemColors.Window; companyLabel.ForeColor = SystemColors.WindowText; } else { companyLabel.BackColor = Color.Blue; companyLabel.ForeColor = Color.Yellow; } } // Visual J# private void SetColorScheme() { if (SystemInformation.get_HighContrast()) { companyLabel.set_BackColor(SystemColors.get_Window()); companyLabel.set_ForeColor(SystemColors.get_WindowText()); } else { companyLabel.set_BackColor(Color.get_Blue()); companyLabel.set_ForeColor(Color.get_Yellow()); } }
폼 생성자(Visual Basic의 경우 Public Sub New() , Visual C#에서는 public class Form1 , Visual J#에서는 Public Form1)에서 SetColorScheme 프로시저를 호출합니다. Visual Basic의 생성자에 액세스하려면 Windows Form 디자이너에서 생성한 코드라는 영역을 확장해야 합니다.
' Visual Basic Public Sub New() MyBase.New() InitializeComponent() SetColorScheme() End Sub // C# public Form1() { InitializeComponent(); SetColorScheme(); } // Visual J# public Form1() { InitializeComponent(); SetColorScheme(); }
적절한 시그니처를 사용하여 UserPreferenceChanged 이벤트에 응답하는 이벤트 프로시저를 만듭니다.
' Visual Basic Protected Sub UserPreferenceChanged(ByVal sender As Object, _ ByVal e As Microsoft.Win32.UserPreferenceChangedEventArgs) SetColorScheme() End Sub // C# public void UserPreferenceChanged(object sender, Microsoft.Win32.UserPreferenceChangedEventArgs e) { SetColorScheme(); } // Visual J# public void UserPreferenceChanged(Object sender, Microsoft.Win32.UserPreferenceChangedEventArgs e) { SetColorScheme(); }
이벤트 프로시저를 시스템 이벤트에 연결하는 코드를 폼 생성자에서 InitializeComponents 호출 뒤에 추가합니다. 이 메서드는 SetColorScheme 프로시저를 호출합니다.
' Visual Basic Public Sub New() MyBase.New() InitializeComponent() SetColorScheme() AddHandler Microsoft.Win32.SystemEvents.UserPreferenceChanged, _ AddressOf Me.UserPreferenceChanged End Sub // C# public Form1() { InitializeComponent(); SetColorScheme(); Microsoft.Win32.SystemEvents.UserPreferenceChanged += new Microsoft.Win32.UserPreferenceChangedEventHandler( this.UserPreferenceChanged); } // Visual J# public Form1() { // // Required for Windows Form Designer support // InitializeComponent(); SetColorScheme(); Microsoft.Win32.SystemEvents.add_UserPreferenceChanged( new Microsoft.Win32.UserPreferenceChangedEventHandler(this.UserPreferenceChanged)); // // Add any constructor code after InitializeComponent call // }
응용 프로그램을 종료할 때 이벤트를 해제하는 코드를 폼의 Dispose 메서드에서 기본 클래스의 Dispose 메서드 호출 앞에 추가합니다. Visual Basic의 Dispose 메서드에 액세스하려면 Windows Form 디자이너에서 생성한 코드라고 표시된 영역을 확장해야 합니다.
참고: 시스템 이벤트 코드는 기본 응용 프로그램으로부터 독립된 별개의 스레드를 실행합니다. 이벤트를 해제하지 않으면 해당 이벤트에 연결된 코드가 프로그램이 닫힌 후에도 실행됩니다.
' Visual Basic Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If RemoveHandler Microsoft.Win32.SystemEvents.UserPreferenceChanged, _ AddressOf Me.UserPreferenceChanged MyBase.Dispose(disposing) End Sub // C# protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } Microsoft.Win32.SystemEvents.UserPreferenceChanged -= new Microsoft.Win32.UserPreferenceChangedEventHandler( this.UserPreferenceChanged); base.Dispose( disposing ); } // Visual J# protected void Dispose(boolean disposing) { if (disposing) { if (components != null) { components.Dispose(); } } Microsoft.Win32.SystemEvents.remove_UserPreferenceChanged( new Microsoft.Win32.UserPreferenceChangedEventHandler( this.UserPreferenceChanged)); super.Dispose(disposing); }
F5 키를 눌러 응용 프로그램을 실행합니다.
소리가 아닌 다른 방법으로 중요한 정보 전달
이 응용 프로그램에서는 정보를 소리로만 전달하지 않습니다. 응용 프로그램에 소리를 사용하는 경우에는 해당 정보를 다른 방법으로도 제공해야 합니다.
소리가 아닌 다른 방법으로 정보를 제공하려면
Windows API 함수인 FlashWindow를 사용하여 제목 표시줄이 깜박이도록 설정합니다. Windows API 함수를 호출하는 방법에 대한 예제를 보려면 연습: Windows API 호출을 참조하십시오.
참고: 컴퓨터의 내장 스피커를 통해 시스템 소리가 재생될 때 창이 깜박이게 하는 Windows 소리 탐지 서비스를 사용할 수도 있습니다.
중요한 정보를 비모달 창에 표시하여 사용자가 응답하도록 합니다. 자세한 내용은 모달 및 모덜리스 Windows Forms 표시를 참조하십시오.
키보드 포커스가 있는 메시지 상자를 표시합니다. 사용자가 입력 중인 경우에는 이 방법을 사용하지 않는 것이 좋습니다.
작업 표시줄의 상태 알림 영역에 상태 표시기를 표시합니다. 자세한 내용은 Windows Forms NotifyIcon 구성 요소를 사용하여 작업 표시줄에 응용 프로그램 아이콘 추가를 참조하십시오.
응용 프로그램 테스트
구현된 내게 필요한 옵션은 응용 프로그램을 배포하기 전에 테스트해야 합니다.
내게 필요한 옵션을 테스트하려면
키보드 액세스를 테스트하려면 마우스를 분리하고 키보드만 사용하여 사용자 인터페이스의 각 기능을 탐색합니다. 모든 작업을 키보드만 사용하여 수행할 수 있는지 확인합니다.
고대비 지원을 테스트하려면 제어판에서 내게 필요한 옵션 아이콘을 선택한 다음 디스플레이 탭을 클릭하고 고대비 사용 확인란을 선택합니다. 모든 사용자 인터페이스 요소를 탐색하여 색 및 글꼴 변경 내용이 반영되었는지 확인합니다. 또한 텍스트 뒤에 나타나는 이미지와 패턴이 생략되었는지 확인합니다.
참고: Windows NT 4의 제어판에는 내게 필요한 옵션 아이콘이 없습니다. 따라서 Windows NT 4에서는 이 방법을 사용하여 SystemInformation.HighContrast 설정을 변경할 수 없습니다.
다른 도구에서도 쉽게 응용 프로그램의 내게 필요한 옵션을 테스트할 수 있습니다.
키보드 포커스 노출을 테스트하려면 돋보기를 실행합니다. 돋보기를 열려면 시작 메뉴를 클릭하고 프로그램, 보조프로그램, 내게 필요한 옵션을 차례로 가리킨 다음 돋보기를 클릭합니다. 키보드 탭 이동과 마우스를 모두 사용하여 사용자 인터페이스를 탐색합니다. 또한 돋보기에서 모든 탐색이 제대로 추적되는지 확인합니다.
화면 요소 노출을 테스트하려면 Inspect를 실행하고 마우스와 Tab 키를 둘 다 사용하여 각 요소로 이동합니다. UI의 각 개체에 대해 Inspect 창의 이름, 상태, 역할, 위치 및 값 필드에 표시된 정보가 의미 있는 것인지 확인합니다. Inspect는 https://msdn.microsoft.com/library/default.asp?url=/downloads/list/accessibility.asp에서 다운로드할 수 있는 Microsoft® Active Accessibility® SDK의 일부로 설치됩니다.