公开基于系统控件的控件
在尝试本部分所述的技术之前,应考虑使用某种形式的动态注释(直接、值映射或服务器)。 有关详细信息,请参阅 动态注释 API。
在大多数情况下,Microsoft Active Accessibility 公开有关超类或子类化控件的信息。 超类和子类化允许应用程序开发人员使用系统控件的基本功能创建自定义控件,并包括应用程序提供的增强功能。 超类控件的窗口类名称与它所基于的系统控件不同。 子类化控件具有相同的窗口类名称。 有关超类和子类化的详细信息,请参阅 Windows 软件开发工具包 (SDK) 文档。
由于 Microsoft Active Accessibility 公开有关系统提供的控件的信息,因此 Microsoft Active Accessibility 公开修改后的控件,除非超类或子类控件与基本控件明显不同。 若要确定修改后的控件是否可访问,应用程序开发人员应使用 检查 和 辅助事件观察程序 等实用工具将修改后的控件的行为与基本控件进行比较。
如果在使用这些实用工具后确定修改后的控件不可访问,则必须将控件视为任何其他自定义控件。 控件必须触发事件,并且应用程序的窗口过程必须通过提供客户端应用程序用于获取控件相关信息的 IAccessible 接口来响应WM_GETOBJECT消息。
CreateStdAccessibleProxy 和 CreateStdAccessibleObject
如果修改后的控件的所有或大部分 IAccessible 属性都与基本控件相同,请使用 CreateStdAccessibleProxy 或 CreateStdAccessibleObject 来简化控件 IAccessible 接口的实现。
注意
对可访问控件进行超类或子类化时,请注意 CreateStdAccessibleObject 函数检索的对象可能实现的不仅仅是 IAccessible 接口。 它可能包含其他接口,例如 IEnumVARIANT。 可能需要包装这些附加接口,以保留控件的原始强制提供的辅助功能支持。
CreateStdAccessibleProxy 和 CreateStdAccessibleObject 函数检索指定系统控件的 IAccessible 接口指针。 这些函数的区别在于 CreateStdAccessibleObject 使用从其 hwnd 参数获取的窗口类名,而 CreateStdAccessibleProxy 使用在其 szClassName 参数中指定的窗口类名。 因此,如果决定使用这些函数,请使用 CreateStdAccessibleProxy 公开有关超类控件的信息,并使用子类化控件的任一函数。
获取指向系统控件的 IAccessible 接口指针后,在修改后的控件的 IAccessible 接口的实现中使用该指针。 如果修改后的控件的属性或方法与基控件相同,请使用 IAccessible 指针返回基控件提供的信息。 如果修改后的控件的属性与基控件不同,请重写基控件的 属性。
在以下示例中, CAccCustomButton 是派生自 IAccessible 的应用程序定义的类。 成员变量 m_pAccDefaultButton 是指向在控件初始化过程中从 CreateStdAccessibleObject 检索的 IAccessible 接口的指针。 在此示例中,自定义控件的 Role 属性与系统控件的 Role 属性相同,因此返回基本控件的 Role 属性。 但是, Description 属性与基控件的属性不同,因此此属性将被重写。
HRESULT CAccCustomButton::Initialize( HWND hWnd, HINSTANCE hInst )
{
.
.
.
hr = CreateStdAccessibleObject( m_hWnd,
OBJID_CLIENT,
IID_IAccessible,
(void **) &m__pAccDefaultButton );
.
.
.
}
STDMETHODIMP CAccCustomButton::get_accRole( VARIANT varID )
{
return m_pAccDefaultButton->get_accRole(varID);
}
STDMETHODIMP CAccCustomButton::get_accDescription( VARIANT varChild,
BSTR* pszDesc )
{
TCHAR szString[256];
OLECHAR wszString[256];
LoadString( m_hInst, ID_DESCRIPTION, szString, 256 );
MultiByteToWideChar( CP_ACP, 0, szString, -1, wszString, 256 );
*pszDesc = SysAllocString( wszString );
if ( !pszDesc )
return S_OK;
else
return E_OUTOFMEMORY;
}
有关系统控件的 IAccessible 属性和方法的详细信息,请参阅 附录 A:支持的用户界面元素参考。