Etkin Erişilebilirlik Sunucularına UI Otomasyonu İşlevselliği Ekleme
Microsoft UI Automation sağlayıcısı olmayan ancak IAccessible uygulayan denetimler, IAccessibleEx arabirimi uygulanarak bazı UI Otomasyonu işlevleri sağlamak üzere kolayca yükseltilebilir. Bu arabirim denetimin, IRawElementProviderFragmentgibi UI Otomasyonu sağlayıcı arabirimlerinin tam uygulamasına gerek kalmadan UI Otomasyonu özelliklerini ve denetim desenlerini kullanıma sunmasını sağlar. IAccessibleExuygulamak için, temel Microsoft Etkin Erişilebilirlik nesne hiyerarşisi hata veya tutarsızlık içermemelidir (üst nesnesi onu alt nesne olarak listelemeyen bir alt nesne gibi) ve UI Otomasyonu belirtimleriyle çakışmamalıdır. Microsoft Etkin Erişilebilirlik nesne hiyerarşisi bu gereksinimleri karşılıyorsa, IAccessibleExkullanarak işlevsellik eklemek için iyi bir adaydır; aksi takdirde, UI Otomasyonunu tek başına veya Microsoft Etkin Erişilebilirlik uygulamasıyla birlikte uygulamanız gerekir.
Örnek olarak, bir aralık değerine sahip özel bir kontrolü ele alalım. Denetimin Microsoft Etkin Erişilebilirlik sunucusu, rolünü tanımlar ve geçerli değerini döndürebildi, ancak bu özellikler Microsoft Etkin Erişilebilirlik'te tanımlanmadığından denetimin en düşük ve en yüksek değerlerini döndürmek için gereken araçlardan yoksundur. UI Otomasyonu istemcisi denetimin rolünü, geçerli değerini ve diğer Microsoft Etkin Erişilebilirlik özelliklerini alabilir çünkü UI Otomasyonu çekirdeği bunları IAccessiblearacılığıyla alabilir. Ancak nesnedeki bir IRangeValueProvider arabirimine erişim olmadan UI Otomasyonu da en büyük ve en düşük değerleri alamaz.
Denetim geliştiricisi denetim için eksiksiz bir UI Otomasyonu sağlayıcısı sağlayabilir, ancak bu, IAccessible uygulamasının mevcut işlevlerinin büyük bir kısmını yinelemek anlamına gelir: örneğin, gezinti ve ortak özellikler. Bunun yerine geliştirici, IAccessible'e güvenmeye devam ederken, denetime özgü özellikler için destek eklemek amacıyla IRangeValueProviderkullanabilir.
Özel denetimi güncelleştirmek için şu ana adımlar gerekir:
- IAccessibleEx arabiriminin bu nesnede veya ayrı bir nesnede bulunabilmesi için erişilebilir nesneye IServiceProvider uygulayın.
- Erişilebilir nesneye IAccessibleEx uygulayın.
- Microsoft Etkin Erişilebilirlik'te üst nesnedeki IAccessible arabirimi (örneğin, liste öğeleri) tarafından temsil edilmiş olabilecek tüm Microsoft Etkin Erişilebilirlik alt öğeleri için ayrı erişilebilir nesneler oluşturun. Bu nesnelere IAccessibleEx uygulayın.
- Tüm erişilebilir nesnelere IRawElementProviderSimple uygulayın.
- Erişilebilir nesnelere uygun denetim deseni arabirimlerini uygulayın.
Bu konu aşağıdaki bölümleri içerir.
IAccessibleEx'i Açığa Çıkarma
Bir denetim için IAccessibleEx uygulaması ayrı bir nesnede bulunabileceğinden, istemci uygulamaları bu arabirimi elde etmek için QueryInterface güvenemez. Bunun yerine istemcilerin IServiceProvider::QueryServiceçağrısında bulunması beklenir. Bu yöntemin aşağıdaki örnek uygulamasında, IAccessibleEx ayrı bir nesneye uygulanmadığı varsayılır; bu nedenle yöntemi yalnızca QueryInterfaceçağrısında bulunur.
HRESULT CListboxAccessibleObject::QueryService(REFGUID guidService, REFIID riid, LPVOID *ppvObject)
{
if (!ppvObject)
{
return E_INVALIDARG;
}
*ppvObject = NULL;
if (guidService == __uuidof(IAccessibleEx))
{
return QueryInterface(riid, ppvObject);
}
else
{
return E_INVALIDARG;
}
};
IAccessibleEx Uygulaması
En çok ilgi çeken IAccessibleEx yöntemi GetObjectForChild. Microsoft Active Accessibility sunucusuna, bir alt öğe için erişilebilir bir nesne (en azından IAccessibleExiçeren) oluşturma fırsatını bu yöntem verir. Microsoft Etkin Erişilebilirlik'te alt öğeler genellikle erişilebilir nesneler olarak değil, erişilebilir bir nesnenin alt öğeleri olarak temsil edilir. Ancak, UI Otomasyonu her öğenin ayrı bir erişilebilir nesneyle temsil edilmesi gerektiğinden, GetObjectForChild isteğe bağlı her alt öğe için ayrı bir nesne oluşturmalıdır.
Aşağıdaki örnek uygulama, özel liste görünümündeki bir öğe için erişilebilir bir nesne döndürür.
HRESULT CListboxAccessibleObject::GetObjectForChild(long idChild, IAccessibleEx **pRetVal)
{
*pRetVal = NULL;
VARIANT vChild;
vChild.vt = VT_I4;
vChild.lVal = idChild;
// ValidateChildId is an application-defined function that checks whether
// the child ID is valid. This is similar to code that validates the varChild
// parameter in IAccessible methods.
//
// Additionally, if this idChild corresponds to a child that has its own
// IAccessible, we should also return E_INVALIDARG here. (The caller
// should instead be using the IAccessibleEx from that child's own
// IAccessible in that case.)
if (idChild == CHILDID_SELF || FAILED(ValidateChildId(vChild)))
{
return E_INVALIDARG;
}
// Return a suitable provider for this specific child.
// This implementation returns a new instance each time; an implementation
// can cache these if desired.
// _pListboxControl is a member variable pointer to the owning control.
IAccessibleEx* pAccEx = new CListItemAccessibleObject(idChild, _pListboxControl);
if (pAccEx == NULL)
{
return E_OUTOFMEMORY;
}
*pRetVal = pAccEx;
return S_OK;
}
Eksiksiz bir örnek uygulama için bkz. Özel Denetimlerin Erişilebilirliğini Artırma, Bölüm 5: Özel Denetime UI Otomasyon Desteği Eklemek için IAccessibleEx Kullanma.
İlgili konular