« C4D ダイアログのガジェットのひとつ、ユーザエリアのテストをユーザスクリプトで行ってみる。 | トップページ | C4D ダイアログのユーザエリアで独自のガジェットを作ったとして…イベントやデータのやり取りは? »

C4D ダイアログのユーザエリアの定期的な割り込み処理…

ダイアログのユーザエリアで定期的な処理を割り込みさせるには…
ユーザエリア内でアニメーションさせるとか…
定期的に再描画が必要になりますね。

アニメーションさせる為の機能ではなく、単に定期的に処理をしたい時に使います。

今回も手軽なユーザスクリプトで…
最小限でね…

/*
ユーザエリアでの定期的な割り込み処理
2009.9.17
*/



//---------------------------------------------------
enum
{
  ua_w = 300,
  ua_h = 200
}


//---------------------------------------------------
class testUserArea:GeUserArea
{
  public:
    var ly;
    testUserArea(id , dlg);
    Init();
    GetUserWidth();
    GetUserHeight();
    Draw(x1 , y1 , x2 , y2);
}

testUserArea::testUserArea(id , dlg)
{
  super(id , dlg);
}

testUserArea::Init()
{
  ly = 0;
}

testUserArea::GetUserWidth()
{
  return ua_w;
}

testUserArea::GetUserHeight()
{
  return ua_h;
}

testUserArea::Draw(x1 , y1 , x2 , y2)
{
  println("Draw()");

  SetClippingRegion(0 , 0 , ua_w - 1 , ua_h-1);

  DrawSetPen(vector(0.0));
  DrawRectangle(0 , 0 , ua_w - 1 , ua_h-1);

  DrawSetPen(vector(1.0));
  DrawLine(0 , ly , ua_w - 1 , ly);
}



//---------------------------------------------------
class testDialog:GeModalDialog
{
  public:
    var ua;

    testDialog();
    CreateLayout();
}

testDialog::testDialog()
{
  super();
}

testDialog::CreateLayout()
{
  SetTitle("testDialog");
  AddUserArea(1000 , 0 , ua_w , ua_h);
  AddDlgGroup(DR_DLGGROUP_OK|DR_DLGGROUP_CANCEL);
  ua = new(testUserArea , 1000 , this);
}


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

  dlg->Open(-1 , -1);
}

このスクリプトを実行すると…
黒いユーザエリアに白の水平なラインが1本引かれます。

ラインの初期の高さは、0なのでユーザエリアの一番上にあります。
ラインの高さを示す変数は、変化しないので、一番上に引かれたままです。

Userarea_13

では、定期的に割り込みを掛けて白いラインを徐々に下に移動させてみます。
割り込みは間隔は1秒に設定してみます。

時間を設定したら定期的に呼ばれるメンバ関数がTimer(msg)です。
これをオーバーライドします。

//---------------------------------------------------
class testUserArea:GeUserArea
{
  public:
    var ly;
    testUserArea(id , dlg);
    Init();
    GetUserWidth();
    GetUserHeight();
    Draw(x1 , y1 , x2 , y2);
    Timer(msg);
}

testUserArea::Timer()
{
  println("Timer()");
}

これで1秒ごとに"Timer()"がコンソールに表示することができます。
ただし、タイマーはまだ作動していません。

割り込む時間を設定するメンバ関数はSetTimer(time)です。
timeの単位はミリ秒です。1秒に指定するには1000を入力します。
あまり短い間隔に設定すると、他のアプリケーションにも影響を及ぼす可能性があるらしい…

では、タイマーを作動させます。
ユーザエリアの初期化の時に呼ばれるInit()でSetTimer()を実行します。

testUserArea::Init()
{
  ly = 0;
  SetTimer(1000);
}

これで、ようやくタイマーがセットされ1秒ごとに割り込み処理されます。
この時点では、コンソールに"Timer()"が1秒ごとに表示されるだけです。

では、ラインの高さであるly変数をTimer()メンバ関数内で変化させます。
一応、一番下まで移動したら一番上に戻します。

testUserArea::Timer()
{
  println("Timer()");

  ly++;
  if(ly >= ua_h)ly = 0;
}

これでラインが下に移動すると思っただろうか?
気づいていると思いますが、ユーザエリアを再描画するDraw()関数が、ダイアログを開いたときにしか実行されていません。
コンソールを見るとわかりますが、"Timer()"だけが続いて表示されています。

ここで、ユーザエリアを更新させるには、Redraw()メンバ関数を使います。
ly++で値を変更した後に実行してみます。

testUserArea::Timer()
{
  println("Timer()");

  ly++;
  if(ly >= ua_h)ly = 0;

  Redraw();
}

これで、1秒ごとにラインが下に移動します。
コンソールにも"Draw()""Timer()"が交互に表示されています。

Userarea_14

これでユーザエリアの割り込み処置のTimer()のテストも終わりです。
最後に一連で今回のスクリプトを…

/*
ユーザエリアでの定期的な割り込み処理
2009.9.17
*/



//---------------------------------------------------
enum
{
  ua_w = 300,
  ua_h = 200
}


//---------------------------------------------------
class testUserArea:GeUserArea
{
  public:
    var ly;
    testUserArea(id , dlg);
    Init();
    GetUserWidth();
    GetUserHeight();
    Draw(x1 , y1 , x2 , y2);
    Timer(msg);
}

testUserArea::testUserArea(id , dlg)
{
  super(id , dlg);
}

testUserArea::Init()
{
  ly = 0;
  SetTimer(1000);
}

testUserArea::GetUserWidth()
{
  return ua_w;
}

testUserArea::GetUserHeight()
{
  return ua_h;
}

testUserArea::Draw(x1 , y1 , x2 , y2)
{
  println("Draw()");

  SetClippingRegion(0 , 0 , ua_w - 1 , ua_h-1);

  DrawSetPen(vector(0.0));
  DrawRectangle(0 , 0 , ua_w - 1 , ua_h-1);

  DrawSetPen(vector(1.0));
  DrawLine(0 , ly , ua_w - 1 , ly);
}

testUserArea::Timer()
{
  println("Timer()");

  ly++;
  if(ly >= ua_h)ly = 0;

  Redraw();
}



//---------------------------------------------------
class testDialog:GeModalDialog
{
  public:
    var ua;

    testDialog();
    CreateLayout();
}

testDialog::testDialog()
{
  super();
}

testDialog::CreateLayout()
{
  SetTitle("testDialog");
  AddUserArea(1000 , 0 , ua_w , ua_h);
  AddDlgGroup(DR_DLGGROUP_OK|DR_DLGGROUP_CANCEL);
  ua = new(testUserArea , 1000 , this);
}


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

  dlg->Open(-1 , -1);
}

|

« C4D ダイアログのガジェットのひとつ、ユーザエリアのテストをユーザスクリプトで行ってみる。 | トップページ | C4D ダイアログのユーザエリアで独自のガジェットを作ったとして…イベントやデータのやり取りは? »