カクタスソフトウェア
カクタスソフトウェア
サウンド MIDI マルチメディア アプリケーション

プロパティページ

プロパティページへの対応

プロパティページはGraphEditを用いてフィルターのデバッグを行う時に有用です。

アプリケーション経由の操作ではインターフェースを用いてプロパティを参照・変更するので、プロパティページは必要ありません。そのためアプリケーションからデバッグを行うのであれば、プロパティページを実装しなくても構いません。

フィルターがプロパティページを持つ場合、フィルターの継承元にISpecifyPropertyPagesインターフェースを追加します。

class CMyFilter
    : public CTransInPlaceFilter,
      public IMyFilter,
      public ISpecifyPropertyPages,
      public CPersistStream

ISpecifyPropertyPagesインターフェース用にGetPages()関数をオーバーライドします。この関数でプロパティページのCLSIDを取得します。

STDMETHODIMP CMyFilter::GetPages(CAUUID *pPages)
{
    CheckPointer(pPages, E_POINTER);

    pPages->cElems = 1;
    pPages->pElems = (GUID*)CoTaskMemAlloc(sizeof(GUID));

    if (pPages->pElems == NULL)
    {
        return E_OUTOFMEMORY;
    }
    *(pPages->pElems) = CLSID_MyFilterProp;
    return S_OK;
}

GetPages()関数を用いたら、CoTaskMemFree()関数でメモリーを解放すること。

    CAUUID cauuid;
    HRESULT hr = GetPages(&cauuid);

    if ((hr == S_OK)&&(0 < cauuid.cElems))
    {
        // TODO:
        CoTaskMemFree(cauuid.pElems);
    }

プロパティページの増設

CBasePropertyPageを継承するプロパティページクラスを作成します。

class CMyFilterProp : public CBasePropertyPage
{
...

クラスに以下の変数を含めます。

private:
    BOOL        m_bIsInitialized;       // ダイアログ初期化フラグ
    IMyFilter*  m_pIMyFilter;           // カスタムインターフェース

CBasePropertyPageクラスを用いる場合、以下の関数をオーバーライドする必要があります。

以下にプロパティページで必要な関数を紹介します。

CreateInstance

CUnknown *CMyFilterProp::CreateInstance(LPUNKNOWN lpunk, HRESULT *phr)
{
    CUnknown *punk = new CMyFilterProp(lpunk, phr);

    if (punk == NULL)
    {
        *phr = E_OUTOFMEMORY;
    }
    return punk;
}

コンストラクター

CMyFilterProp::CMyFilterProp(LPUNKNOWN pUnk, HRESULT *phr)
    : CBasePropertyPage(NAME("MyFilter Property Page"), pUnk, IDD_PROPERTIES, IDS_TITLE),
    m_pIMyFilter(NULL),
    m_bIsInitialized(FALSE)
{
    ASSERT(phr);
}

IDD_PROPERTIESはダイアログのIDです。IDS_TITLEはタイトル文字列を示すIDです。

OnReceiveMessage

ダイアログボックスが操作された時に呼び出されます。(例えばダイアログボックスにスライダーが配置されている場合)スライダーが操作された時は、uMsgがWM_HSCROLLあるいはWM_VSCROLLのメッセージを受信します。

m_pPageSiteはIPropertyPageインターフェースへのポインターです。

BOOL CMyFilterProp::OnReceiveMessage(
    HWND        hwnd,
    UINT        uMsg,
    WPARAM      wParam,
    LPARAM      lParam)
{
    switch (uMsg)
    {
        case WM_COMMAND:
        {
            if (m_bIsInitialized)
            {
                m_bDirty = TRUE;
                if (m_pPageSite)
                {
                    m_pPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY);
                }
            }
            return (LRESULT) 1;
        }
    }
    return CBasePropertyPage::OnReceiveMessage(hwnd,uMsg,wParam,lParam);
}

OnConnect

フィルターが接続された時に呼び出されます。

HRESULT CMyFilterProp::OnConnect(IUnknown *pUnknown)
{
    ASSERT(m_pIMyFilter == NULL);

    HRESULT hr = pUnknown->QueryInterface(IID_IMyFilter, (void **)&m_pIMyFilter);

    if (FAILED(hr))
    {
        return E_NOINTERFACE;
    }
    ASSERT(m_pIMyFilter);
    m_bIsInitialized = FALSE;

    return NOERROR;
}

OnDisconnect

フィルターが切断された時に呼び出されます。

HRESULT CMyFilterProp::OnDisconnect()
{
    if (m_pIMyFilter == NULL)
    {
        return E_UNEXPECTED;
    }
    m_pIMyFilter->Release();
    m_pIMyFilter = NULL;
    return NOERROR;
}

OnActivate

プロパティページが作成される時に呼び出されます。

HRESULT CMyFilterProp::OnActivate()
{
    ASSERT(m_pIMyFilter);
    m_bIsInitialized = TRUE;

    return NOERROR;
}

OnDeactivate

プロパティページが消去される時に呼び出されます。

HRESULT CMyFilterProp::OnDeactivate(void)
{
    ASSERT(m_pIMyFilter);
    m_bIsInitialized = FALSE;

    return NOERROR;
}

OnApplyChanges

ここで新しい変数をプロパティに反映させます。

HRESULT CMyFilterProp::OnApplyChanges()
{
    // TODO:
    return NOERROR;
}

加えてCFactoryTemplateのg_Templates[]配列にプロパティページの設定を追加する必要があります。

ドキュメントの先頭へ

カクタスソフトウェア 技術協力 資料室 資料室の広場 SourceForge.jp お問い合わせ