XSIのプラグインでダイアログを使用する2

今回はダイアログにラジオボタン、コンボボックス、アイコンリストと
チェックボックスを追加してみたいと思います。

ダイアログにラジオボタン、コンボボックス、アイコンリストを追加するには
PPGLayout::AddEnumControlを使用します。

ソースコードはこんな感じです。

    //--------------------------------------------------------------
    // ラジオボタン
    //--------------------------------------------------------------
    CValueArray value_radio;
    value_radio.Add( L"radio button 01" ), value_radio.Add( 1L );
    value_radio.Add( L"radio button 02" ), value_radio.Add( 2L );
    value_radio.Add( L"radio button 03" ), value_radio.Add( 3L );

    cpset.AddParameter( L"test_radio", CValue::siInt4, siPersistable, L"", L"", 1L, param );
    item = layout.AddEnumControl(
        L"test_radio",
        value_radio,
        L"Radio Button",
        siControlRadio
    );

    //--------------------------------------------------------------
    // コンボボックス
    //--------------------------------------------------------------
    CValueArray value_combo;
    value_combo.Add( L"combo box 01" ), value_combo.Add( 1L );
    value_combo.Add( L"combo box 02" ), value_combo.Add( 2L );
    value_combo.Add( L"combo box 03" ), value_combo.Add( 3L );

    cpset.AddParameter( L"test_combo", CValue::siInt4, siPersistable, L"", L"", 1L, param );
    item = layout.AddEnumControl(
        L"test_combo",
        value_combo,
        L"Combo Box",
        siControlCombo
    );

    //--------------------------------------------------------------
    // アイコンリスト
    //--------------------------------------------------------------
    CValueArray value_icon;
    value_icon.Add( path + L"r.bmp" ), value_icon.Add( 1L );
    value_icon.Add( path + L"g.bmp" ), value_icon.Add( 2L );
    value_icon.Add( path + L"b.bmp" ), value_icon.Add( 3L );

    cpset.AddParameter( L"test_icon", CValue::siInt4, siPersistable, L"", L"", 1L, param );
    item = layout.AddEnumControl(
        L"test_icon",
        value_icon,
        L"Icon List",
        siControlIconList
    );

これらを使用するにはまずCValueArrayを使用して表示する物と選択されたときの値のセットを作成します。
上記コードの5行目あたりでCValueArray::Add()を2回してますが、
1番目が表示される文字列で、2番目が選択されたときにCustomProperty::GetParameterValue()で取得できる値です。
この2つが基本セットで、これを複数追加することで選択肢を作成します。
CustomProperty::AddParameter()の第6引数はデフォルト値ですが、
これを2番目にCValueArrayに追加した値とあわせておくことで、デフォルトでチェックしておくアイテムを選択できます。
この場合は”radio button 01″がデフォルトでチェックされているはずです。
CustomProperty::AddParameter()の第6引数に”3L”を渡せば、
“radio button 03″がチェックされているはずです。

アイコンリストの場合はCValueArrayの1番目にビットマップのファイル名を渡します。
この場合はpathで示されるディレクトリにr,g,bという3つのbmpファイルがある事を想定しています。

これを実行すると以下のようになります。
plugin13

ちなみに2番目にCValueArrayに追加する値には、数値型でなく文字列も使用できます。
その場合のコードは次のようになります。

    CValueArray value_radio;
    value_radio.Add( L"radio button 01" ), value_radio.Add( L"value string 01" );
    value_radio.Add( L"radio button 02" ), value_radio.Add( L"value string 02" );
    value_radio.Add( L"radio button 03" ), value_radio.Add( L"value string 03" );

    cpset.AddParameter( L"test_radio", CValue::siString, siPersistable, L"", L"", L"value string 02", param );
    item = layout.AddEnumControl(
        L"test_radio",
        value_radio,
        L"Combo Box",
        siControlCombo
    );

また、PPGLayout::AddEnumControlを使わずにPPGLayout::AddItemを使用しても同じ結果が得られます。
コードはこうなります。

    //--------------------------------------------------------------
    // ラジオボタン
    //--------------------------------------------------------------
    CValueArray value_radio;
    value_radio.Add( L"radio button 01" ), value_radio.Add( 1L );
    value_radio.Add( L"radio button 02" ), value_radio.Add( 2L );
    value_radio.Add( L"radio button 03" ), value_radio.Add( 3L );

    cpset.AddParameter( L"test_radio", CValue::siInt4, siPersistable, L"", L"", 1L, param );
    item = layout.AddItem(
        L"test_radio",
        L"Radio Button",
        siControlRadio
    );
    item.PutAttribute(
        siUIItems,
        value_radio
    );

    //--------------------------------------------------------------
    // コンボボックス
    //--------------------------------------------------------------
    CValueArray value_combo;
    value_combo.Add( L"combo box 01" ), value_combo.Add( L"value string 01" );
    value_combo.Add( L"combo box 02" ), value_combo.Add( L"value string 02" );
    value_combo.Add( L"combo box 03" ), value_combo.Add( L"value string 03" );

    cpset.AddParameter( L"test_combo", CValue::siString, siPersistable, L"", L"", L"value string 02", param );
    item = layout.AddItem(
        L"test_combo",
        L"Combo Box",
        siControlCombo
    );
    item.PutAttribute(
        siUIItems,
        value_combo
    );

    //--------------------------------------------------------------
    // アイコンリスト
    //--------------------------------------------------------------
    CValueArray value_icon;
    value_icon.Add( path + L"r.bmp" ), value_icon.Add( 1L );
    value_icon.Add( path + L"g.bmp" ), value_icon.Add( 2L );
    value_icon.Add( path + L"b.bmp" ), value_icon.Add( 3L );

    cpset.AddParameter( L"test_icon", CValue::siInt4, siPersistable, L"", L"", 1L, param );
    item = layout.AddItem(
        L"test_icon",
        L"Icon List",
        siControlIconList
    );
    item.PutAttribute(
        siUIItems,
        value_icon
    );


次にチェックボックスです。

    cpset.AddParameter( L"test_check", CValue::siBool, siPersistable, L"", L"", true, param );
    item = layout.AddItem(
        L"test_check",
        L"Check Box",
        siControlCheck
    );

PPGLayout::AddItem()の第3引数はsiControlCheckでなくsiControlBooleanでも同じ結果になるようです。

これを実行すると次のようになります。
plugin14

PPGLayout::AddEnumControlを使ってチェックボックスもグループ化出来るようです。

    CValueArray value_check;
    value_check.Add( L"check box 01" ), value_check.Add( true );
    value_check.Add( L"check box 02" ), value_check.Add( false );
    value_check.Add( L"check box 03" ), value_check.Add( true );
    
    cpset.AddParameter( L"test_check", CValue::siBool, siPersistable, L"", L"", true, param );
    item = layout.AddEnumControl(
        L"test_check",
        value_check,
        L"Check Box",
        siControlCheck
    );

これを実行すると次のようになります。
plugin13

しかし、CustomProperty::GetParameterValueで取得できるのは一番上の物だけのようです。
他の方法で取得する事が出来るかもしれませんが、自分は見つけることが出来ませんでした…

今日はこの辺で終わりたいと思います。
次はスライダーバーとカラーコントロールを追加してみます。

コメント/トラックバック (1件)

  1. certified nursing assistant のコメント:

    nice post. thanks.

コメントする

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トラックバックする

トラックバック用URL:

アニメーションが親切に解説されております

レンダリング、ライティングの基本が分かります

図版が見やすい美術解剖書です