逐步解說:建立 Windows 架構的可及性應用程式
更新:2007 年 11 月
建立可及性強的應用程式具有相當重要的商業意義,而且目前許多政府對於市售軟體都已明訂可及性的相關法規。如果軟體產品具有「Windows 憑證」標誌,就表示該軟體符合可及性的要求。根據估計,光是美國境內就有約三千萬居民需要使用軟體的可及性,其中絕大部分屬於潛在客戶。
本逐步解說的重點便是 Windows 憑證標誌的五項可及性需求,而根據這些需求設計的可及性應用程式,都將能夠:
支援控制台大小、色彩、字型和輸入設定。當使用者變更控制台設定時,功能表列、標題列、框線和狀態列的大小也會跟著調整。控制項或程式碼在本應用程式中不需做其他的變更。
支援高對比模式。
所有功能都可經由鍵盤存取,並提供書面說明。
以視覺呈現和程式設計方式顯示鍵盤焦點的位置。
避免只以音效傳達重要資訊。
如需詳細資訊,請參閱設計可及性應用程式的資源、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] 命令的 Menu 控制項。
使用者可以輸入客戶名稱、比薩大小和想要的餡料。使用者按一下 [Order] 按鈕時,訊息方塊中會顯示訂單摘要和費用,然後控制項會清除資料並準備接受下一筆訂單。當使用者按下 [Cancel] 按鈕時,控制項也會清除資料並準備接受下一筆訂單。當使用者按下 [Exit] 功能表項目時,程式便會關閉。
本逐步解說的重點並不是零售訂單系統程式碼,而是在於使用者介面的可及性。本逐步解說描述多個常用控制項的可及性功能,包含按鈕、選項按鈕、文字方塊和標籤。
若要開始製作應用程式
- 在 Visual Basic、Visual C# 或 Visual J# 中,建立新的 Windows 應用程式。將專案命名為 PizzaOrder (如需詳細資訊,請參閱建立新的方案和專案)。
將控制項加入至表單
將控制項加入至表單時,請注意下列產生可及性應用程式的重點:
設定 AccessibleDescription 和 AccessibleName 屬性。在本範例中,AccessibleRole 的預設值已經足夠了。如需可及性屬性的詳細資訊,請參閱為 Windows Form 上的控制項提供可及性資訊。
將字型大小設定為 10 或更大的點數。
注意事項:
如果您一開始將表單的字型大小設定為 10,則之後加入至表單的所有控制項的字型大小都將會是 10。
確定任何描述 TextBox 控制項的標籤控制項定位順序,剛好就在 TextBox 控制項之前。
使用 "&" 字元,在使用者要巡覽的控制項 Text 屬性中,加入便捷鍵 (Access Key)。
使用 "&" 字元,在標籤 (位於使用者要巡覽的控制項之前) 的 Text 屬性中,加入便捷鍵。將標籤的 UseMnemonic 屬性設為 true,如此一來,當使用者按下便捷鍵時,焦點就會設為定位順序的下一個控制項。
將便捷鍵加入至所有功能表項目。
若要讓 Windows 應用程式具備可及性
如下所述在表單中加入控制項並設定屬性 (Property)。請參閱表格下方的圖片,取得如何管理表單中控制項的模型。
物件
屬性
值
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
Any icon or bitmap
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 時,應用程式將會:
使用系統色彩配置,顯示所有使用者介面項目。
透過視覺提示或音效來傳達原本以色彩傳達的所有資訊。例如,若使用紅色字型反白顯示特定清單項目,您也可以在字型中加入粗體,讓使用者透過非色彩提示,得知項目已反白顯示。
略過文字後的任何影像或圖樣。
當應用程式啟動並回應 UserPreferenceChanged 系統事件時,應該會檢查 HighContrast 的設定。每當 HighContrast 的值發生變化,就會觸發 UserPreferenceChanged 事件。
在應用程式中,唯一不使用色彩系統設定的項目是 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 Form。
顯示取得鍵盤焦點的訊息方塊,但是如果使用者可能會輸入資料,則應避免使用這個方法。
在工作列的狀態區域內顯示狀態指示器。如需詳細資訊,請參閱使用 Windows Form NotifyIcon 元件將應用程式圖示加入至工作列。
測試應用程式
在部署應用程式之前,請務必測試已實作的所有可及性功能。
若要測試可及性功能
若要測試鍵盤存取,請先拔除滑鼠,然後只利用鍵盤逐一測試使用者介面中的每一個功能,必須確保所有的工作都可以只透過鍵盤按鈕執行。
若要測試是否支援高對比,請在 [控制台] 中選擇 [協助工具選項] 圖示。按一下 [畫面] 索引標籤,再選取 [使用高對比] 核取方塊。巡覽所有的使用者介面項目,確定色彩和字型已適切反映變更結果,同時確認文字後方的影像或圖樣都已被略過。
注意事項:
Windows NT 4 的 [控制台] 中並沒有 [協助工具選項] 圖示,因此,這個變更 SystemInformation.HighContrast 設定值的程序不適用於 Windows NT 4。
另外還有其他工具可以測試應用程式的可及性。
若要測試是否可以明顯顯示鍵盤焦點,請執行放大鏡 (若要開啟放大鏡,請按一下 [開始] 功能表,依序指向 [所有程式]、[附屬應用程式]、[協助工具],然後按一下 [放大鏡])。同時使用鍵盤 TAB 鍵和滑鼠來巡覽使用者介面,務必確定 [放大鏡] 會正確追蹤所有的巡覽。
若要測試是否可以明顯顯示螢幕項目,請執行 [Inspect],並且同時使用滑鼠和 TAB 鍵跳到每個項目。對於 UI 中的每個物件,請確定 [Inspect] 視窗的 [名稱]、[狀態]、[角色]、[位置] 和 [值] 欄位所顯示的資訊對使用者都是有意義的。Inspect 會隨同 Microsoft® Active Accessibility® SDK (可以在 https://msdn.microsoft.com/library/default.asp?url=/downloads/list/accessibility.asp 取得) 一併安裝。