動態注釋的替代專案

還有其他方法可為 UI 元素提供自訂 的 IAccessible 支援,在某些情況下,它們是正確的解決方案。 在動態注釋之前,這些替代技術是開發人員唯一可用的選項。 其中包括實作所有 IAccessible 介面和程式設計技術。

實作所有 IAccessible 介面

其中一種替代技術是實作所有 IAccessible 介面。 自訂控制項或完全不同的 UI 元素通常需要這個方法;不過,除非確實必要,否則開發和測試成本夠大,因此應該避免。 如果目標是修改單一屬性,成本很難證明。

程式設計技術

另一個選項是使用子類別化和包裝技術來修改特定屬性所公開的資訊。 這是動態注釋要取代的技術。 若要使用子類別化和包裝覆寫單一屬性,開發人員必須執行下列步驟:

  1. 子類別 IAccessible 物件的 HWND。
  2. 攔截正確 IParam/OBJID 值的 WM_GETOBJECT 訊息。
  3. 使用CallWndProc 回呼函式,將WM_GETOBJECT訊息轉送至基類。 如果傳回零,請呼叫 CreateStdAccessibleObject;否則,請在傳回的值上呼叫 LresultFromObject ,以取得控制項的原生 IAccessible 介面指標。
  4. 建立包裝函式類別,這個類別會實作 IAccessible ,並包裝上一個步驟傳回的 IAccessible 介面指標。 這個包裝函式類別會將所有方法和屬性傳送至原始 的 IAccessible 介面指標,但要覆寫的介面指標除外。 這牽涉到針對所有 IAccessible 介面的 21 個屬性和方法撰寫轉送程式碼,而不論實際覆寫多少。

此外,開發人員必須確認下列條件:

  • 覆寫的方法或屬性只能處理必要的子識別碼,並將所有其他識別碼轉送至原始 的 IAccessible 介面指標。
  • 只有在原始物件支援它們時,包裝也必須轉送 IEnumVARIANTIOleWindow 介面。
  • 必須正確處理參考計數,特別是在支援其他介面時。
  • IDispatch 傳回值必須正確處理,特別是使用 ITypeInfo::Invoke 方法,必須使用包裝函式介面的介面指標呼叫,而不是原始 IAccessible 介面的指標。

即使只需要覆寫一或兩個屬性,這些技術也需要相當多的工作。 大部分產生的程式碼都與子類別化和包裝有關,而只有一小部分實際上會提供覆寫的資訊。

不過,在某些情況下需要這些技術。 例如,如果您要進行結構化變更來建立預留位置 UI 元素,則您應該使用這些技術,而不是動態注釋。

修正衍生自標籤的名稱

某些 Microsoft Win32 通用控制項,例如編輯方塊控制項,幾乎一律會與資源檔) 中的 LTEXT 專案 (標籤搭配使用,或在資源檔) 的 GROUPBOX (GROUPBOX。 Microsoft Active Accessibility 會自動從控制項的標籤衍生控制項的名稱屬性。 對於這類控制項,Microsoft Visual Studio 中顯示的視窗文字 (為 Name 或 ID 屬性,) 會被忽略,因為它通常會自動產生且很少描述性;例如,「IDC_EDIT1」。

如果應用程式的使用者介面設計不正確,Microsoft Active Accessibility 可能無法正確設定名稱。 若要與控制項相關聯,標籤或群組方塊必須緊接在索引標籤順序中的動態控制項之前。

當資源編輯器開啟) 或直接編輯資源檔時,可以使用 Visual Studio 中的工具,在 [ 格式 ] 功能表上 (來變更定位順序。

下列範例顯示資源檔的描述對話方塊,其中包含兩個標示的編輯方塊。

IDD_INPUTNAME DIALOGEX 22, 17, 312, 118
STYLE DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Enter your name"
FONT 8, "System", 0, 0, 0x0
BEGIN
    DEFPUSHBUTTON   "OK",IDOK,179,35,30,11,WS_GROUP
    LTEXT           "First Name:",IDC_STATIC,8,16,43,8
    LTEXT           "Last Name:",IDC_STATIC,8,33,43,8
    EDITTEXT        IDC_EDITFIRSTNAME,53,15,120,12,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDITLASTNAME,53,34,120,12,ES_AUTOHSCROLL
END

在此範例中,標籤和控制項未列在正確的定位順序中。 因此,Microsoft Active Accessibility 會將名稱 「Last Name」 指派給名字編輯方塊,而且完全沒有名稱給姓氏編輯方塊。

下列範例顯示正確的資源清單。 另請注意,已在標籤中指定快速鍵。

IDD_INPUTNAME DIALOGEX 22, 17, 312, 118
STYLE DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Enter your name"
FONT 8, "System", 0, 0, 0x0
BEGIN
    LTEXT           "&First Name:",IDC_STATIC,8,16,43,8
    EDITTEXT        IDC_EDITFIRSTNAME,53,15,120,12,ES_AUTOHSCROLL
    LTEXT           "&Last Name:",IDC_STATIC,8,33,43,8
    EDITTEXT        IDC_EDITLASTNAME,53,34,120,12,ES_AUTOHSCROLL
    DEFPUSHBUTTON   "OK",IDOK,179,35,30,11,WS_GROUP
END

當控制項具有增補標籤,例如追蹤列上的最小值和最大值時,這些標籤應該放在控制項的定位順序之後。 控制項的主要標籤必須緊接在控制項本身之前。

沒有標籤的命名控制項

不一定可以或想要讓每個控制項都有可見的標籤。 不過,您仍然可以藉由新增不可見標籤來提供控制項的名稱。 一如往常,隱藏的標籤必須緊接在定位順序中的控制項前面。

如果您在 Microsoft Visual Studio .NET 中使用資源編輯器,您可以將 Visible 屬性設定為 False。 若要在編輯資源檔 (.rc) 時顯示標籤,請將 NOT WS_VISIBLE 或新增至標籤控制項的樣式部分,如下列範例所示。

    LTEXT           "&FullName:",IDC_STATIC,111,23,44,8,NOT WS_VISIBLE

請注意,即使標籤不可見,任何指定的快速鍵仍可運作。