home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / MEDIT.LZH / DRANGE.CPP < prev    next >
C/C++ Source or Header  |  1996-07-10  |  16KB  |  690 lines

  1. /*  Project medit
  2.     Project Team DoGA
  3.     Copyright (c) 1995. All Rights Reserved.
  4.  
  5.     サブシステム:    medit.apx Application
  6.     ファイル:        drange.cpp
  7.     作成者:          Taka2
  8.  
  9.  
  10.     概要
  11.     ====
  12.     TDRange (TDialog) のインプリメンテーション用のソースファイル
  13. */
  14.  
  15. #include <owl\owlpch.h>
  16. #pragma hdrstop
  17.  
  18. #include <owl\static.h>
  19. #include <owl\inputdia.h>
  20. #include "drange.h"
  21. #include "anim.h"
  22. #include "motion.h"
  23.  
  24. #include "log.h"
  25.  
  26. static const TColor& cLine = TColor::Black;
  27. static const TColor& cLineRange = TColor::LtGreen;
  28. static const TColor& cMarkerLimit = TColor::LtYellow;
  29. static const TColor& cMarkerLimitLine = TColor::Black;
  30. static const TColor& cMarkerSpeed = TColor::LtBlue;
  31. static const TColor& cGrid = TColor::LtYellow;
  32. static const TColor& cLimit = TColor::LtBlue;
  33. static const TColor& cLineSpeed = TColor::LtRed;
  34. static const TColor& cRangeOutside = TColor::LtGray;
  35.  
  36. //
  37. // このアプリケーションで処理するすべてのメッセージ/コマンドの
  38. // 応答テーブルを作成する
  39. //
  40. DEFINE_RESPONSE_TABLE1(TDRange, TDialog)
  41. //{{TDRangeRSP_TBL_BEGIN}}
  42.     EV_WM_LBUTTONDOWN,
  43.     EV_WM_LBUTTONUP,
  44.     EV_BN_CLICKED(IDOK, CmOK),
  45.     EV_WM_PAINT,
  46.     EV_WM_MOUSEMOVE,
  47.     EV_BN_CLICKED(IDHELP, HelpClicked),
  48. //{{TDRangeRSP_TBL_END}}
  49. END_RESPONSE_TABLE;
  50.  
  51.  
  52. //{{TDRange Implementation}}
  53.  
  54. #define BEGINFRAME 1
  55. #define ENDFRAME (anim->maxframe)
  56.  
  57.  
  58. TDRange::TDRange (TWindow* parent, AnimationData *a, Motion *m, char *_mess, TResId resId, TModule* module):
  59.     TDialog(parent, resId, module)
  60. {
  61.     // INSERT>> コンストラクタ用のコードはここに
  62. //    SetBkgndColor(TColor::LtGray);
  63.  
  64.     anim = a;
  65.     motion = m;
  66.     mess = _mess;
  67.  
  68.     message           = new TStatic(this, IDC_TEXT_MESSAGE);
  69.  
  70.     framebegin     = new TStatic(this, IDC_NUM_TIME_BEGIN);
  71.     frameend       = new TStatic(this, IDC_NUM_TIME_END);
  72.  
  73.     framebegintext = new TStatic(this, IDC_TEXT_TIME_BEGIN);
  74.     frameendtext   = new TStatic(this, IDC_TEXT_TIME_END);
  75.  
  76.     pointbegin     = new TStatic(this, IDC_TEXT_BEGIN);
  77.     pointend       = new TStatic(this, IDC_TEXT_END);
  78.  
  79.     begin = m->beginframe;
  80.     end = m->endframe;
  81.  
  82.     if (m->motiondata != NULL) {
  83.         speed[0] = m->motiondata->speed[0];
  84.         speed[1] = m->motiondata->speed[1];
  85.     }
  86.     radius = 0;
  87.     dragflag = DRAG_NONE;
  88. }
  89.  
  90.  
  91. TDRange::~TDRange ()
  92. {
  93.     Destroy();
  94. }
  95.  
  96. int TDRange::GetX(int pos)
  97. {
  98.     return axisx + (int)((double)rangex * (double)(pos - BEGINFRAME) / (double)(ENDFRAME - BEGINFRAME));
  99. }
  100.  
  101. double TDRange::GetSpeedBegin(TPoint& p)
  102. {
  103.     int b0 = GetX(begin);
  104.     int b1 = GetX(end);
  105.  
  106.     int x = b0 - p.x;
  107.     int y = -axisy      + p.y;
  108.  
  109.     if (x == 0) {
  110.         return 0.0;
  111.     } else if (b0 == b1) {
  112.         return 4;
  113.     } else {
  114.         return (double)y / (double)x * (double)(b1-b0) / (double)rangey;
  115.     }
  116. }
  117.  
  118. double TDRange::GetSpeedEnd(TPoint& p)
  119. {
  120.     int b0 = GetX(begin);
  121.     int b1 = GetX(end);
  122.  
  123.     int x = -b1 + p.x;
  124.     int y = axisy-rangey - p.y;
  125.  
  126.     if (x == 0) {
  127.         return 0.0;
  128.     } else if (b0 == b1) {
  129.         return 4;
  130.     } else {
  131.         return (double)y / (double)x * (double)(b1-b0) / (double)rangey;
  132.     }
  133. }
  134.  
  135. TPoint TDRange::GetBezierBegin(double s)
  136. {
  137.     int b0 = GetX(begin);
  138.     int b1 = GetX(end);
  139.  
  140.     if (s < 0) s = speed[0];
  141.     TPoint p;
  142.     if (b1 == b0) {
  143.         p.x = b0;
  144.         p.y = axisy - radius;
  145.         return p;
  146.     }
  147.     double a = s * rangey / (b1-b0);
  148.     double l = sqrt(a*a+1);
  149.     p.x = b0 + radius * 1.0 / l;
  150.     p.y = axisy - radius * a   / l;
  151.     return p;
  152. }
  153.  
  154. TPoint TDRange::GetBezierEnd(double s)
  155. {
  156.     int b0 = GetX(begin);
  157.     int b1 = GetX(end);
  158.  
  159.     if (s < 0) s = speed[1];
  160.     TPoint p;
  161.     if (b0 == b1) {
  162.         p.x = b1;
  163.         p.y = axisy - rangey + radius;
  164.         return p;
  165.     }
  166.     double a = s * rangey / (b1-b0);
  167.     double l = sqrt(a*a+1);
  168.     p.x = b1 - radius * 1.0 / l;
  169.     p.y = axisy - rangey + radius * a   / l;
  170.     return p;
  171. }
  172.  
  173. void TDRange::SetupWindow ()
  174. {
  175.     TDialog::SetupWindow();
  176.  
  177.     // INSERT>> 追加のコードはここに
  178.  
  179.     message->SetText(mess);
  180.  
  181.     char str[10];
  182.     sprintf(str, "%d", begin);
  183.     framebegin->SetText(str);
  184.     sprintf(str, "%d", end);
  185.     frameend->SetText(str);
  186.  
  187.     framebegintext->SetText("BBB");
  188.     frameendtext->SetText("EEE");
  189.  
  190.     axisx  = framebegin->Attr.X + framebegin->Attr.W;
  191.     rangex = frameend->Attr.X - axisx;
  192.  
  193.     axisy  = pointbegin->Attr.Y + pointbegin->Attr.H/2;
  194.     rangey = axisy - (pointend->Attr.Y+pointend->Attr.H/2);
  195.  
  196.     radius = rangey / 3;
  197. //    radius = (framebegin->Attr.Y - axisy);
  198. //    radius = axisx - (pointbegin->Attr.X + pointbegin->Attr.W);
  199.     if (motion == anim->camera || motion == anim->camera->target) {
  200.         framebegin->Show(SW_HIDE);
  201.         frameend->Show(SW_HIDE);
  202.         framebegintext->Show(SW_HIDE);
  203.         frameendtext->Show(SW_HIDE);
  204.     }
  205. }
  206.  
  207. static double GetSpeedLimit(double s)
  208. {
  209.     if (s < 1) {
  210.         return 4;
  211.     } else if (s < 3) {
  212.         return (9.0-s)/2.0;
  213.     } else {
  214.         return 9.0 - 2.0 * s;
  215.     }
  216. }
  217.  
  218.  
  219. void TDRange::DrawMarker(TDC& dc)
  220. {
  221.     dc.SetROP2(R2_NOTXORPEN);
  222.     dc.SelectObject(TBrush(cMarkerSpeed));
  223.     dc.SelectObject(TPen(cLineRange));
  224.  
  225.     TPoint p0, p1;
  226.     p0 = GetBezierBegin();
  227.     p1 = GetBezierEnd();
  228.  
  229.     TPoint p0l = GetBezierBegin(GetSpeedLimit(speed[1]));
  230.     TPoint p1l = GetBezierEnd(GetSpeedLimit(speed[0]));
  231.     int x = GetX(begin), y = axisy;
  232.     dc.Arc(x-radius, y-radius, x+radius, y+radius,
  233.            x+radius, y, p0l.x, p0l.y);
  234.     dc.MoveTo(p0l);dc.LineTo(x,y);dc.LineTo(x+radius,y);
  235.     x = GetX(end);
  236.     y = axisy - rangey;
  237.     dc.Arc(x-radius, y-radius, x+radius, y+radius,
  238.            x-radius, y, p1l.x, p1l.y);
  239.     dc.MoveTo(p1l);dc.LineTo(x,y);dc.LineTo(x-radius,y);
  240. //    dc.MoveTo(GetX(begin), axisy);
  241. //    dc.LineTo(p0);
  242. //    dc.MoveTo(GetX(end), axisy-rangey);
  243. //    dc.LineTo(p1);
  244.  
  245.     dc.SelectStockObject(BLACK_PEN);
  246.     dc.Rectangle(p0.x-markersize, p0.y        -markersize, p0.x+markersize, p0.y        +markersize);
  247.     dc.Rectangle(p1.x-markersize, p1.y        -markersize, p1.x+markersize, p1.y        +markersize);
  248.  
  249. }
  250.  
  251. void TDRange::DrawBegin(TDC& dc)
  252. {
  253.     dc.SetROP2(R2_NOTXORPEN);
  254.     dc.SelectObject(TBrush(cMarkerLimit));
  255.     dc.SelectObject(TPen(cMarkerLimitLine));
  256.  
  257.     int x0 = GetX(begin);
  258.  
  259.     dc.Rectangle(x0-markersize, axisy+markersize*2, x0+markersize, axisy+markersize*4);
  260.  
  261.     dc.SelectObject(TPen(cLimit));
  262.  
  263.     dc.MoveTo(x0, axisy - rangey);
  264.     dc.LineTo(x0, axisy + markersize*3);
  265.     dc.LineTo(x0 + markersize*5, axisy + markersize*3);
  266.     dc.LineTo(x0 + markersize*4, axisy + markersize*2);
  267.     dc.MoveTo(x0 + markersize*5, axisy + markersize*3);
  268.     dc.LineTo(x0 + markersize*4, axisy + markersize*4);
  269.  
  270.     if (lastbegin != x0) {
  271.         dc.SelectObject(TBrush(cRangeOutside));
  272.         dc.SelectObject(TPen(cRangeOutside));
  273.         dc.Rectangle(lastbegin-1, axisy-rangey, x0-1, axisy);
  274.         lastbegin = x0;
  275.     }
  276.  
  277. }
  278.  
  279. void TDRange::DrawEnd(TDC& dc)
  280. {
  281.     dc.SetROP2(R2_NOTXORPEN);
  282.     dc.SelectObject(TBrush(cMarkerLimit));
  283.     dc.SelectObject(TPen(cMarkerLimitLine));
  284.  
  285.     int x0 = GetX(end);
  286.     int x1 = GetX(begin);
  287.  
  288.     if (x1 != x0) {
  289.         dc.Rectangle(x0-markersize, axisy+markersize*2, x0+markersize, axisy+markersize*4);
  290.     }
  291.  
  292.     dc.SelectObject(TPen(cLimit));
  293.  
  294.     if (x1!=x0) {
  295.         dc.MoveTo(x0, axisy - rangey);
  296.         dc.LineTo(x0, axisy + markersize*3);
  297.     } else {
  298.         dc.MoveTo(x0, axisy + markersize*3);
  299.     }
  300.     dc.LineTo(x0 - markersize*5, axisy + markersize*3);
  301.     dc.LineTo(x0 - markersize*4, axisy + markersize*2);
  302.     dc.MoveTo(x0 - markersize*5, axisy + markersize*3);
  303.     dc.LineTo(x0 - markersize*4, axisy + markersize*4);
  304.  
  305.     if (lastend != x0) {
  306.         dc.SelectObject(TBrush(cRangeOutside));
  307.         dc.SelectObject(TPen(cRangeOutside));
  308.         dc.Rectangle(x0+1, axisy-rangey, lastend+1, axisy);
  309.         lastend = x0;
  310.     }
  311.  
  312. }
  313.  
  314. void TDRange::DrawLine(TDC& dc)
  315. {
  316.     int x0, x1;
  317.     x0 = GetX(begin);
  318.     x1 = GetX(end);
  319.  
  320.     dc.SelectObject(TPen(cLine));
  321.  
  322.     dc.MoveTo(x1, axisy);
  323.  
  324.     double t, tstep;
  325.     int x;
  326.     int count;
  327.     static const int xstep = 4;
  328.     count = (x1 - x0)/xstep;
  329.     if (count > 0) {
  330.         tstep = 1.0 / (double)(count);
  331.     } else {
  332.         tstep = 0;
  333.     }
  334.     x = x0;
  335.     t = 0;
  336.  
  337.     double b, c;
  338.     b =       speed[0] / 3.0;
  339.     c = 1.0 - speed[1] / 3.0;
  340.     dc.MoveTo(x0, axisy);
  341.     for (int i = count-1; i > 0; --i) {
  342.         x += xstep;
  343.         t += tstep;
  344.         double ny;
  345.         ny =  + 3 * b *      t  * (1.0-t) * (1.0-t)
  346.               + 3 * c *      t  *      t  * (1.0-t)
  347.               +     1 *      t  *      t  *      t;
  348.         if (ny < 0) ny = 0;
  349.         if (ny > 1.0) ny = 1.0;
  350.         dc.LineTo(x, axisy - ny * rangey);
  351.     }
  352.     dc.LineTo(x1, axisy - rangey);
  353.     dc.SelectObject(TPen(cLineSpeed));
  354. }
  355.  
  356. void TDRange::Draw(void)
  357. {
  358.     if (BEGINFRAME >= ENDFRAME) {
  359.         return;
  360.     }
  361.     TClientDC dc(*this);
  362.  
  363.     if (motion->motiondata != NULL) {
  364.         DrawMarker(dc);
  365.         DrawLine(dc);
  366.     }
  367.     if (motion != anim->camera && motion != anim->camera->target) {
  368.         DrawBegin(dc);
  369.         DrawEnd(dc);
  370.     }
  371. }
  372.  
  373. void TDRange::MoveBegin(void)
  374. {
  375.     char str[8];
  376.     int x0 = GetX(begin);
  377.     sprintf(str, "%d", begin);
  378.     framebegin->SetText("");
  379.     framebegin->MoveWindow(x0-framebegin->Attr.W, framebegin->Attr.Y,
  380.                         framebegin->Attr.W, framebegin->Attr.H);
  381.     framebegin->SetText(str);
  382.  
  383.     int x1 = GetX(end);
  384.     int step = 0;
  385.     if ((x1 - x0 - 2) < framebegintext->Attr.W) {
  386.         step = (x1 - x0 - 2)/2;
  387.     } else {
  388.         step = framebegintext->Attr.W/2;
  389.     }
  390.  
  391.     framebegintext->SetText("");
  392.     framebegintext->MoveWindow(x0 + step - framebegintext->Attr.W,
  393.                         framebegintext->Attr.Y,
  394.                         framebegintext->Attr.W,
  395.                         framebegintext->Attr.H);
  396.     framebegintext->SetText("出現時刻");
  397.  
  398.     if (x1-step != frameendtext->Attr.X) {
  399.         frameendtext->SetText("");
  400.         frameendtext->MoveWindow(x1-step, frameendtext->Attr.Y,
  401.                             frameendtext->Attr.W, frameendtext->Attr.H);
  402.         frameendtext->SetText("消失時刻");
  403.     }
  404. }
  405.  
  406. void TDRange::MoveEnd(void)
  407. {
  408.     char str[8];
  409.     int x1 = GetX(end);
  410.     sprintf(str, "%d", end);
  411.     frameend->SetText("");
  412.     frameend->MoveWindow(x1, frameend->Attr.Y,
  413.                         frameend->Attr.W, frameend->Attr.H);
  414.     frameend->SetText(str);
  415.  
  416.     int x0 = GetX(begin);
  417.     int step = 0;
  418.     if ((x1 - x0 - 2) < framebegintext->Attr.W) {
  419.         step = (x1 - x0 - 2)/2;
  420.     } else {
  421.         step = framebegintext->Attr.W/2;
  422.     }
  423.  
  424.     if (x0+step != framebegintext->Attr.X) {
  425.         framebegintext->SetText("");
  426.         framebegintext->MoveWindow(x0 + step - framebegintext->Attr.W,
  427.                             framebegintext->Attr.Y,
  428.                             framebegintext->Attr.W,
  429.                             framebegintext->Attr.H);
  430.         framebegintext->SetText("出現時刻");
  431.     }
  432.  
  433.     frameendtext->SetText("");
  434.     frameendtext->MoveWindow(x1-step, frameendtext->Attr.Y,
  435.                         frameendtext->Attr.W, frameendtext->Attr.H);
  436.     frameendtext->SetText("消失時刻");
  437. }
  438.  
  439. void TDRange::Redraw(void)
  440. {
  441.     int i;
  442.  
  443.     TClientDC dc(*this);
  444.  
  445.     dc.SelectStockObject(WHITE_PEN);
  446. //    dc.SelectObject(TPen(TColor::LtGray));
  447. //    dc.SelectObject(TBrush(TColor::LtGray));
  448.     dc.Rectangle(axisx - 2          - markersize, axisy + 2          + markersize*4,
  449.                  axisx + 2 + rangex + markersize, axisy - 2 - rangey - markersize*4);
  450.     dc.SelectStockObject(BLACK_PEN);
  451.  
  452.     dc.MoveTo(axisx-2         , axisy+2         );
  453.     dc.LineTo(axisx+2 + rangex, axisy+2         );
  454.     dc.LineTo(axisx+2 + rangex, axisy-2 - rangey);
  455.     dc.LineTo(axisx-2         , axisy-2 - rangey);
  456.     dc.LineTo(axisx-2         , axisy+2         );
  457.  
  458.     dc.SelectObject(TPen(cGrid));
  459.     int step = 500;
  460.     int frames = ENDFRAME - BEGINFRAME;
  461.     if (frames * (markersize*4) < rangex) {
  462.         step = 1;
  463.     } else if ((frames/5) * (markersize*4) < rangex) {
  464.         step = 5;
  465.     } else if ((frames/10) * (markersize*4) < rangex) {
  466.         step = 10;
  467.     } else if ((frames/50) * (markersize*4) < rangex) {
  468.         step = 50;
  469.     } else if ((frames/100) * (markersize*4) < rangex) {
  470.         step = 100;
  471.     } else if ((frames/500) * (markersize*4) < rangex) {
  472.         step = 500;
  473.     } else if ((frames/1000) * (markersize*4) < rangex) {
  474.         step = 1000;
  475.     }
  476.     for (i = BEGINFRAME; i < ENDFRAME; i ++) {
  477.         if (i % step == 0) {
  478.             int x = GetX(i);
  479.             dc.MoveTo(x, axisy         );
  480.             dc.LineTo(x, axisy - rangey);
  481.         }
  482.     }
  483.     for (i = 10; i < 100; i+=10) {
  484.         int y = axisy - rangey * i / 100;
  485.         dc.MoveTo(axisx , y);
  486.         dc.LineTo(axisx + rangex , y);
  487.     }
  488.     MoveBegin();
  489.     MoveEnd();
  490.  
  491.     lastbegin = axisx-1;
  492.     lastend = axisx + rangex+1;
  493.     if (BEGINFRAME < ENDFRAME) {
  494.         Draw();
  495.     }
  496. }
  497.  
  498.  
  499. void TDRange::Paint (TDC& dc, BOOL erase, TRect& rect)
  500. {
  501.     TDialog::Paint(dc, erase, rect);
  502.  
  503.     // INSERT>> 追加のコードはここに
  504.     Redraw();
  505. }
  506.  
  507. static int dist(TPoint& p1, TPoint& p2)
  508. {
  509.     int dist;
  510.     TPoint p = p1 - p2;
  511.     if (p.x < 0) {
  512.         dist = -p.x;
  513.     } else {
  514.         dist = p.x;
  515.     }
  516.     if (p.y < 0) {
  517.         dist += -p.y;
  518.     } else {
  519.         dist += p.y;
  520.     }
  521.     return dist;
  522. }
  523.  
  524. void TDRange::EvLButtonDown (UINT modKeys, TPoint& point)
  525. {
  526.     TDialog::EvLButtonDown(modKeys, point);
  527.  
  528.     // INSERT>> 追加コードはここに
  529.  
  530.     if (BEGINFRAME >= ENDFRAME) {
  531.         return;
  532.     }
  533.     dragflag = DRAG_NONE;
  534.  
  535.     if (motion != anim->camera && motion != anim->camera->target) {
  536.         if (dist(TPoint(GetX(begin), axisy+markersize*3), point) < markersize*2) {
  537.             dragflag = DRAG_BEGIN;
  538.             SetCapture();
  539.             return;
  540.         }
  541.         if (dist(TPoint(GetX(end),   axisy+markersize*3), point) < markersize*2) {
  542.             dragflag = DRAG_END;
  543.             SetCapture();
  544.             return;
  545.         }
  546.     }
  547.     if (motion->motiondata != NULL) {
  548.         if (dist(GetBezierBegin(), point) < markersize * 2) {
  549.             dragflag = DRAG_SPEED_BEGIN;
  550.             return;
  551.         }
  552.  
  553.         if (dist(GetBezierEnd(), point) < markersize * 2) {
  554.             dragflag = DRAG_SPEED_END;
  555.             return;
  556.         }
  557.     }
  558. }
  559.  
  560.  
  561. void TDRange::EvMouseMove (UINT modKeys, TPoint& point)
  562. {
  563.     TDialog::EvMouseMove(modKeys, point);
  564.  
  565.     // INSERT>> 追加コードはここに
  566.  
  567.     if (dragflag == DRAG_NONE) {
  568.         return;
  569.     }
  570.     int t = (int)((double)(ENDFRAME - BEGINFRAME) * (double)(point.x - axisx) / (double)rangex) + BEGINFRAME;
  571.     int t2;
  572.     double s;
  573.  
  574.     Draw();
  575.     switch(dragflag) {
  576.     case DRAG_BEGIN:
  577.         if (t < BEGINFRAME) t = BEGINFRAME;
  578.         t2 = end;
  579.         if (motion->motiondata == NULL && t > end) {
  580. //               t = end;
  581.             if (t <= ENDFRAME) {
  582.                 t2 = t;
  583.             } else {
  584.                 t2 = t = ENDFRAME;
  585.             }
  586.         } else if (motion->motiondata != NULL && t >= end) {
  587. //            t = end-1;
  588.             if (t <= ENDFRAME-1) {
  589.                 t2 = t+1;
  590.             } else {
  591.                 t2 = ENDFRAME;
  592.                 t = ENDFRAME-1;
  593.             }
  594.         }
  595.         if (t != begin) {
  596.             begin = t;
  597.             MoveBegin();
  598.         }
  599.         if (t2 != end) {
  600.             end = t2;
  601.             MoveEnd();
  602.         }
  603.         break;
  604.     case DRAG_END:
  605.         if (t > ENDFRAME) t = ENDFRAME;
  606.         t2 = begin;
  607.         if (motion->motiondata == NULL && t < begin) {
  608. //            t = begin;
  609.             if (t >= BEGINFRAME) {
  610.                 t2 = t;
  611.             } else {
  612.                 t2 = t = BEGINFRAME;
  613.             }
  614.         } else if (motion->motiondata != NULL && t <= begin) {
  615. //            t = begin+1;
  616.             if (t >= BEGINFRAME + 1) {
  617.                 t2 = t-1;
  618.             } else {
  619.                 t2 = BEGINFRAME;
  620.                 t = BEGINFRAME+1;
  621.             }
  622.         }
  623.         if (t2 != begin) {
  624.             begin = t2;
  625.             MoveBegin();
  626.         }
  627.         if (t != end) {
  628.             end = t;
  629.             MoveEnd();
  630.         }
  631.         break;
  632.     case DRAG_SPEED_BEGIN:
  633.         s = GetSpeedBegin(point);
  634.         if (s > (t = GetSpeedLimit(speed[1]))) s = t;
  635.         if (s < 0.0) s = 0.0;
  636.         speed[0] = s;
  637.         break;
  638.     case DRAG_SPEED_END:
  639.         s = GetSpeedEnd(point);
  640.         if (s > (t = GetSpeedLimit(speed[0]))) s = t;
  641.         if (s < 0.0) s = 0.0;
  642.         speed[1] = s;
  643.         break;
  644.     }
  645.     Draw();
  646. }
  647.  
  648. void TDRange::EvLButtonUp (UINT modKeys, TPoint& point)
  649. {
  650.     TDialog::EvLButtonUp(modKeys, point);
  651.  
  652.     dragflag = DRAG_NONE;
  653.     ReleaseCapture();
  654. }
  655.  
  656.  
  657. void TDRange::CmOK ()
  658. {
  659.     // INSERT>> 追加コードはここに
  660.  
  661.     if (motion != anim->camera && motion != anim->camera->target) {
  662.         motion->beginframe = begin;
  663.         motion->endframe = end;
  664.     }
  665.     if (motion->motiondata != NULL) {
  666.         motion->motiondata->speed[0] = speed[0];
  667.         motion->motiondata->speed[1] = speed[1];
  668.     }
  669.  
  670.     CloseWindow(IDOK);
  671. }
  672.  
  673.  
  674. void TDRange::EvPaint ()
  675. {
  676.     TDialog::EvPaint();
  677.  
  678.     // INSERT>> 追加コードはここに
  679.  
  680.     Redraw();
  681. }
  682.  
  683.  
  684. void TDRange::HelpClicked ()
  685. {
  686.     // INSERT>> 追加コードはここに
  687.     anim->WinHelp(HELP_KEY, (DWORD)"速度調整グラフの使い方");
  688. }
  689.  
  690.