DirectShow DirectShow 튜토리얼 필터의 프로퍼티 페이지의 표시   [목차열람] [주소복사] [슬롯비우기]
필터의 프로퍼티 페이지의 표시
 
Microsoft DirectX 9.0

필터의 프로퍼티 페이지의 표시

프로퍼티 페이지는, 사용자가 설정 가능한 프로퍼티를 지원하기 위한 1 개의 방법이다. 여기에서는, 애플리케이션으로 필터의 프로퍼티 페이지를 표시하는 방법을 해설한다. 프로퍼티 페이지의 더 자세한 정보는, Platform SDK 의 문서를 참조할것.

 :  DirectShow 가 제공하는 필터의 상당수는 프로퍼티 페이지를 지원 하고 있지만, 그 지원은 디버그를 목적으로 한 것으로, 애플리케이션에서의 사용은 추천하지 않는다. 대부분의 경우는, 동등의 기능이 필터의 커스텀 인터페이스로 제공되고 있다. 애플리케이션은, 프로퍼티 페이지를 사용자에 공개하는 것이 아니라, 이러한 필터를 프로그램적으로 제어할 필요가 있다.

프로퍼티 페이지를 가지는 필터는,ISpecifyPropertyPages 인터페이스를 공개한다. 필터가 프로퍼티 페이지를 정의하고 있을지 어떨지를 판단하려면 ,QueryInterface 를 사용해 필터에 이 인터페이스의 유무를 문의한다.

필터의 인스턴스를 (CoCreateInstance 를 호출해) 직접 생성했을 경우는, 필터의 포인터를 이미 가지고 있다. 직접 생성하고 있지 않는 경우는,IFilterGraph::EnumFilters 메서드를 사용해, 그래프내의 필터를 열거할 수 있다. 더 자세한 정보는, 「필터 그래프내의 개체의 열거」를 참조할것.

ISpecifyPropertyPages 인터페이스 포인터를 취득하면ISpecifyPropertyPages::GetPages 메서드를 호출해, 필터의 프로퍼티 페이지를 얻어온다. 이 메서드는, 글로벌 일의 식별자 (GUID)의 카운트 배열에 각 프로퍼티 페이지의 클래스 식별자 (CLSID)를 기입한다. 카운트 배열은 CAUUID 구조체로 정의된다. 이 구조체는 할당하지 않으면 안 되지만, 초기화할 필요는 없다. GetPages 메서드가 이 배열을 할당한다. 이 배열은,CAUUID 구조체의 pElems 멤버에 저장 되고 있다. 처리가 끝나면 반드시 CoTaskMemFree 함수를 호출해 GUID 배열을 릴리즈 하는 것.

OleCreatePropertyFrame 함수는, 모덜 다이알로그 박스내에 프로퍼티 페이지를 표시하는 간단한 방법을 제공한다.

IBaseFilter *pFilter;
/* 필터의 IBaseFilter 인터페이스를 얻어온다 (생략).  */
ISpecifyPropertyPages *pProp;
HRESULT hr = pFilter->QueryInterface(IID_ISpecifyPropertyPages, (void **) &pProp);
if (SUCCEEDED(hr)) 
{
    // 필터의 이름과 IUnknown 포인터를 얻어온다.
    FILTER_INFO FilterInfo;
    hr = pFilter->QueryFilterInfo(&FilterInfo); 
    IUnknown *pFilterUnk;
    pFilter->QueryInterface(IID_IUnknown, (void **) &pFilterUnk);

    // 페이지를 표시한다.
    CAUUID caGUID;
    pProp->GetPages(&caGUID);
    pProp->Release();
    OleCreatePropertyFrame(
        hWnd,                   // 부모 윈도우.
        0, 0,                   // 예약이 끝난 상태.
        FilterInfo.achName,     // 다이알로그 박스의 캡션.
        1,                      // 개체수 (필터만).
        &pFilterUnk,            // 개체 포인터의 배열.
        caGUID.cElems,          // 프로퍼티 페이지수.
        caGUID.pElems,          // 프로퍼티 페이지 CLSID 의 배열.
        0,                      // 로케일 식별자.
        0, NULL                 // 예약이 끝난 상태.
    );

    // 클린 업.
    pFilterUnk->Release();
    FilterInfo.pGraph->Release(); 
    CoTaskMemFree(caGUID.pElems);
}
↑TOP