Esposizione di controlli basati su controlli di sistema
È consigliabile usare una forma di annotazione dinamica, ovvero Direct, Value Map o Server, prima di provare la tecnica descritta in questa sezione. Per altre informazioni, vedere API di annotazione dinamica.
Nella maggior parte dei casi, Microsoft Active Accessibility espone informazioni sui controlli sovraclassati o sottoclassati. La superclasse e la sottoclasse consentono a uno sviluppatore di applicazioni di creare un controllo personalizzato con la funzionalità di base di un controllo di sistema e includere miglioramenti forniti dall'applicazione. Un controllo superclassato ha un nome di classe finestra diverso rispetto al controllo di sistema su cui è basato. Un controllo sottoclassato ha lo stesso nome della classe della finestra. Per altre informazioni sulla superclasse e la sottoclasse, vedere la documentazione di Windows Software Development Kit (SDK).
Poiché Microsoft Active Accessibility espone informazioni sui controlli forniti dal sistema, Microsoft Active Accessibility espone il controllo modificato a meno che un controllo superclassato o sottoclassato non sia significativamente diverso dal controllo di base. Per determinare se il controllo modificato è accessibile, gli sviluppatori di applicazioni devono usare utilità come Inspect e Accessible Event Watcher per confrontare il comportamento del controllo modificato con il controllo di base.
Se dopo aver utilizzato queste utilità, si determina che il controllo modificato non è accessibile, è necessario considerare il controllo come qualsiasi altro controllo personalizzato. Il controllo deve attivare gli eventi e la routine della finestra dell'applicazione deve rispondere al messaggio WM_GETOBJECTfornendo un'interfaccia IAccessible usata dalle applicazioni client per ottenere informazioni sul controllo.
CreateStdAccessibleProxy e CreateStdAccessibleObject
Se tutte o la maggior parte delle proprietà IAccessible per il controllo modificato sono uguali al controllo di base, usare CreateStdAccessibleProxy o CreateStdAccessibleObject per semplificare l'implementazione dell'interfaccia IAccessible del controllo.
Nota
Quando si sovraclassa o si sottoclassa un controllo accessibile, tenere presente che l'oggetto recuperato dalla funzione CreateStdAccessibleObject può implementare più dell'interfaccia IAccessible . Può includere altre interfacce, ad esempio IEnumVARIANT. Potrebbe essere necessario eseguire il wrapping di queste interfacce aggiuntive per mantenere il supporto per l'accessibilità fornito dall'implemenation originale del controllo.
Le funzioni CreateStdAccessibleProxy e CreateStdAccessibleObject recuperano un puntatore di interfaccia IAccessible per il controllo di sistema specificato. La differenza in queste funzioni è che CreateStdAccessibleObject usa il nome della classe finestra ottenuto dal parametro hwnd , mentre CreateStdAccessibleProxy usa il nome della classe finestra specificato nel parametro szClassName . Pertanto, se si decide di usare queste funzioni, usare CreateStdAccessibleProxy per esporre informazioni sui controlli superclassati e su entrambe le funzioni con controlli sottoclassati.
Dopo aver ottenuto un puntatore di interfaccia IAccessible al controllo di sistema, usare il puntatore nell'implementazione dell'interfaccia IAccessible per il controllo modificato. Se una proprietà o un metodo per il controllo modificato è uguale al controllo di base, utilizzare il puntatore IAccessible per restituire le informazioni fornite dal controllo di base. Se una proprietà per il controllo modificato è diversa dal controllo di base, eseguire l'override della proprietà del controllo di base.
Nell'esempio seguente CAccCustomButton è la classe definita dall'applicazione derivata da IAccessible. La variabile membro m_pAccDefaultButton è un puntatore a un'interfaccia IAccessible recuperata da CreateStdAccessibleObject durante la procedura di inizializzazione per il controllo. In questo esempio, la proprietà Role per il controllo personalizzato corrisponde alla proprietà Role del controllo di sistema, pertanto viene restituita la proprietà Role del controllo di base. Tuttavia, la proprietà Description è diversa da quella del controllo di base, pertanto questa proprietà viene sottoposta a override.
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;
}
Per altre informazioni sulle proprietà e i metodi IAccessible dei controlli di sistema, vedere Appendice A: Informazioni di riferimento sugli elementi dell'interfaccia utente supportati.