VCD Propertiesの基本的な使用法

ここではVCDPropertiesの基本的な機能を紹介すると共に、インターフェースを取得し、値やプロパティの自動設定などのエレメントを調節する方法に関して説明します。

概要

今回の例では"Brightness"プロパティを使ってどのようにプロパティが体系化され、アクセスされるのかを紹介します。

最初に、"Brightness"のIVCDPropertyItemクラスライブラリリファレンス>クラス>IVCDPropertyItemIVCDPropertyItemsクラスライブラリリファレンス>クラス>IVCDPropertyItems コレクションより取得されます。
(詳細はGrabber::getAvailableVCDPropertiesクラスライブラリリファレンス>クラス>Grabber>Grabber::getAvailableVCDProperties Methodを参照)

そしてswitch、range インターフェースがIVCDPropertyItemクラスライブラリリファレンス>クラス>IVCDPropertyItemの各エレメントより取得されます。switch インターフェースはプロパティの自動設定の切換え(on and off)に使用されます。range インターフェースはこのプロパティの値を調整するのに使用されます。

今回のサンプルプログラムのソースコードはサンプルソースディレクトリの%TOPLEVEL%\samples\VCx\VCD Simpleにございます。 VC++2010 バージョンでは%TOPLEVEL%\Samples\VC10となります。

プロジェクトの新規作成

今回のサンプルプログラムはダイアログベースのアプリケーションです。プロジェクトの作成方法ははじめに:Visual C++プロジェクトプログラマーズガイド>はじめに:Visual Studio C++で説明している手順にて行ってください。 今回の例とほぼ同じですが、今回は"シングルドキュメント"ではなく"ダイアログベース"となります。

チェックボックスとスライダをフォーム追加し、チェックボックスにはIDとしてIDC_BRIGHTNESS_CHECKを、スライダにはIDC_BRIGHTNESS_SLIDERを与えます。ライブビデオを表示させるにはダイアログに静的テキストコントロールを追加しIDをIDC_DISPLAYとします。

VCDPropertyItemの取得

デバイスの選択後、"Brightness"のIVCDPropertyItemクラスライブラリリファレンス>クラス>IVCDPropertyItemが取得されます。これはInitPropertyControls メソッド内で行われ、それをコールするのはOnInitDialog メソッドです。

tIVCDPropertyItemsPtr pItems = m_Grabber.getAvailableVCDProperties();
if( pItems != 0 )
{
  // brightnessの項目を探す
  tIVCDPropertyItemPtr pBrightnessItem = pItems->findItem( VCDID_Brightness );

有効なVCD Propertiesを保持するtIVCDPropertyItemsPtrクラスライブラリリファレンス>型定義>tIVCDPropertyItemsPtr型の変数pItemsを宣言します。

そしてtIVCDPropertyItemPtrクラスライブラリリファレンス>型定義>tIVCDPropertyItemPtr型の変数pBrightnessItemを宣言し、メソッドfindItemクラスライブラリリファレンス>クラス>IVCDPropertyItems>IVCDPropertyItems::findItem Methodを使用して適切なプロパティを割り当てます。取得するプロパティ項目はその項目ID(あるいは GUID)によって指定される必要がございます。この例ではVCDID_Brightnessがそれに当たります。

インターフェースの呼び出しとコントロールの初期化

プロパティは一つかそれ以上のエレメントから構成されています。要素には値や自動設定、ワンプッシュ動作、その他のパラメータがあります。プロパティの調整をするのにインターフェースが使われ、それらはプロパティ項目のエレメントより 取得できます。値や自動設定へのインターフェースを持つCVCDSimpleDlgクラスに2つのメンバ変数を追加します。

DShowLib::tIVCDRangePropertyPtr    m_pBrightnessRange;
DShowLib::tIVCDSwitchPropertyPtr    m_pBrightnessAuto;

次のコードはswitchまたはrangeインターフェースを取得し、関連するユーザーコントロール初期化のために現在の設定状態を得る方法を紹介しています。

tIVCDPropertyElementPtr pBrightnessValueElement = pBrightnessItem->findElement( VCDElement_Value );
tIVCDPropertyElementPtr pBrightnessAutoElement =  pBrightnessItem->findElement( VCDElement_Auto );

// 値の要素があればrangeインターフェースを取得
if( pBrightnessValueElement != 0 )
{
  pBrightnessValueElement->getInterfacePtr( m_pBrightnessRange );
}

// 自動設定の要素があればswitchインターフェースを取得
if( pBrightnessAutoElement != 0 )
{
  pBrightnessAutoElement->getInterfacePtr( m_pBrightnessAuto );

  // 成功した場合、自動設定を無効にする
  if( m_pBrightnessAuto != 0 )
    m_pBrightnessAuto->setSwitch( false );
}

インターフェースの取得は2段階に別れて行われます。最初は調整する要素の取得です。
これはIVCDPropertyItem::findElementクラスライブラリリファレンス>クラス>IVCDPropertyItem>IVCDPropertyItem::findElement Methodメソッドによって行われます。次に必要なインターフェースが各要素より取得されます。
これを行うのはIVCDPropertyElement::getInterfacePtrクラスライブラリリファレンス>クラス>IVCDPropertyItems>IVCDPropertyElement::getInterfacePtr Method メソッドで、指定したインターフェースへの参照を返します。

インターフェースを取得したのでユーザーコントロールを初期化できます。その方法としては次の通りです。

// brightness値へのrangeインターフェースの取得ができたかをチェック
if( m_pBrightnessRange != 0 )
{
  m_BrightnessSlider.EnableWindow();

  // スライダの範囲を設定
  int delta = m_pBrightnessRange->getDelta();
  m_BrightnessSlider.SetRangeMin( m_pBrightnessRange->getRangeMin() / delta );
  m_BrightnessSlider.SetRangeMax( m_pBrightnessRange->getRangeMax() / delta );

   // スライダ位置を設定
  m_BrightnessSlider.SetPos( m_pBrightnessRange->getValue() / delta );
}
else
{
  m_BrightnessSlider.EnableWindow( FALSE );
}

// brightness の自動設定へのswitch インターフェースの取得ができたかをチェック
if( m_pBrightnessAuto != 0 )
{
  m_BrightnessAutoCheck.EnableWindow();
  m_BrightnessAutoCheck.SetCheck( m_pBrightnessAuto->getSwitch() );
}
else
{
  m_BrightnessAutoCheck.EnableWindow( FALSE );
}

上記のコードが示すように、インターフェースクラスがプロパティ項目の要素へのアクセスを容易にしています。

プロパティ要素の調整

最後に、インターフェースを使ってプロパティの調整を行う方法について説明したいと思います。チェックボックスのClickイベントとWM_HSCROLLメッセージのハンドラを追加します。チェックボックスは"Brightness" プロパティの自動設定の切換えを行います。 コードは以下のようになります。

if( m_BrightnessAutoCheck.GetCheck() )
{
  m_BrightnessSlider.EnableWindow( FALSE );
  m_pBrightnessAuto->setSwitch( true );
}
else
{
  m_BrightnessSlider.EnableWindow();
  m_pBrightnessAuto->setSwitch( false );
}

上記のコードは単にチェックボックスの状態を"Brightness"プロパティの自動設定の要素に当てはめるだけのものです。
さらに自動設定が有効である場合、スライダを無効化します。

スライダのScrollイベントのコードはさらにシンプルなものになります。

int delta = m_pBrightnessRange->getDelta();
m_pBrightnessRange->setValue( m_BrightnessSlider.GetPos() * delta ) ;

これでプログラムを実行すれば"Brightness" プロパティをスライダやチェックボックスを使って調整できるようになります。