📄 access.cpp
字号:
{
wxLogTrace(wxT("access"), wxT("get_accRole"));
wxASSERT (m_pAccessible != NULL);
if (!m_pAccessible)
return E_FAIL;
if (varID.vt != VT_I4)
{
wxLogTrace(wxT("access"), wxT("Invalid arg for get_accRole"));
return E_INVALIDARG;
}
VariantInit(pVarRole);
wxAccRole role = wxROLE_NONE;
wxAccStatus status = m_pAccessible->GetRole(varID.lVal, & role);
if (status == wxACC_FAIL)
return E_FAIL;
if (status == wxACC_NOT_IMPLEMENTED)
{
// Try to use child object directly.
if (varID.lVal > 0)
{
IAccessible* childAccessible = GetChildAccessible(varID.lVal);
if (childAccessible)
{
varID.lVal = 0;
HRESULT hResult = childAccessible->get_accRole(varID, pVarRole);
childAccessible->Release();
return hResult;
}
else if (m_pAccessible->GetIAccessibleStd())
return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accRole(varID, pVarRole);
}
else if (m_pAccessible->GetIAccessibleStd())
return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accRole (varID, pVarRole);
}
else
{
if (role == wxROLE_NONE)
{
pVarRole->vt = VT_EMPTY;
return S_OK;
}
pVarRole->lVal = wxConvertToWindowsRole(role);
pVarRole->vt = VT_I4;
return S_OK;
}
return E_NOTIMPL;
}
// Retrieves the current state of the specified object.
// All objects support this property.
STDMETHODIMP wxIAccessible::get_accState ( VARIANT varID, VARIANT* pVarState)
{
wxLogTrace(wxT("access"), wxT("get_accState"));
wxASSERT (m_pAccessible != NULL);
if (!m_pAccessible)
return E_FAIL;
if (varID.vt != VT_I4 && varID.vt != VT_EMPTY)
{
wxLogTrace(wxT("access"), wxT("Invalid arg for get_accState"));
return E_INVALIDARG;
}
long wxstate = 0;
wxAccStatus status = m_pAccessible->GetState(varID.lVal, & wxstate);
if (status == wxACC_FAIL)
return E_FAIL;
if (status == wxACC_NOT_IMPLEMENTED)
{
// Try to use child object directly.
if (varID.lVal > 0)
{
IAccessible* childAccessible = GetChildAccessible(varID.lVal);
if (childAccessible)
{
varID.lVal = 0;
HRESULT hResult = childAccessible->get_accState(varID, pVarState);
childAccessible->Release();
return hResult;
}
else if (m_pAccessible->GetIAccessibleStd())
return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accState(varID, pVarState);
}
else if (m_pAccessible->GetIAccessibleStd())
return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accState (varID, pVarState);
}
else
{
long state = wxConvertToWindowsState(wxstate);
pVarState->lVal = state;
pVarState->vt = VT_I4;
return S_OK;
}
return E_NOTIMPL;
}
// Retrieves the value of the specified object.
// Not all objects have a value.
STDMETHODIMP wxIAccessible::get_accValue ( VARIANT varID, BSTR* pszValue)
{
wxLogTrace(wxT("access"), wxT("get_accValue"));
wxASSERT (m_pAccessible != NULL);
if (!m_pAccessible)
return E_FAIL;
if (varID.vt != VT_I4)
{
wxLogTrace(wxT("access"), wxT("Invalid arg for get_accValue"));
return E_INVALIDARG;
}
wxString strValue;
wxAccStatus status = m_pAccessible->GetValue(varID.lVal, & strValue);
if (status == wxACC_FAIL)
return E_FAIL;
if (status == wxACC_NOT_IMPLEMENTED)
{
// Try to use child object directly.
if (varID.lVal > 0)
{
IAccessible* childAccessible = GetChildAccessible(varID.lVal);
if (childAccessible)
{
varID.lVal = 0;
HRESULT hResult = childAccessible->get_accValue(varID, pszValue);
childAccessible->Release();
return hResult;
}
else if (m_pAccessible->GetIAccessibleStd())
return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accValue(varID, pszValue);
}
else if (m_pAccessible->GetIAccessibleStd())
return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accValue (varID, pszValue);
}
else
{
wxBasicString basicString(strValue);
* pszValue = basicString.Get();
return S_OK;
}
return E_NOTIMPL;
}
// Modifies the selection or moves the keyboard focus of the
// specified object. All objects that select or receive the
// keyboard focus must support this method.
STDMETHODIMP wxIAccessible::accSelect ( long flagsSelect, VARIANT varID )
{
wxLogTrace(wxT("access"), wxT("get_accSelect"));
wxASSERT (m_pAccessible != NULL);
if (!m_pAccessible)
return E_FAIL;
if (varID.vt != VT_I4 && varID.vt != VT_EMPTY)
{
wxLogTrace(wxT("access"), wxT("Invalid arg for accSelect"));
return E_INVALIDARG;
}
wxAccSelectionFlags wxsel = wxConvertFromWindowsSelFlag(flagsSelect);
wxAccStatus status = m_pAccessible->Select(varID.lVal, wxsel);
if (status == wxACC_FAIL)
return E_FAIL;
if (status == wxACC_NOT_IMPLEMENTED)
{
// Try to use child object directly.
if (varID.lVal > 0 && varID.lVal > 0)
{
IAccessible* childAccessible = GetChildAccessible(varID.lVal);
if (childAccessible)
{
varID.lVal = 0;
HRESULT hResult = childAccessible->accSelect(flagsSelect, varID);
childAccessible->Release();
return hResult;
}
else if (m_pAccessible->GetIAccessibleStd())
return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->accSelect(flagsSelect, varID);
}
else if (m_pAccessible->GetIAccessibleStd())
return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->accSelect(flagsSelect, varID);
}
else
return S_OK;
return E_NOTIMPL;
}
// Retrieves the object that has the keyboard focus. All objects
// that receive the keyboard focus must support this property.
STDMETHODIMP wxIAccessible::get_accFocus ( VARIANT* pVarID)
{
wxLogTrace(wxT("access"), wxT("get_accFocus"));
wxASSERT (m_pAccessible != NULL);
if (!m_pAccessible)
return E_FAIL;
wxAccessible* childObject = NULL;
int childId = 0;
VariantInit(pVarID);
wxAccStatus status = m_pAccessible->GetFocus(& childId, & childObject);
if (status == wxACC_FAIL)
return E_FAIL;
if (status == wxACC_NOT_IMPLEMENTED)
{
// Use standard interface instead.
IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
if (!stdInterface)
return E_NOTIMPL;
else
return stdInterface->get_accFocus (pVarID);
}
if (childObject)
{
if (childObject == m_pAccessible)
{
pVarID->vt = VT_I4;
pVarID->lVal = CHILDID_SELF;
return S_OK; }
else
{
wxIAccessible* childIA = childObject->GetIAccessible();
if (!childIA)
return E_NOTIMPL;
if (childIA->QueryInterface(IID_IDispatch, (LPVOID*) & pVarID->pdispVal) != S_OK)
return E_FAIL;
pVarID->vt = VT_DISPATCH;
return S_OK;
}
}
else if (childId > 0)
{
pVarID->vt = VT_I4;
pVarID->lVal = childId;
return S_OK;
}
else
{
pVarID->vt = VT_EMPTY;
return S_FALSE;
}
#if 0
// all cases above already cause some return action so below line
// is unreachable and cause unnecessary warning
return E_NOTIMPL;
#endif
}
// Retrieves the selected children of this object. All objects
// selected must support this property.
STDMETHODIMP wxIAccessible::get_accSelection ( VARIANT * pVarChildren)
{
wxLogTrace(wxT("access"), wxT("get_accSelection"));
wxASSERT (m_pAccessible != NULL);
if (!m_pAccessible)
return E_FAIL;
VariantInit(pVarChildren);
wxVariant selections;
wxAccStatus status = m_pAccessible->GetSelections(& selections);
if (status == wxACC_FAIL)
return E_FAIL;
if (status == wxACC_NOT_IMPLEMENTED)
{
// Use standard interface instead.
IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
if (!stdInterface)
return E_NOTIMPL;
else
return stdInterface->get_accSelection (pVarChildren);
}
else
{
if (selections.GetType() == wxT("long"))
{
pVarChildren->vt = VT_I4;
pVarChildren->lVal = selections.GetLong();
return S_OK;
}
else if (selections.GetType() == wxT("void*"))
{
wxAccessible* childObject = (wxAccessible*) selections.GetVoidPtr();
wxIAccessible* childIA = childObject->GetIAccessible();
if (!childIA)
return E_NOTIMPL;
if (childIA->QueryInterface(IID_IDispatch, (LPVOID*) & pVarChildren->pdispVal) != S_OK)
return E_FAIL;
pVarChildren->vt = VT_DISPATCH;
return S_OK;
}
else if (selections.GetType() == wxT("list"))
{
// TODO: should we AddRef for every "void*" member??
wxIEnumVARIANT* enumVariant = new wxIEnumVARIANT(selections);
enumVariant->AddRef();
pVarChildren->vt = VT_UNKNOWN;
pVarChildren->punkVal = enumVariant;
return S_OK;
}
}
return E_NOTIMPL;
}
// Get type info
STDMETHODIMP wxIAccessible::GetTypeInfo(unsigned int WXUNUSED(typeInfo), LCID WXUNUSED(lcid), ITypeInfo** ppTypeInfo)
{
*ppTypeInfo = NULL;
return E_NOTIMPL;
}
// Get type info count
STDMETHODIMP wxIAccessible::GetTypeInfoCount(unsigned int* typeInfoCount)
{
*typeInfoCount = 0;
return E_NOTIMPL;
}
// Get ids of names
STDMETHODIMP wxIAccessible::GetIDsOfNames(REFIID WXUNUSED(riid), OLECHAR** WXUNUSED(names), unsigned int WXUNUSED(cNames),
LCID WXUNUSED(lcid), DISPID* WXUNUSED(dispId))
{
return E_NOTIMPL;
}
// Invoke
STDMETHODIMP wxIAccessible::Invoke(DISPID WXUNUSED(dispIdMember), REFIID WXUNUSED(riid), LCID WXUNUSED(lcid),
WORD WXUNUSED(wFlags), DISPPARAMS *WXUNUSED(pDispParams),
VARIANT *WXUNUSED(pVarResult), EXCEPINFO *WXUNUSED(pExcepInfo),
unsigned int *WXUNUSED(puArgErr) )
{
return E_NOTIMPL;
}
// Gets the standard IAccessible interface for the given child or object.
// Call Release if this is non-NULL.
IAccessible* wxIAccessible::GetChildStdAccessible(int id)
{
if (id == 0)
{
IAccessible* obj = (IAccessible*)m_pAccessible->GetIAccessibleStd();
obj->AddRef();
return obj;
}
else
{
VARIANT var;
VariantInit(& var);
var.vt = VT_I4;
var.lVal = id;
IDispatch* pDispatch = NULL;
if (S_OK == get_accChild ( var, & pDispatch))
{
IAccessible* childAccessible = NULL;
if (pDispatch->QueryInterface(IID_IAccessible, (LPVOID*) & childAccessible) == S_OK)
{
pDispatch->Release();
wxIAccessible* c = (wxIAccessible*) childAccessible;
IAccessible* stdChildAccessible = (IAccessible*) c->m_pAccessible->GetIAccessibleStd();
stdChildAccessible->AddRef();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -