« C4D ユーザスクリプトでモーダルダイアログの学習 | トップページ | C4D ユーザスクリプトでモーダルダイアログの学習-03 »

C4D ユーザスクリプトでモーダルダイアログの学習-02

前回の記事では、ダイアログの組み立ての最小限の基本的な事を行いました。
今回は、ウィジェットを少しだけ詰めていきます。

では、レイアウトで使うウィジェット等を確認します。
必要最小限でInit()/AskClose()は要りません。

/*
ダイアログのレイアウトの学習
2009.8.1
*/


//test_dialogクラス==========================================

class test_dialog:GeModalDialog
{
  public:
    test_dialog();//コンストラクタ
    CreateLayout();//ダイアログのレイアウト
}

//コンストラクタ-----------------
test_dialog::test_dialog()
{
  super();
}

//ダイアログレイアウト-------------
test_dialog::CreateLayout()
{
  SetTitle("test_dialogs");//ダイアログのタイトル設定

  //ウィジェットやグループを…

  AddDlgGroup(DR_DLGGROUP_OK | DR_DLGGROUP_CANCEL);
}



//main==========================================
main(doc , op)
{
  var dlg = new(test_dialog);

  dlg->Open(-1 , -1);
  if(!dlg->GetResult())return;

  println("ok");
}

ダイアログのレイアウトで使うグループやウィジェットの指定には、共通なルールがあります。
それぞれのパーツの配置やIDです。
主要なパーツは、IDで管理され、IDの衝突が起こらないよう割り振ってください。
配置は、与えられた空間に配置する為のもの。右寄せ、左寄せ等を指定します。

BFV_FIT 垂直に合わせる
BFH_FIT 水平に合わせる
BFV_CENTER 垂直方向の中位置
BFH_CENTER 水平方向の中位置
BFH_LEFT 水平方向の左位置
BFH_RIGHT 水平方向の右位置
BFV_TOP 垂直方向の上位置
BFV_BOTTOM 垂直方向の下位置
BFH_SCALE 水平にスケール
BFV_SCALE 垂直にスケール

では、始めましょう。

レイアウトをコントロールするには、グループを使います。
グループには、いくつか種類があります。
最も一般的なウィジェットをまとめるグループから始めます。

グループは、表計算の表の様に、格子状になっています。格子は見えません。
グループの中に、更にグループを組み込む事も可能です。

Dialog_08

AddGroupBeginV(ID , 配置 , 列数 , 文字列 , グループフラグ)
  :
AddGroupEnd()

もしくは、

AddGroupBeginH(ID , 配置 , 行数 , 文字列 , グループフラグ)
  :
AddGroupEnd()

  AddGroupBeginV(10000 , BFH_SCALEFIT , 2 , "group-1" , 0);
    AddStaticText(10001 , 0 , 0 , 0 , "g-1 ウィジェット A" , 0);

    AddGroupBeginH(10002 , BFH_SCALEFIT , 3 , "group-2" , 0);
      AddStaticText(10003 , 0 , 0 , 0 , "g-2 ウィジェット B-1" , 0);
      AddStaticText(10004 , 0 , 0 , 0 , "g-2 ウィジェット B-2" , 0);
      AddStaticText(10005 , 0 , 0 , 0 , "g-2 ウィジェット B-3" , 0);
    AddGroupEnd();

    AddStaticText(10006 , 0 , 0 , 0 , "g-1 ウィジェット C" , 0);
    AddStaticText(10007 , 0 , 0 , 0 , "g-1 ウィジェット D" , 0);
  AddGroupEnd();

配置は、グループ内の配置ではなく、グループその物を配置する為のものです。

グループフラグは、グループ内の格子の幅を均等にします。

BFV_GRIDGROUP_EQUALCOLS
BFV_GRIDGROUP_EQUALROWS

では、次にグループ枠の指定です。

AddGroupBorder(枠のタイプ)

先ほどのダイアログにグループの枠を指定してみます。

  AddGroupBeginV(10000 , BFH_SCALEFIT , 2 , "group-1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddStaticText(10001 , 0 , 0 , 0 , "g-1 ウィジェット A" , 0);

    AddGroupBeginH(10002 , BFH_SCALEFIT , 3 , "group-2" , 0);
      AddGroupBorder(BORDER_GROUP_IN);

      AddStaticText(10003 , 0 , 0 , 0 , "g-2 ウィジェット B-1" , 0);
      AddStaticText(10004 , 0 , 0 , 0 , "g-2 ウィジェット B-2" , 0);
      AddStaticText(10005 , 0 , 0 , 0 , "g-2 ウィジェット B-3" , 0);
    AddGroupEnd();

    AddStaticText(10006 , 0 , 0 , 0 , "g-1 ウィジェット C" , 0);
    AddStaticText(10007 , 0 , 0 , 0 , "g-1 ウィジェット D" , 0);
  AddGroupEnd();

グループの枠を指定しました。

Dialog_09

マージンは指定していないので、ウィジェットがグループの枠に触れています。

枠の種類と定数を見てみましょう。

Dialog_10

次にマージンを指定しましょう。

AddGroupBorderSpace(左側 , 上側 , 右側 , 下側)

  AddGroupBeginV(10000 , BFH_SCALEFIT , 2 , "group-1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(10 , 20 , 30 , 40);

    AddStaticText(10001 , 0 , 0 , 0 , "g-1 ウィジェット A" , 0);

    AddGroupBeginH(10002 , BFH_SCALEFIT , 3 , "group-2" , 0);
      AddGroupBorder(BORDER_GROUP_IN);

      AddStaticText(10003 , 0 , 0 , 0 , "g-2 ウィジェット B-1" , 0);
      AddStaticText(10004 , 0 , 0 , 0 , "g-2 ウィジェット B-2" , 0);
      AddStaticText(10005 , 0 , 0 , 0 , "g-2 ウィジェット B-3" , 0);
    AddGroupEnd();

    AddStaticText(10006 , 0 , 0 , 0 , "g-1 ウィジェット C" , 0);
    AddStaticText(10007 , 0 , 0 , 0 , "g-1 ウィジェット D" , 0);
  AddGroupEnd();

Dialog_11

ウィジェット間の幅を指定します。

AddGroupSpace(横方向の幅 , 縦方向の幅)

  AddGroupBeginV(10000 , BFH_SCALEFIT , 2 , "group-1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(10 , 20 , 30 , 40);
    AddGroupSpace(25 , 45);

    AddStaticText(10001 , 0 , 0 , 0 , "g-1 ウィジェット A" , 0);

    AddGroupBeginH(10002 , BFH_SCALEFIT , 3 , "group-2" , 0);
      AddGroupBorder(BORDER_GROUP_IN);
      AddStaticText(10003 , 0 , 0 , 0 , "g-2 ウィジェット B-1" , 0);
      AddStaticText(10004 , 0 , 0 , 0 , "g-2 ウィジェット B-2" , 0);
      AddStaticText(10005 , 0 , 0 , 0 , "g-2 ウィジェット B-3" , 0);
    AddGroupEnd();

    AddStaticText(10006 , 0 , 0 , 0 , "g-1 ウィジェット C" , 0);
    AddStaticText(10007 , 0 , 0 , 0 , "g-1 ウィジェット D" , 0);
  AddGroupEnd();

Dialog_12

これで、一般的なグループの設定が問題なくできると思います。

ではウィジェットを見てみましょう。

AddArrowButton(id , 配置 , 幅 , 高さ , アロータイプ)

ARROW_LEFT
ARROW_RIGHT
ARROW_UP
ARROW_DOWN

  AddGroupBeginV(10000 , BFH_SCALEFIT , 4 , "group-1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(10 , 5 , 10 , 5);

    AddArrowButton(1000 , BFH_SCALEFIT , 0 , 0 , ARROW_LEFT);
    AddArrowButton(1001 , BFH_SCALEFIT , 0 , 0 , ARROW_RIGHT);
    AddArrowButton(1002 , BFH_SCALEFIT , 0 , 0 , ARROW_UP);
    AddArrowButton(1003 , BFH_SCALEFIT , 0 , 0 , ARROW_DOWN);

  AddGroupEnd();

Dialog_13


AddButton(id , 配置 , 幅 , 高さ , 文字列)

  AddGroupBeginV(10000 , BFH_SCALEFIT , 4 , "group-1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(10 , 5 , 10 , 5);

    AddButton(1000 , BFH_SCALEFIT , 0 , 0 , "ボタン");

  AddGroupEnd();

Dialog_14


AddStaticText( id , 配置 , 幅 , 高さ , 文字列 , 枠線)

  AddGroupBeginV(10000 , BFH_SCALEFIT , 4 , "group-1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(10 , 5 , 10 , 5);

    AddStaticText(1000 , BFH_SCALEFIT , 0 , 0 , "テキスト" , BORDER_GROUP_IN);


  AddGroupEnd();

Dialog_15


AddCheckbox(id , 配置 , 幅 , 高さ , 文字列)

  AddGroupBeginV(10000 , BFH_SCALEFIT , 4 , "group-1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(10 , 5 , 10 , 5);

    AddCheckbox(1000 , BFH_SCALEFIT , 0 , 0 , "チェックボックス");

  AddGroupEnd();

Dialog_16


AddEditText(id , 配置 , 幅 , 高さ)

  AddGroupBeginV(10000 , BFH_SCALEFIT , 4 , "group-1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(10 , 5 , 10 , 5);

    AddEditText(1000 , BFH_SCALEFIT , 0 , 0);

  AddGroupEnd();

Dialog_17


AddMultiLineEditText(id , 配置 , 幅 , 高さ , スタイル)

  AddGroupBeginV(10000 , BFH_SCALEFIT , 4 , "group-1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(10 , 5 , 10 , 5);

    AddMultiLineEditText(1000 , BFH_SCALEFIT , 0 , 50 , 0);

  AddGroupEnd();

Dialog_18

DR_MULTILINE_MONOSPACED 等幅フォント
DR_MULTILINE_SYNTAXCOLOR C.O.F.F.E.E.明示
DR_MULTILINE_STATUSBAR 情報表示

AddEditNumber(id , 配置 , 幅 , 高さ)

  AddGroupBeginV(10000 , BFH_SCALEFIT , 4 , "group-1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(10 , 5 , 10 , 5);

    AddEditNumber(1000 , BFH_SCALEFIT , 0 , 0);

  AddGroupEnd();

Dialog_19


AddEditNumberArrows(id , 配置 , 幅 , 高さ)

  AddGroupBeginV(10000 , BFH_SCALEFIT , 4 , "group-1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(10 , 5 , 10 , 5);

    AddEditNumberArrows(1000 , BFH_SCALEFIT , 0 , 0);

  AddGroupEnd();

Dialog_20


AddSlider(id , 配置 , 幅 , 高さ)

  AddGroupBeginV(10000 , BFH_SCALEFIT , 4 , "group-1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(10 , 5 , 10 , 5);

    AddSlider(1000 , BFH_SCALEFIT , 0 , 0);

  AddGroupEnd();

Dialog_21


AddEditSlider(id , 配置 , 幅 , 高さ)

  AddGroupBeginV(10000 , BFH_SCALEFIT , 4 , "group-1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(10 , 5 , 10 , 5);

    AddEditSlider(1000 , BFH_SCALEFIT , 0 , 0);

  AddGroupEnd();

Dialog_22


AddColorField(id , 配置 , 幅 , 高さ)

  AddGroupBeginV(10000 , BFH_SCALEFIT , 4 , "group-1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(10 , 5 , 10 , 5);

    AddColorField(1000 , BFH_SCALEFIT , 50 , 50);

  AddGroupEnd();

Dialog_23


AddColorChooser(id, 配置 , 幅 , 高さ , タイプ)

  AddGroupBeginV(10000 , BFH_SCALEFIT , 4 , "group-1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(10 , 5 , 10 , 5);

    AddColorChooser(1000 , BFH_SCALEFIT , 0 , 0 , 0);

  AddGroupEnd();

Dialog_25

DR_COLORFIELD_NO_BRIGHTNESS
DR_COLORFIELD_NO_COLOR
DR_COLORFIELD_BODYPAINT

Dialog_33

ここからは、グループとアイテムの組み合わせになります。

AddRadioGroupV(id , 配置 , 列数)
  AddItem(group-id , item-id , 文字列)
    :

  AddGroupBeginV(10000 , BFH_SCALEFIT , 4 , "group-1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(10 , 5 , 10 , 5);

    AddRadioGroupV(1000 , BFH_SCALEFIT , 5);
        AddItem(1000 , 0 , "item 0");
        AddItem(1000 , 1 , "item 1");
        AddItem(1000 , 2 , "item 2");
        AddItem(1000 , 3 , "item 3");
        AddItem(1000 , 4 , "item 4");

  AddGroupEnd();

Dialog_26


AddRadioGroupH(id , 配置 , 行数)
  AddItem(group-id , item-id , 文字列)
    :

  AddGroupBeginV(10000 , BFH_SCALEFIT , 4 , "group-1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(10 , 5 , 10 , 5);

    AddRadioGroupH(1000 , BFH_SCALEFIT , 5);
        AddItem(1000 , 0 , "item 0");
        AddItem(1000 , 1 , "item 1");
        AddItem(1000 , 2 , "item 2");
        AddItem(1000 , 3 , "item 3");
        AddItem(1000 , 4 , "item 4");

  AddGroupEnd();

Dialog_27


AddComboBox(id , 配置 , 幅 , 高さ)
  AddItem(group-id , item-id , 文字列)
    :

  AddGroupBeginV(10000 , BFH_SCALEFIT , 4 , "group-1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(10 , 5 , 10 , 5);

    AddComboBox(1000 , BFH_LEFT , 0 , 0);
        AddItem(1000 , 0 , "item 0");
        AddItem(1000 , 1 , "item 1");
        AddItem(1000 , 2 , "item 2");
        AddItem(1000 , 3 , "item 3");
        AddItem(1000 , 4 , "item 4");

  AddGroupEnd();

Dialog_28


AddPopupButton(id , 配置 , 幅 , 高さ)
  AddItem(group-id , item-id , 文字列)
    :

  AddGroupBeginV(10000 , BFH_SCALEFIT , 4 , "group-1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(10 , 5 , 10 , 5);

    AddPopupButton(1000 , BFH_LEFT , 0 , 0);
        AddItem(1000 , 0 , "item 0");
        AddItem(1000 , 1 , "item 1");
        AddItem(1000 , 2 , "item 2");
        AddItem(1000 , 3 , "item 3");
        AddItem(1000 , 4 , "item 4");

  AddGroupEnd();

Dialog_29

次は、タブです。
複数のタブを作成するには、タブグループの中に複数のグループ[AddGroupBiginH()またはAddGroupBiginV()]を使用するタブの数だけ入れ込みます。
タブの名前は、入れ込んだグループの文字列(名前)が使われます。

AddTabGroupBegin(id , 配置 , タブタイプ)
  AddGroupBiginV()//タブ1
    :
  AddGroupEnd()
  AddGroupBiginV()//タブ2
    :
  AddGroupEnd()
    :
AddTabGroupEnd();

  AddGroupBeginV(10000 , BFH_SCALEFIT , 4 , "group-1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(10 , 5 , 10 , 5);

    AddTabGroupBegin(1001 , BFH_SCALEFIT , TAB_TABS);

      //タブ-1-----------------------------------------------------------
      AddGroupBeginV(1002 , BFH_SCALEFIT , 4 , "tab-1" , 0);
        AddGroupBorderSpace(10 , 5 , 10 , 5);

        AddRadioGroupH(10022 , BFH_LEFT , 5);
         AddItem(10022 , 0 , "item 0");
          AddItem(10022 , 1 , "item 1");
          AddItem(10022 , 2 , "item 2");
         AddItem(10022 , 3 , "item 3");
          AddItem(10022 , 4 , "item 4");

      AddGroupEnd();

      //タブ-2-----------------------------------------------------------
      AddGroupBeginV(1003 , BFH_SCALEFIT , 4 , "tab-2" , 0);

        AddColorChooser(10031 , BFH_SCALEFIT , 0 , 0 , 0);

      AddGroupEnd();

      //タブ-3-----------------------------------------------------------
      AddGroupBeginV(1004 , BFH_SCALEFIT , 2 , "tab-3" , 0);
        AddStaticText(10041 , BFH_LEFT , 0 , 0 , "テキスト" , BORDER_NONE);
        AddEditSlider(10042 , BFH_SCALEFIT , 0 , 0);
        AddStaticText(10043 , BFH_LEFT , 0 , 0 , "テキスト" , BORDER_NONE);
        AddEditSlider(10044 , BFH_SCALEFIT , 0 , 0);
        AddStaticText(10045 , BFH_LEFT , 0 , 0 , "テキスト" , BORDER_NONE);
        AddEditSlider(10046 , BFH_SCALEFIT , 0 , 0);
      AddGroupEnd();

    AddTabGroupEnd();

  AddGroupEnd();

Dialog_31

TAB_NOSELECT タブは無く、最初のグループのみ表示
TAB_TABS 通常のタブ
TAB_CYCLE ポップアップ
TAB_RADIO ラジオボタン

Dialog_32

ウィジェットなどを区切る、セパレーターです。

AddSeparatorV(高さ)
AddSeparatorH(幅)

高さや幅を指定できるようなのだけど…
値を変えても変化が無い。
何かの組み合わせなのだろうか?

  AddGroupBeginH(10000 , BFH_SCALEFIT , 1 , "group-1" , 0);
    AddStaticText(1000 , BFH_CENTER , 0 , 0 , "C4D" , 0);
    AddSeparatorV(0);
    AddStaticText(1001 , BFH_CENTER , 0 , 0 , "CINEMA 4D" , 0);
    AddSeparatorV(0);
    AddStaticText(1002 , BFH_CENTER , 0 , 0 , "BP" , 0);
    AddSeparatorV(0);
    AddStaticText(1003 , BFH_CENTER , 0 , 0 , "BodyBaint" , 0);
  AddGroupEnd();

  AddSeparatorH(0);

Dialog_30

最後にKO/キャンセルボタンです。

AddDlgGroup(タイプ)

  AddDlgGroup(DR_DLGGROUP_OK | DR_DLGGROUP_CANCEL);

Dialog_34

DR_DLGGROUP_OK OK
DR_DLGGROUP_CANCEL キャンセル

これで主なウィジェットは使えると思います。
取り上げなかったウィジェットは、いつの日か…

|

« C4D ユーザスクリプトでモーダルダイアログの学習 | トップページ | C4D ユーザスクリプトでモーダルダイアログの学習-03 »