Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dowiedz się, jak utworzyć kontener sterowania umożliwiający hostowanie bez okien kontrolek Microsoft ActiveX, które implementują automatyzację interfejsu użytkownika firmy Microsoft. Korzystając z opisanych tutaj kroków, możesz upewnić się, że wszystkie kontrolki bez okien automatyzacji interfejsu użytkownika hostowane w kontenerze sterowania są dostępne dla aplikacji klienckich technologii pomocniczych (AT).
Co musisz wiedzieć
Technologie
Warunki wstępne
- C/C++
- Programowanie Microsoft Win32 i modelu składników obiektowych (COM)
- Kontrolki ActiveX bez okien
- Dostawcy automatyzacji interfejsu użytkownika
Instrukcje
Krok 1. Podaj interfejs IRawElementProviderSimple w imieniu kontrolki bez okien.
Za każdym razem, gdy system potrzebuje wskaźnika IRawElementProviderSimple dla korzenia kontrolki bez okien, system wysyła zapytanie do kontenera kontrolki. Aby pobrać wskaźnik, kontener wywołuje usługę kontrolki bez okna IServiceProvider::QueryService.
Jeśli kontener sterowania ma implementację automatyzacji interfejsu użytkownika, może zwrócić IRawElementProviderSimple wskaźnik do systemu.
Jeśli kontener sterowania ma implementację Microsoft Active Accessibility, wywołaj funkcję UiaIAccessibleFromProvider, aby uzyskać wskaźnik interfejsu IAccessible reprezentujący kontener sterowania, a następnie zwróć wskaźnik interfejsu IAccessible do systemu.
Krok 2. Implementowanie interfejsu IRawElementProviderWindowlessSite.
Kontener sterowania implementuje interfejs IRawElementProviderWindowlessSite, aby umożliwić kontrolce pozbawionej okien, opartej na automatyzacji interfejsu użytkownika, przekazywanie informacji o ułatwieniach dostępu.
Zaimplementuj IRawElementProviderWindowlessSite::GetRuntimeIdPrefix .
Fragment kontrolki bez okna musi utworzyć unikatowy identyfikator środowiska uruchomieniowego dla siebie. Aby utworzyć identyfikator środowiska uruchomieniowego, fragment kontrolki bez okna pobiera wartość prefiksu, wywołując metodę GetRuntimeIdPrefix, a następnie dołącza do prefiksu wartość całkowitą, która jest unikatowa względem wszystkich innych fragmentów w kontrolce bez okna.
Miejsce kontroli dla kontrolki bezokiennej powinno zaimplementować metodę GetRuntimeIdPrefix, tworząc SAFEARRAY, która zawiera stałą UiaAppendRuntimeId, a po niej wartość całkowitą, unikalną dla tego miejsca.
W tym przykładzie pokazano, jak zwrócić prefiks identyfikatora środowiska uruchomieniowego dla kontrolki bez okien.
IFACEMETHODIMP CProviderWindowlessSite::GetRuntimeIdPrefix( SAFEARRAY **ppsaPrefix) { if (ppsaPrefix == NULL) { return E_INVALIDARG; } // m_siteIndex is the index of the windowless control's // site. It is defined by the control container. int rId[] = { UiaAppendRuntimeId, m_siteIndex }; SAFEARRAY *psa = SafeArrayCreateVector(VT_I4, 0, 2); if (psa == NULL) { return E_OUTOFMEMORY; } for (LONG i = 0; i < 2; i++) { SafeArrayPutElement(psa, &i, (void*)&(rId[i])); } *ppsaPrefix = psa; return S_OK; }Zaimplementuj metodę IRawElementProviderWindowlessSite::GetAdjacentFragment.
Kontrolka, która implementuje automatyzację interfejsu użytkownika, musi zwrócić wskaźnik do dostawcy fragmentu nadrzędnego kontrolki.
Aby zwrócić element nadrzędny fragmentu, obiekt implementujący interfejs IRawElementProviderFragment musi być w stanie zaimplementować metodę Navigate. Implementacja Navigate jest trudna dla kontrolki pozbawionej okien, ponieważ kontrolka może nie być w stanie określić jej lokalizacji w drzewie dostępności obiektu nadrzędnego. Metoda IRawElementProviderWindowlessSite::GetAdjacentFragment umożliwia kontrolce typu bezokienkowego zapytanie swojej lokalizacji o sąsiadujący fragment, a następnie zwraca ten fragment do klienta, który wywołał Navigate.
W tym przykładzie pokazano, jak pojemnik sterujący pobiera fragment nadrzędny kontrolki bezokiennej.
IFACEMETHODIMP CProviderWindowlessSite::GetAdjacentFragment( enum NavigateDirection direction, IRawElementProviderFragment **ppFragment) { if (ppFragment == NULL) { return E_INVALIDARG; } *ppFragment = NULL; HRESULT hr = S_OK; switch (direction) { case NavigateDirection_Parent: { IRawElementProviderSimple *pSimple = NULL; // Call an application-defined function to retrieve the // parent provider interface. hr = GetParentProvider(&pSimple); if (SUCCEEDED(hr)) { // Get the parent's IRawElementProviderFragment interface. hr = pSimple->QueryInterface(IID_PPV_ARGS(ppFragment)); pSimple->Release(); } } break; case NavigateDirection_FirstChild: case NavigateDirection_LastChild: hr = E_INVALIDARG; break; // Ignore NavigateDirection_NextSibling and NavigateDirection_PreviousSibling // because there are no adjacent fragments. default: break; } return hr; }
Krok 3. Opcjonalnie: Zaimplementuj interfejs IRawElementProviderHostingAccessibles.
Zaimplementuj interfejs IRawElementProviderHostingAccessibles, jeśli kontener kontrolki ma implementację dostawcy automatyzacji interfejsu użytkownika, która jest korzeniem drzewa ułatwień dostępu zawierającego bezokienne kontrolki ActiveX obsługujące Microsoft Active Accessibility. Interfejs IRawElementProviderHostingAccessibles ma jedną metodę, GetEmbeddedAccessibles, która pobiera wskaźniki interfejsu IAccessible wszystkich okienkowych bez okien kontrolek ActiveX opartych na Microsoft Active Accessibility, hostowanych w twoim kontenerze sterowania.
Tematy pokrewne