Давайте усложним наш элемент ActiveX. Добавим таймер в элемент, который будет включен при загрузке элемента, сможет отключаться при управлении со стороны контейнера, интервал между включениями таймера будет изменяться при настройке элемента через страницу свойств. При срабатывании таймера пусть в элементе отображается счетчик. При этом в контейнер будут передаваться события – нотификационные сообщения.
Добавление пользовательского свойства Sleep – задержки между срабатываниями таймера не должно вызвать у Вас затруднений. Пусть задание значения этого свойства выполняется через методы Set/Get, тип свойства – long. В классе CmyCtrlCtrl добавьте переменную типа long m_timeSleep, измените методы Get/Set, как показано ниже:
long CMyCtrlCtrl::GetSleep()
{
return m_timeSleep;
}
void CMyCtrlCtrl::SetSleep(long nNewValue)
{
m_timeSleep = nNewValue;
SetModifiedFlag();
}
Добавьте в функцию CMyCtrlCtrl::DoPropExchange следующую строку, обеспечивающую сохранение свойства Sleep:
PX_Long(pPX, _T("Sleep"), m_timeSleep, 1000);
Добавьте в страницу свойств элемента элемент типа редактирования для задания численного значения m_timeSleep и свяжите его со свойством Sleep.
Для добавления таймера включите в класс CMyCtrlCtrl переменные
UINT idTimer; // для идентификатора таймера
BOOL timerOn; // для определения состояния таймера – включен.отключен.
Установку таймера нужно добавить не в конструкторе, а в методе по обработке сообщения WM_CREATE. Для обработки этого сообщения используйте ClassWizard:
#define ID_TIMER 1001 //идентификатор таймера
int CMyCtrlCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;
idTimer = SetTimer( ID_TIMER, m_timeSleep, NULL );
timerOn = FALSE;
return 0;
}
Удаление таймера можно выполнить при обработке сообщения WM_CLOSE. Добавьте обработчик этого сообщения с помощью ClassWizard: