Листинг 1. HTML-файл для тестирования элемента ActiveX



ATL 2.0 test page for object PolyCtl





>





Вернуться к статье

Листин 2. Модифицированный метод OnDraw

  void CMyClockCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
  {
          // TODO: Replace the following code with your own drawing code.
          int     nX;
          CRect   rcEllipse;
          GetClientRect(&rcEllipse);
          nX = rcEllipse.right - rcEllipse.left;
          while (rcEllipse.right - rcEllipse.left<=nX) {
                  rcEllipse.right++;
                  pdc->FillRect(rcBounds,
          CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
                  pdc->Ellipse(rcEllipse);
          }
          while (rcEllipse.right - rcEllipse.left>=0) {
                  rcEllipse.right--;
                  pdc->FillRect(rcBounds,
          CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
                  pdc->Ellipse(rcEllipse);
          }
  //      Refresh();
  //      pdc->FillRect(rcBounds,
  //      CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
  //      pdc->Ellipse(rcBounds);
  }
Вернуться к статье

Листинг 3. Заголовок класса CEllipseCtrl

class CEllipseCtrl : public COleControl, public LFsaAppl
  {
  ...
  protected:
       bool bIfDraw;
       int  nX;
       CRect     rcEllipse;
       int x1(); int x2();
       void y1(); void y2(); void y3(); void y4();
  ...
       afx_msg void OnTimer(UINT nIDEvent);
       afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  ...
  };
Вернуться к статье

Листинг 4. Методы для работы с таймером

int CEllipseCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
  {
  ...
       SetTimer(1, 0, NULL))
       return 0;
  }
  void CEllipseCtrl::OnTimer (UINT nIDEvent)
  {
  ...
       ((CEllipseApp*)AfxGetApp())->OnIdleFsa(0);
       COleControl::OnTimer(nIDEvent);
  }
Вернуться к статье

Листинг 5. Конструктор класса CEllipseCtrl

extern LArc EllipseTBL[];
  CEllipseCtrl::CEllipseCtrl(): LFsaAppl(EllipseTBL)
  {
  ...
       bIfDraw = false;
       TNetFsa *pNetFsa = ((CEllipseApp*)AfxGetApp())->pNetFsa;
       FLoad(pNetFsa,1);
       pNetFsa->go_task();
  }
Вернуться к статье

Листинг 6. Метод OnDraw класса CEllipseCtrl

  void CEllipseCtrl::OnDraw(
                 CDC* pdc, const CRect& rcBounds, const CRect&rcInvalid)
  {
       if (!bIfDraw) return;
  ...
       pdc->Ellipse(rcEllipse);
  }
Вернуться к статье

Листинг 7. Таблица переходов автомата

static LArc EllipseTBL[] = {
       LArc("E0","E+", "--",    "y1"),
       LArc("E+","E+", "x1",    "y2y4"),
       LArc("E+","E-", "^x1",   "y3y4"),
       LArc("E-","E-", "^x2",   "y3y4"),
       LArc("E-","E+", "x2",    "y2y4"),
       LArc()
    };
Вернуться к статье

Листинг 8. Предикаты и действия автомата

//------------------------------------------------------------------- X
  int CEllipseCtrl::x1()
  {
       return rcEllipse.right - rcEllipse.left <=nX;
  }
  int CEllipseCtrl::x2()
  {
       return rcEllipse.right - rcEllipse.left <=0;
  }
  //------------------------------------------------------------------- y
  void CEllipseCtrl::y1()
  {
       GetClientRect(&rcEllipse);
       nX = rcEllipse.right - rcEllipse.left;
       bIfDraw = true;
  }
  void CEllipseCtrl::y2() { rcEllipse.right++; }
  void CEllipseCtrl::y3() { rcEllipse.right--; }
  void CEllipseCtrl::y4() { Refresh();}
Вернуться к статье
506