시스템 컨트롤을 기반으로 컨트롤 노출

이 섹션에 설명된 기술을 시도하기 전에 일부 형태의 동적 주석(직접, 값 맵 또는 서버)을 사용하는 것이 좋습니다. 자세한 내용은 동적 주석 API를 참조하세요.

대부분의 경우 Microsoft Active Accessibility는 슈퍼클래스 또는 서브클래스 컨트롤에 대한 정보를 노출합니다. 슈퍼클래싱 및 서브클래싱을 사용하면 애플리케이션 개발자가 시스템 컨트롤의 기본 기능을 사용하여 사용자 지정 컨트롤을 만들고 애플리케이션에서 제공하는 향상된 기능을 포함할 수 있습니다. 슈퍼클래스된 컨트롤에는 기반이 되는 시스템 컨트롤과 다른 창 클래스 이름이 있습니다. 서브클래스된 컨트롤의 창 클래스 이름은 동일합니다. 슈퍼클래싱 및 서브클래싱에 대한 자세한 내용은 Windows SDK(소프트웨어 개발 키트) 설명서를 참조하세요.

Microsoft Active Accessibility는 시스템 제공 컨트롤에 대한 정보를 노출하므로 슈퍼클래스 또는 서브클래스된 컨트롤이 기본 컨트롤과 크게 다른 경우가 아니면 수정된 컨트롤을 노출합니다. 수정된 컨트롤에 액세스할 수 있는지 확인하려면 애플리케이션 개발자는 검사액세스 가능 Event Watcher 와 같은 유틸리티를 사용하여 수정된 컨트롤의 동작을 기본 컨트롤과 비교해야 합니다.

이러한 유틸리티를 사용한 후에 수정된 컨트롤에 액세스할 수 없는 것으로 확인되면 컨트롤을 다른 사용자 지정 컨트롤로 처리해야 합니다. 컨트롤은 이벤트를 트리거해야 하며 애플리케이션의 창 프로시저는 클라이언트 애플리케이션이 컨트롤에 대한 정보를 가져오는 데 사용하는 IAccessible 인터페이스를 제공하여 WM_GETOBJECT 메시지에 응답해야 합니다.

CreateStdAccessibleProxy 및 CreateStdAccessibleObject

수정된 컨트롤에 대한 IAccessible 속성의 전부 또는 대부분이 기본 컨트롤과 동일한 경우 CreateStdAccessibleProxy 또는 CreateStdAccessibleObject 를 사용하여 컨트롤의 IAccessible 인터페이스 구현을 간소화합니다.

참고

액세스 가능한 컨트롤을 슈퍼클래싱하거나 서브클래싱할 때 CreateStdAccessibleObject 함수에서 검색한 개체는 IAccessible 인터페이스 이상을 구현할 수 있습니다. 여기에는 IEnumVARIANT와 같은 다른 인터페이스가 포함될 수 있습니다. 컨트롤의 원래 비급여에서 제공하는 접근성 지원을 유지하려면 이러한 추가 인터페이스를 래핑해야 할 수 있습니다.

 

CreateStdAccessibleProxyCreateStdAccessibleObject 함수는 지정된 시스템 컨트롤에 대한 IAccessible 인터페이스 포인터를 검색합니다. 이러한 함수의 차이점은 CreateStdAccessibleObjecthwnd 매개 변수에서 가져온 창 클래스 이름을 사용하는 반면 CreateStdAccessibleProxyszClassName 매개 변수에 지정된 창 클래스 이름을 사용한다는 것입니다. 따라서 이러한 함수를 사용하기로 결정한 경우 CreateStdAccessibleProxy 를 사용하여 슈퍼클래싱된 컨트롤과 서브클래싱된 컨트롤이 있는 함수에 대한 정보를 노출합니다.

시스템 컨트롤에 대한 IAccessible 인터페이스 포인터를 가져온 후 수정된 컨트롤에 대한 IAccessible 인터페이스 구현에서 포인터를 사용합니다. 수정된 컨트롤의 속성 또는 메서드가 기본 컨트롤과 동일한 경우 IAccessible 포인터를 사용하여 기본 컨트롤에서 제공하는 정보를 반환합니다. 수정된 컨트롤의 속성이 기본 컨트롤과 다른 경우 기본 컨트롤의 속성을 재정의합니다.

다음 예제에서 CAccCustomButtonIAccessible에서 파생된 애플리케이션 정의 클래스입니다. m_pAccDefaultButton 멤버 변수는 컨트롤의 초기화 프로시저 중에 CreateStdAccessibleObject에서 검색된 IAccessible 인터페이스에 대한 포인터입니다. 이 예제에서 사용자 지정 컨트롤의 Role 속성은 시스템 컨트롤의 Role 속성과 같으므로 기본 컨트롤의 Role 속성이 반환됩니다. 그러나 Description 속성은 기본 컨트롤의 속성과 다르므로 이 속성이 재정의됩니다.

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;
}

시스템 컨트롤의 IAccessible 속성 및 메서드에 대한 자세한 내용은 부록 A: 지원되는 사용자 인터페이스 요소 참조를 참조하세요.