Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Besturingselementen die geen Microsoft UI Automation-provider hebben, maar die IAccessible- implementeren, kunnen eenvoudig worden bijgewerkt om bepaalde UI Automation-functionaliteit te bieden door de IAccessibleEx--interface te implementeren. Met deze interface kan het besturingselement eigenschappen en besturingspatronen van UI Automation beschikbaar maken, zonder dat er een volledige implementatie van UI Automation-providerinterfaces nodig is, zoals IRawElementProviderFragment-. Als u IAccessibleEx-wilt implementeren, mag de Microsoft Active Accessibility-objecthiërarchie basislijn geen fouten of inconsistenties bevatten (zoals een onderliggend object waarvan het bovenliggende object deze niet als onderliggend object vermeldt), en mag deze niet conflicteren met ui Automation-specificaties. Als de Microsoft Active Accessibility-objecthiërarchie aan deze vereisten voldoet, is het een goede kandidaat voor het toevoegen van functionaliteit met behulp van IAccessibleEx-; Anders moet u ui Automation alleen of naast de Microsoft Active Accessibility-implementatie implementeren.
Neem het geval van een aangepast besturingselement met een bereikwaarde. De Microsoft Active Accessibility-server voor het besturingselement definieert de rol en kan de huidige waarde retourneren, maar mist de middelen om de minimum- en maximumwaarden van het besturingselement te retourneren, omdat deze eigenschappen niet zijn gedefinieerd in Microsoft Active Accessibility. Een UI Automation-client kan de rol van het besturingselement, de huidige waarde en andere eigenschappen van Microsoft Active Accessibility ophalen, omdat de UI Automation-kern deze kan verkrijgen via IAccessible-. Maar zonder toegang tot een IRangeValueProvider interface op het object, kan UI Automation ook de maximum- en minimumwaarden niet ophalen.
De besturingselementontwikkelaar kan een volledige UI Automation-provider leveren voor het besturingselement, maar dit zou betekenen dat veel van de bestaande functionaliteit van de IAccessible-implementatie wordt gedupliceerd: bijvoorbeeld navigatie en algemene eigenschappen. In plaats daarvan kan de ontwikkelaar blijven vertrouwen op IAccessible- om deze functionaliteit te leveren, terwijl ondersteuning wordt toegevoegd voor besturingsspecifieke eigenschappen via IRangeValueProvider.
Voor het bijwerken van het aangepaste besturingselement zijn de volgende hoofdstappen vereist:
- Implementeer IServiceProvider op het toegankelijke object, zodat de interface IAccessibleEx op dit of een afzonderlijk object kan worden gevonden.
- Implementeer IAccessibleEx- op het toegankelijke object.
- Maak afzonderlijke toegankelijke objecten voor subitems van Microsoft Active Accessibility, die in Microsoft Active Accessibility mogelijk vertegenwoordigd zijn door de interface IAccessible op het bovenliggende object, bijvoorbeeld lijstitems. Implementeer IAccessibleEx- op deze objecten.
- Implementeer IRawElementProviderSimple- op alle toegankelijke objecten.
- Implementeer de juiste besturingspatrooninterfaces op de toegankelijke objecten.
Dit onderwerp bevat de volgende secties.
IAccessibleEx beschikbaar maken
Omdat de implementatie van IAccessibleEx- voor een besturingselement zich mogelijk in een afzonderlijk object bevindt, kunnen clienttoepassingen niet afhankelijk zijn van QueryInterface- om deze interface te verkrijgen. In plaats daarvan wordt verwacht dat clients IServiceProvider::QueryServiceaanroepen. In het volgende voorbeeld van de implementatie van deze methode wordt ervan uitgegaan dat IAccessibleEx- niet is geïmplementeerd op een afzonderlijk object; daarom wordt de methode gewoon aangeroepen naar QueryInterface.
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 implementeren
De methode van IAccessibleEx die het meest interessant is, is GetObjectForChild. Deze methode biedt de Microsoft Active Accessibility-server de mogelijkheid om een toegankelijk object te maken (een object dat minimaal IAccessibleExblootlegt) voor een onderliggend item. In Microsoft Active Accessibility worden sub-items doorgaans niet weergegeven als toegankelijke objecten, maar als onderdelen van een toegankelijk object. Omdat UI Automation echter vereist dat elk element wordt vertegenwoordigd door een afzonderlijk toegankelijk object, moet GetObjectForChild- een afzonderlijk object maken voor elk kindelement op verzoek.
De volgende voorbeelduitvoering retourneert een toegankelijk object voor een item in een aangepaste lijstweergave.
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;
}
Zie Aangepaste besturingselementen toegankelijk maken, deel 5: IAccessibleEx gebruiken om UI Automation-ondersteuning toe te voegen aan een aangepast besturingselementvoor een volledige voorbeeld-implementatie.
Verwante onderwerpen