다음을 통해 공유


연습: 내게 필요한 옵션이 지원되는 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로 지정합니다. 자세한 내용은 새 솔루션 및 프로젝트 만들기를 참조하십시오.

폼에 컨트롤 추가

폼에 컨트롤을 추가할 때는 내게 필요한 옵션이 있는 응용 프로그램이 되도록 다음 지침을 따라야 합니다.

  • AccessibleDescriptionAccessibleName 속성을 설정합니다. 이 예제에서 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

    완성된 폼은 다음과 같습니다.

    Pizza Order Form

고대비 모드 지원

고대비 모드는 시각 장애가 있는 사용자에게 도움이 되는 대비 색과 글꼴 크기를 사용하여 판독성을 향상시키는 Windows 시스템 설정입니다. SystemInformation.HighContrast 속성은 고대비 모드의 설정 여부를 결정하기 위해 제공됩니다.

SystemInformation.HighContrast가 true이면 응용 프로그램이 다음과 같이 작동합니다.

  • 시스템 색 구성표를 사용하여 모든 사용자 인터페이스 요소를 표시합니다.

  • 색을 통해 전달되는 모든 정보를 시각적 큐 또는 소리로써 전달합니다. 예를 들어, 특정 목록 항목이 빨간색 글꼴을 사용하여 강조 표시될 경우, 해당 글꼴을 굵게 표시하여 사용자에게 항목을 강조 표시하는 비 컬러 큐를 제공할 수 있습니다.

  • 텍스트 뒤에 나타나는 모든 이미지와 패턴을 생략합니다.

응용 프로그램은 시작할 때 HighContrast의 설정을 확인하여 UserPreferenceChanged라는 시스템 이벤트에 응답해야 합니다. UserPreferenceChanged 이벤트는 HighContrast의 값이 변경될 때마다 발생합니다.

이 응용 프로그램에서 색에 대해 시스템 설정을 사용하지 않는 유일한 요소는 lblCompanyName입니다. SystemColors 클래스는 레이블의 색 설정을 사용자가 선택한 시스템 색으로 변경하는 데 사용됩니다.

고대비 모드를 효과적으로 사용하려면

  1. 레이블 색을 시스템 색으로 설정하는 메서드를 만듭니다.

    ' 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());
       }
    }
    
  2. 폼 생성자(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();
    }
    
  3. 적절한 시그니처를 사용하여 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();
    }
    
  4. 이벤트 프로시저를 시스템 이벤트에 연결하는 코드를 폼 생성자에서 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
       //
    }
    
  5. 응용 프로그램을 종료할 때 이벤트를 해제하는 코드를 폼의 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);
       }
    
  6. F5 키를 눌러 응용 프로그램을 실행합니다.

소리가 아닌 다른 방법으로 중요한 정보 전달

이 응용 프로그램에서는 정보를 소리로만 전달하지 않습니다. 응용 프로그램에 소리를 사용하는 경우에는 해당 정보를 다른 방법으로도 제공해야 합니다.

소리가 아닌 다른 방법으로 정보를 제공하려면

  1. Windows API 함수인 FlashWindow를 사용하여 제목 표시줄이 깜박이도록 설정합니다. Windows API 함수를 호출하는 방법에 대한 예제를 보려면 연습: Windows API 호출을 참조하십시오.

    참고:

    컴퓨터의 내장 스피커를 통해 시스템 소리가 재생될 때 창이 깜박이게 하는 Windows 소리 탐지 서비스를 사용할 수도 있습니다.

  2. 중요한 정보를 비모달 창에 표시하여 사용자가 응답하도록 합니다. 자세한 내용은 모달 및 모덜리스 Windows Forms 표시를 참조하십시오.

  3. 키보드 포커스가 있는 메시지 상자를 표시합니다. 사용자가 입력 중인 경우에는 이 방법을 사용하지 않는 것이 좋습니다.

  4. 작업 표시줄의 상태 알림 영역에 상태 표시기를 표시합니다. 자세한 내용은 Windows Forms NotifyIcon 구성 요소를 사용하여 작업 표시줄에 응용 프로그램 아이콘 추가를 참조하십시오.

응용 프로그램 테스트

구현된 내게 필요한 옵션은 응용 프로그램을 배포하기 전에 테스트해야 합니다.

내게 필요한 옵션을 테스트하려면

  1. 키보드 액세스를 테스트하려면 마우스를 분리하고 키보드만 사용하여 사용자 인터페이스의 각 기능을 탐색합니다. 모든 작업을 키보드만 사용하여 수행할 수 있는지 확인합니다.

  2. 고대비 지원을 테스트하려면 제어판에서 내게 필요한 옵션 아이콘을 선택한 다음 디스플레이 탭을 클릭하고 고대비 사용 확인란을 선택합니다. 모든 사용자 인터페이스 요소를 탐색하여 색 및 글꼴 변경 내용이 반영되었는지 확인합니다. 또한 텍스트 뒤에 나타나는 이미지와 패턴이 생략되었는지 확인합니다.

    참고:

    Windows NT 4의 제어판에는 내게 필요한 옵션 아이콘이 없습니다. 따라서 Windows NT 4에서는 이 방법을 사용하여 SystemInformation.HighContrast 설정을 변경할 수 없습니다.

  3. 다른 도구에서도 쉽게 응용 프로그램의 내게 필요한 옵션을 테스트할 수 있습니다.

  4. 키보드 포커스 노출을 테스트하려면 돋보기를 실행합니다. 돋보기를 열려면 시작 메뉴를 클릭하고 프로그램, 보조프로그램, 내게 필요한 옵션을 차례로 가리킨 다음 돋보기를 클릭합니다. 키보드 탭 이동과 마우스를 모두 사용하여 사용자 인터페이스를 탐색합니다. 또한 돋보기에서 모든 탐색이 제대로 추적되는지 확인합니다.

  5. 화면 요소 노출을 테스트하려면 Inspect를 실행하고 마우스와 Tab 키를 둘 다 사용하여 각 요소로 이동합니다. UI의 각 개체에 대해 Inspect 창의 이름, 상태, 역할, 위치 및 값 필드에 표시된 정보가 의미 있는 것인지 확인합니다. Inspect는 https://msdn.microsoft.com/library/default.asp?url=/downloads/list/accessibility.asp에서 다운로드할 수 있는 Microsoft® Active Accessibility® SDK의 일부로 설치됩니다.