Листинг 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();}
Вернуться к статье
|