⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 access.cpp

📁 Wxpython Implemented on Windows CE, Source code
💻 CPP
📖 第 1 页 / 共 5 页
字号:
{
    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 + -