Ospitare un controllo ActiveX senza finestre Automazione interfaccia utente
Informazioni su come creare un contenitore di controlli in grado di ospitare controlli Microsoft ActiveX senza finestre che implementano Microsoft Automazione interfaccia utente. Usando i passaggi descritti qui, è possibile assicurarsi che tutti Automazione interfaccia utente i controlli senza finestra ospitati nel contenitore di controllo siano accessibili alle applicazioni client di assistive technology (AT).
Informazioni importanti
Tecnologie
Prerequisiti
- C/C++
- Programmazione microsoft Win32 e Component Object Model (COM)
- Controlli ActiveX senza finestra
- provider di Automazione interfaccia utente
Istruzioni
Passaggio 1: specificare l'interfaccia IRawElementProviderSimple per conto del controllo senza finestra.
Ogni volta che il sistema necessita del puntatore IRawElementProviderSimple per la radice di un controllo senza finestre, il sistema esegue una query sul contenitore di controllo. Per recuperare il puntatore, il contenitore chiama l'implementazione del controllo senza finestra del metodo IServiceProvider::QueryService .
Se il contenitore di controllo ha un'implementazione Automazione interfaccia utente, può restituire il puntatore IRawElementProviderSimple del controllo senza finestra al sistema.
Se il contenitore di controllo ha un'implementazione di Microsoft Active Accessibility, chiamare la funzione UiaIAccessFromProvider per ottenere un puntatore dell'interfaccia IAccessibile che rappresenta il controllo e quindi restituire il puntatore dell'interfaccia IAccessibile al sistema.
Passaggio 2: Implementare l'interfaccia IRawElementProviderWindowlessSite.
Un contenitore di controllo implementa l'interfaccia IRawElementProviderWindowlessSite per abilitare un controllo senza finestre basato su Automazione interfaccia utente per comunicare le informazioni di accessibilità.
Implementare IRawElementProviderWindowlessSite::GetRuntimeIdPrefix.
Un frammento di controllo senza finestre deve creare un ID di runtime univoco per se stesso. Per creare il relativo ID di runtime, un frammento di controllo senza finestre recupera un valore di prefisso chiamando il metodo GetRuntimeIdPrefix del sito di controllo e quindi aggiunge al prefisso un valore integer univoco rispetto a tutti gli altri frammenti nel controllo senza finestra.
Il sito di controllo per un controllo senza finestra deve implementare il metodo GetRuntimeIdPrefix formando un oggetto SAFEARRAY contenente la costante UiaAppendRuntimeId, seguito da un valore integer univoco per il sito.
In questo esempio viene illustrato come restituire un prefisso ID runtime per un controllo senza finestra.
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; }
Implementare il metodo IRawElementProviderWindowlessSite::GetAdjacentFragment .
Un controllo che implementa Automazione interfaccia utente deve restituire un puntatore al provider di frammenti padre del controllo.
Per restituire l'elemento padre del frammento, un oggetto che implementa l'interfaccia IRawElementProviderFragment deve essere in grado di implementare il metodo Navigate . L'implementazione di Navigate è difficile per un controllo senza finestra perché il controllo potrebbe non essere in grado di determinare la posizione nell'albero accessibile dell'oggetto padre. Il metodo IRawElementProviderWindowlessSite::GetAdjacentFragment consente al controllo senza finestra di eseguire query sul sito per il frammento adiacente e quindi restituire tale frammento al client denominato Navigate.
In questo esempio viene illustrato come un contenitore di controllo recupera il frammento padre di un controllo senza finestra.
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; }
Passaggio 3: Facoltativo: Implementare l'interfaccia IRawElementProviderHostingAccesss.
Implementare l'interfaccia IRawElementProviderHostingAccesss se il contenitore di controllo ha un'implementazione del provider di Automazione interfaccia utente che è la radice di un albero di accessibilità che include controlli ActiveX senza finestre che supportano l'accessibilità attiva Microsoft. L'interfaccia IRawElementProviderHostingAccesss include un singolo metodo, GetEmbeddedAccesss, che recupera i puntatori dell'interfaccia IAccessi di tutti i controlli Active Accessibility basati su WindowsX basati su microsoft ospitati dal contenitore di controllo.
Argomenti correlati