📄 access.cpp
字号:
///////////////////////////////////////////////////////////////////////////////
// Name: src/msw/ole/access.cpp
// Purpose: implementation of wxIAccessible and wxAccessible
// Author: Julian Smart
// Modified by:
// Created: 2003-02-12
// RCS-ID: $Id: access.cpp,v 1.21 2006/04/26 08:21:08 ABX Exp $
// Copyright: (c) 2003 Julian Smart
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#if defined(__BORLANDC__)
#pragma hdrstop
#endif
#if wxUSE_OLE && wxUSE_ACCESSIBILITY
#include "wx/access.h"
#ifndef WX_PRECOMP
#include "wx/window.h"
#include "wx/log.h"
#endif
#include "wx/msw/wrapwin.h"
// for some compilers, the entire ole2.h must be included, not only oleauto.h
#if wxUSE_NORLANDER_HEADERS || defined(__WATCOMC__)
#include <ole2.h>
#endif
#include <oleauto.h>
#include <oleacc.h>
#include <winable.h>
#include "wx/msw/ole/oleutils.h"
#ifndef CHILDID_SELF
#define CHILDID_SELF 0
#endif
#ifndef OBJID_CLIENT
#define OBJID_CLIENT 0xFFFFFFFC
#endif
// Convert to Windows role
int wxConvertToWindowsRole(wxAccRole wxrole);
// Convert to Windows state
long wxConvertToWindowsState(long wxstate);
// Convert to Windows selection flag
int wxConvertToWindowsSelFlag(wxAccSelectionFlags sel);
// Convert from Windows selection flag
wxAccSelectionFlags wxConvertFromWindowsSelFlag(int sel);
// ----------------------------------------------------------------------------
// wxIEnumVARIANT interface implementation
// ----------------------------------------------------------------------------
class wxIEnumVARIANT : public IEnumVARIANT
{
public:
wxIEnumVARIANT(const wxVariant& variant);
virtual ~wxIEnumVARIANT() { }
DECLARE_IUNKNOWN_METHODS;
// IEnumVARIANT
STDMETHODIMP Next(ULONG celt, VARIANT *rgelt, ULONG *pceltFetched);
STDMETHODIMP Skip(ULONG celt);
STDMETHODIMP Reset();
STDMETHODIMP Clone(IEnumVARIANT **ppenum);
private:
wxVariant m_variant; // List of further variants
int m_nCurrent; // Current enum position
DECLARE_NO_COPY_CLASS(wxIEnumVARIANT)
};
// ----------------------------------------------------------------------------
// wxIEnumVARIANT
// ----------------------------------------------------------------------------
BEGIN_IID_TABLE(wxIEnumVARIANT)
ADD_IID(Unknown)
ADD_IID(EnumVARIANT)
END_IID_TABLE;
IMPLEMENT_IUNKNOWN_METHODS(wxIEnumVARIANT)
// wxVariant contains a list of further variants.
wxIEnumVARIANT::wxIEnumVARIANT(const wxVariant& variant)
{
m_variant = variant;
}
STDMETHODIMP wxIEnumVARIANT::Next(ULONG celt,
VARIANT *rgelt,
ULONG *pceltFetched)
{
wxLogTrace(wxTRACE_OleCalls, wxT("wxIEnumVARIANT::Next"));
if ( celt > 1 ) {
// we only return 1 element at a time - mainly because I'm too lazy to
// implement something which you're never asked for anyhow
return S_FALSE;
}
if (m_variant.GetType() != wxT("list"))
return S_FALSE;
if ( m_nCurrent < (int) m_variant.GetList().GetCount() ) {
if (!wxConvertVariantToOle(m_variant[m_nCurrent++], rgelt[0]))
{
return S_FALSE;
}
// TODO: should we AddRef if this is an object?
* pceltFetched = 1;
return S_OK;
}
else {
// bad index
return S_FALSE;
}
}
STDMETHODIMP wxIEnumVARIANT::Skip(ULONG celt)
{
wxLogTrace(wxTRACE_OleCalls, wxT("wxIEnumVARIANT::Skip"));
if (m_variant.GetType() != wxT("list"))
return S_FALSE;
m_nCurrent += celt;
if ( m_nCurrent < (int) m_variant.GetList().GetCount() )
return S_OK;
// no, can't skip this many elements
m_nCurrent -= celt;
return S_FALSE;
}
STDMETHODIMP wxIEnumVARIANT::Reset()
{
wxLogTrace(wxTRACE_OleCalls, wxT("wxIEnumVARIANT::Reset"));
m_nCurrent = 0;
return S_OK;
}
STDMETHODIMP wxIEnumVARIANT::Clone(IEnumVARIANT **ppenum)
{
wxLogTrace(wxTRACE_OleCalls, wxT("wxIEnumVARIANT::Clone"));
wxIEnumVARIANT *pNew = new wxIEnumVARIANT(m_variant);
pNew->AddRef();
*ppenum = pNew;
return S_OK;
}
// ----------------------------------------------------------------------------
// wxIAccessible implementation of IAccessible interface
// ----------------------------------------------------------------------------
class wxIAccessible : public IAccessible
{
public:
wxIAccessible(wxAccessible *pAccessible);
DECLARE_IUNKNOWN_METHODS;
// IAccessible
// Navigation and Hierarchy
// Retrieves the child element or child object at a given point on the screen.
// All visual objects support this method; sound objects do not support it.
STDMETHODIMP accHitTest(long xLeft, long yLeft, VARIANT* pVarID);
// Retrieves the specified object's current screen location. All visual objects must
// support this method; sound objects do not support it.
STDMETHODIMP accLocation ( long* pxLeft, long* pyTop, long* pcxWidth, long* pcyHeight, VARIANT varID);
// Traverses to another user interface element within a container and retrieves the object.
// All visual objects must support this method.
STDMETHODIMP accNavigate ( long navDir, VARIANT varStart, VARIANT* pVarEnd);
// Retrieves the address of an IDispatch interface for the specified child.
// All objects must support this property.
STDMETHODIMP get_accChild ( VARIANT varChildID, IDispatch** ppDispChild);
// Retrieves the number of children that belong to this object.
// All objects must support this property.
STDMETHODIMP get_accChildCount ( long* pCountChildren);
// Retrieves the IDispatch interface of the object's parent.
// All objects support this property.
STDMETHODIMP get_accParent ( IDispatch** ppDispParent);
// Descriptive Properties and Methods
// Performs the object's default action. Not all objects have a default
// action.
STDMETHODIMP accDoDefaultAction(VARIANT varID);
// Retrieves a string that describes the object's default action.
// Not all objects have a default action.
STDMETHODIMP get_accDefaultAction ( VARIANT varID, BSTR* pszDefaultAction);
// Retrieves a string that describes the visual appearance of the specified object.
// Not all objects have a description.
STDMETHODIMP get_accDescription ( VARIANT varID, BSTR* pszDescription);
// Retrieves an object's Help property string.
// Not all objects support this property.
STDMETHODIMP get_accHelp ( VARIANT varID, BSTR* pszHelp);
// Retrieves the full path of the WinHelp file associated with the specified
// object and the identifier of the appropriate topic within that file.
// Not all objects support this property.
STDMETHODIMP get_accHelpTopic ( BSTR* pszHelpFile, VARIANT varChild, long* pidTopic);
// Retrieves the specified object's shortcut key or access key, also known as
// the mnemonic. All objects that have a shortcut key or access key support
// this property.
STDMETHODIMP get_accKeyboardShortcut ( VARIANT varID, BSTR* pszKeyboardShortcut);
// Retrieves the name of the specified object.
// All objects support this property.
STDMETHODIMP get_accName ( VARIANT varID, BSTR* pszName);
// Retrieves information that describes the role of the specified object.
// All objects support this property.
STDMETHODIMP get_accRole ( VARIANT varID, VARIANT* pVarRole);
// Retrieves the current state of the specified object.
// All objects support this property.
STDMETHODIMP get_accState ( VARIANT varID, VARIANT* pVarState);
// Retrieves the value of the specified object.
// Not all objects have a value.
STDMETHODIMP get_accValue ( VARIANT varID, BSTR* pszValue);
// Selection and Focus
// 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 accSelect ( long flagsSelect, VARIANT varID );
// Retrieves the object that has the keyboard focus. All objects
// that receive the keyboard focus must support this property.
STDMETHODIMP get_accFocus ( VARIANT* pVarID);
// Retrieves the selected children of this object. All objects
// selected must support this property.
STDMETHODIMP get_accSelection ( VARIANT * pVarChildren);
// Obsolete
STDMETHODIMP put_accName(VARIANT WXUNUSED(varChild), BSTR WXUNUSED(szName)) { return E_FAIL; }
STDMETHODIMP put_accValue(VARIANT WXUNUSED(varChild), BSTR WXUNUSED(szName)) { return E_FAIL; }
// IDispatch
// Get type info
STDMETHODIMP GetTypeInfo(unsigned int typeInfo, LCID lcid, ITypeInfo** ppTypeInfo);
// Get type info count
STDMETHODIMP GetTypeInfoCount(unsigned int* typeInfoCount);
// Get ids of names
STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR** names, unsigned int cNames,
LCID lcid, DISPID* dispId);
// Invoke
STDMETHODIMP Invoke(DISPID dispIdMember, REFIID riid, LCID lcid,
WORD wFlags, DISPPARAMS *pDispParams,
VARIANT *pVarResult, EXCEPINFO *pExcepInfo,
unsigned int *puArgErr );
// Helpers
// Gets the standard IAccessible interface for the given child or object.
// Call Release if this is non-NULL.
IAccessible* GetChildStdAccessible(int id);
// Gets the IAccessible interface for the given child or object.
// Call Release if this is non-NULL.
IAccessible* GetChildAccessible(int id);
private:
wxAccessible *m_pAccessible; // pointer to C++ class we belong to
DECLARE_NO_COPY_CLASS(wxIAccessible)
};
// ============================================================================
// Implementation
// ============================================================================
// ----------------------------------------------------------------------------
// wxIAccessible implementation
// ----------------------------------------------------------------------------
BEGIN_IID_TABLE(wxIAccessible)
ADD_IID(Unknown)
ADD_IID(Accessible)
ADD_IID(Dispatch)
END_IID_TABLE;
IMPLEMENT_IUNKNOWN_METHODS(wxIAccessible)
wxIAccessible::wxIAccessible(wxAccessible *pAccessible)
{
wxASSERT( pAccessible != NULL );
m_pAccessible = pAccessible;
}
// Retrieves the child element or child object at a given point on the screen.
// All visual objects support this method; sound objects do not support it.
STDMETHODIMP wxIAccessible::accHitTest(long xLeft, long yLeft, VARIANT* pVarID)
{
wxLogTrace(wxT("access"), wxT("accHitTest"));
wxASSERT (m_pAccessible != NULL);
if (!m_pAccessible)
return E_FAIL;
wxAccessible* childObject = NULL;
int childId = 0;
VariantInit(pVarID);
wxAccStatus status = m_pAccessible->HitTest(wxPoint(xLeft, yLeft), & 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->accHitTest(xLeft, yLeft, pVarID);
}
if (childObject)
{
if (childObject == m_pAccessible)
{
pVarID->vt = VT_I4;
pVarID->lVal = CHILDID_SELF;
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -