逐步解說:建立 Windows 架構的可及性應用程式

建立協助工具應用程式具有重要的商業含意, 許多政府對於市售軟體訂定有協助工具法規, 而擁有「Windows 憑證」標誌就表示符合有關協助工具的要求。 據估計光是美國便有約三千萬居民受到軟體協助工具的影響,而其中大部分是潛在客戶。

本逐步解說將提出「Windows 憑證」標誌的五項協助工具需求。 根據這些需求,協助工具應用程式將會:

  • 支援 [控制台] 的大小、色彩、字型和輸入設定。 當使用者變更 [控制台] 的設定時,功能表列、標題列、框線和狀態列的大小也會隨著調整。 不需要在這個應用程式中對控制項或程式碼進行其他變更。

  • 支援高對比模式。

  • 提供具備輔助說明的所有功能鍵盤存取。

  • 以視覺呈現和程式設計方式顯示鍵盤焦點的位置。

  • 避免只以音效傳達重要資訊。

如需詳細資訊,請參閱設計可及性應用程式的資源

如需支援各種鍵盤配置的資訊,請參閱開發世界性的應用程式的最佳做法

建立專案

本逐步解說會建立一個接受披薩訂單的應用程式使用者介面, 其中包含輸入顧客名稱的 TextBox、選取披薩尺寸的 RadioButton 群組、選取配料的 CheckedListBox、兩個標示為 [訂購] 和 [取消] 的 Button 控制項,以及一個含有結束命令的功能表。

使用者會輸入顧客名稱、披薩尺寸和想要的配料。 當使用者按一下 [訂購] 按鈕時,訊息方塊中會顯示訂單摘要及其費用,然後會清除控制項並準備接受下一筆訂單。 當使用者按一下 [取消] 按鈕時,會清除控制項並準備接受下一筆訂單。 當使用者按一下 [結束] 功能表項目時,程式會關閉。

本逐步解說的重點不在於零售訂單系統的程式碼,而是在於使用者介面的協助工具。 本逐步解說示範數個常用控制項的協助工具功能,這些控制項包括按鈕、選項按鈕、文字方塊和標籤。

開始建立應用程式

  • 在 Visual Basic 或 Visual C# 中建立新的 Windows 應用程式。 將專案命名為 PizzaOrder 如需詳細資訊,請參閱 建立新的方案和專案

將控制項加入表單

將控制項加入表單時,請注意下列建立協助工具應用程式的方針:

  • 設定 AccessibleDescriptionAccessibleName 屬性。 在這個範例中,AccessibleRole 的預設值便已足夠。 如需協助工具屬性的詳細資訊,請參閱提供 Windows Forms 上控制項的協助工具資訊

  • 將字型大小設定為 10 或更大的點數。

    注意

    如果您一開始將表單的字型大小設定為 10,之後加入表單之所有控制項的字型大小都將是 10。

  • 確定任何描述 TextBox 控制項的 Label 控制項都是依定位順序,緊接著位於 TextBox 控制項之前。

  • 使用 “&” 字元將存取金鑰新增至 Text 使用者可能想要流覽至之任何控件的 屬性。

  • 使用 “&” 字元,將訪問鍵新增至 Text 卷標的 屬性,該卷標位於使用者可能想要巡覽至的控件之前。 將標籤的 UseMnemonic 屬性設定為 true如此一來,當使用者按下便捷鍵時,焦點便會設定為定位順序的下一個控制項。

  • 將便捷鍵加入所有功能表項目。

讓 Windows 應用程式具備協助功能

  • 如下所述將控制項加入表單並設定屬性。 如需如何在表單上排列控制項的模型,請參閱表格下方的圖片。

    Object 屬性
    Form1 AccessibleDescription 訂購表單
    AccessibleName 訂購表單
    字型大小 10
    Text 比薩訂購表單
    PictureBox 名稱 標誌
    AccessibleDescription 一片披薩
    AccessibleName 公司標誌
    映像 任何圖示或點陣圖
    標籤 名稱 companyLabel
    Text 好吃披薩
    TabIndex 1
    AccessibleDescription 公司名稱
    AccessibleName 公司名稱
    Backcolor 藍色
    Forecolor 黃色
    字型大小 18
    標籤 名稱 customerLabel
    Text 名稱(&N)
    TabIndex 2
    AccessibleDescription 顧客名稱標籤
    AccessibleName 顧客名稱標籤
    UseMnemonic True
    TextBox 名稱 customerName
    Text (無)
    TabIndex 3
    AccessibleDescription 客戶名稱
    AccessibleName 客戶名稱
    GroupBox 名稱 sizeOptions
    AccessibleDescription 披薩尺寸選擇
    AccessibleName 披薩尺寸選擇
    Text 披薩尺寸
    TabIndex 4
    RadioButton 名稱 smallPizza
    Text 小披薩美金 $6.00 元(&S)
    已選取 True
    TabIndex 0
    AccessibleDescription 小披薩
    AccessibleName 小披薩
    RadioButton 名稱 largePizza
    Text 大批薩美金 $10.00 元(&L)
    TabIndex 1
    AccessibleDescription 大批薩
    AccessibleName 大批薩
    標籤 名稱 toppingsLabel
    Text 配料 (每份美金 $0.75 元)(&T)
    TabIndex 5
    AccessibleDescription 配料標籤
    AccessibleName 配料標籤
    UseMnemonic True
    CheckedListBox 名稱 配料
    TabIndex 6
    AccessibleDescription 可供選擇的配料
    AccessibleName 可供選擇的配料
    項目 辣肉腸、臘腸、蘑菇
    按鈕 名稱 訂單
    Text 順序(&O)
    TabIndex 7
    AccessibleDescription 合計訂單
    AccessibleName 訂單總計
    按鈕 名稱 cancel
    Text 取消(&C)
    TabIndex 8
    AccessibleDescription 取消訂單
    AccessibleName 取消訂單
    MainMenu 名稱 theMainMenu
    MenuItem 名稱 fileCommands
    Text 檔案(&F)
    MenuItem 名稱 exitApp
    Text 結束(&X)

    您的表單看起來會像下圖所示:

    The pizza order form with a name textbox, and size and toppings selection.

支援高對比模式

高對比模式是 Windows 系統的一項設定,使用對比色彩和字型大小以提升可讀性,對於視覺受損的使用者很有幫助。 提供 HighContrast 屬性以判斷是否已設定高對比度模式。

如果 SystemInformation.HighContrast 為 true,應用程式應該:

  • 使用系統色彩配置來顯示所有使用者介面項目。

  • 藉由視覺提示或音效來傳達原本由色彩傳達的任何資訊。 例如,如果使用紅色字型醒目提示特定清單項目,您也可以將粗體套用至字型,讓使用者透過非色彩提示得知該項目已醒目提示。

  • 省略文字後的任何影像或圖樣。

當應用程式啟動並回應 UserPreferenceChanged 系統事件時,應該會檢查 HighContrast 的設定。 只要 HighContrast 的值變更,便會引發 UserPreferenceChanged 事件。

在應用程式中,唯一不使用色彩系統設定的項目是 lblCompanyName。 類別 SystemColors 可用來將標籤的色彩設定變更為用戶選取的系統色彩。

有效啟用高對比模式

  1. 建立一個方法,將標籤的色彩設定為系統色彩。

    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
    
    private void SetColorScheme()
    {
        if (SystemInformation.HighContrast)
        {
            companyLabel.BackColor = SystemColors.Window;
            companyLabel.ForeColor = SystemColors.WindowText;
        }
        else
        {
            companyLabel.BackColor = Color.Blue;
            companyLabel.ForeColor = Color.Yellow;
        }
    }
    
  2. 在表單建構函式 (Visual Basic 中為 Public Sub New(),Visual C# 中為 public Form1()) 中呼叫 SetColorScheme 程序。 若要存取 Visual Basic 中的建構函式,您必須展開標示為 [Windows Forms 設計工具產生的程式碼] 的區域。

    Public Sub New()
        MyBase.New()
        InitializeComponent()
        SetColorScheme()
    End Sub
    
    public Form1()
    {
        InitializeComponent();
        SetColorScheme();
    }
    
  3. 使用適當的簽章建立事件程序,以回應 UserPreferenceChanged 事件。

    Protected Sub UserPreferenceChanged(sender As Object, _
    e As Microsoft.Win32.UserPreferenceChangedEventArgs)
        SetColorScheme()
    End Sub
    
    public void UserPreferenceChanged(object sender,
    Microsoft.Win32.UserPreferenceChangedEventArgs e)
    {
        SetColorScheme();
    }
    
  4. 呼叫 InitializeComponents 之後,在表單建構函式中新增程式碼,將事件程序與系統事件連結。 這個方法會呼叫 SetColorScheme 程序。

    Public Sub New()
        MyBase.New()
        InitializeComponent()
        SetColorScheme()
        AddHandler Microsoft.Win32.SystemEvents.UserPreferenceChanged, _
           AddressOf Me.UserPreferenceChanged
    End Sub
    
    public Form1()
    {
        InitializeComponent();
        SetColorScheme();
        Microsoft.Win32.SystemEvents.UserPreferenceChanged
           += new Microsoft.Win32.UserPreferenceChangedEventHandler(
           this.UserPreferenceChanged);
    }
    
  5. 先將程式碼加入表單的 Dispose 方法,再呼叫基底類別的 Dispose 方法,以便在應用程式關閉時釋放事件。 若要存取 Visual Basic 中的 Dispose 方法,您必須展開標示為 [Windows Form 設計工具產生的程式碼] 的區域。

    注意

    系統事件程式碼會執行獨立於主應用程式的執行緒。 如果您沒有釋放該事件,即使關閉程式之後,連結至該事件的程式碼仍會繼續執行。

    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing AndAlso components IsNot Nothing Then
            components.Dispose()
        End If
        RemoveHandler Microsoft.Win32.SystemEvents.UserPreferenceChanged, _
           AddressOf Me.UserPreferenceChanged
        MyBase.Dispose(disposing)
    End Sub
    
    protected override void Dispose(bool disposing)
    {
        if(disposing && components != null)
        {
            components.Dispose();
        }
        Microsoft.Win32.SystemEvents.UserPreferenceChanged
           -= new Microsoft.Win32.UserPreferenceChangedEventHandler(
           this.UserPreferenceChanged);
        base.Dispose( disposing );
    }
    
  6. 按 F5 執行應用程式。

透過音效以外的其他方式傳達重要資訊

在這個應用程式中,資訊不只以音效傳達。 如果您在應用程式中使用音效,應該也可以使用其他方式來提供資訊。

透過音效以外的其他方式提供資訊

  1. 使用 Windows 應用程式開發介面函式 FlashWindow 讓標題列閃爍。 如需如何呼叫 Windows 應用程式開發介面函式的範例,請參閱逐步解說:呼叫 Windows API

    注意

    使用者可以啟動 Windows 聲音感測服務,當系統音效透過電腦內建喇叭播放時,同時能使視窗閃爍。

  2. 在非強制回應視窗中顯示重要資訊,讓使用者可以有所回應。

  3. 顯示取得鍵盤焦點的訊息方塊, 但是如果使用者可能會輸入資料,則應避免使用這個方法。

  4. 在工作列的狀態通知區域中顯示狀態標記。 如需詳細資訊,請參閱如何:使用 Windows Forms NotifyIcon 元件將應用程式圖示新增至工作列

測試應用程式

在部署應用程式之前,您應該測試已實作的協助工具功能。

測試協助工具功能

  1. 若要測試鍵盤存取,請拔除滑鼠,然後只利用鍵盤逐一測試使用者介面中的每一項功能。 請確定所有工作都可以只使用鍵盤執行。

  2. 若要測試是否支援高對比,請在 [控制台] 中選擇協助工具選項圖示。 按一下 [顯示] 索引標籤,然後選取 [使用高對比] 核取方塊。 巡覽所有使用者介面項目,確保色彩和字型變更均已正確反映。 同時確保已省略文字後的影像或圖樣。

    注意

    Windows NT 4 的 [控制台] 中並沒有協助工具選項圖示。 因此,這個變更 SystemInformation.HighContrast 設定的程序不適用於 Windows NT 4。

  3. 另外還有其他工具可以測試應用程式的協助工具。

  4. 若要測試鍵盤焦點的顯示,請執行放大鏡 (若要開啟 [放大鏡],請按一下 [開始] 功能表,然後依序指向 [程式集]、[附屬應用程式] 和 [協助工具],然後按一下 [放大鏡])。 同時使用鍵盤 Tab 鍵和滑鼠來巡覽使用者介面。 確保 [放大鏡] 正確追蹤所有巡覽。

  5. 若要測試螢幕項目的顯示,請執行 [檢查],然後同時使用滑鼠和 TAB 鍵跳到每個項目。 針對 UI 中的每個物件,確保 [檢查] 視窗的 [名稱]、[狀態]、[角色]、[位置] 和 [值] 欄位所顯示的資訊,對使用者都是有意義的。