Добавление новых свойств, методов и событий в элемент ActiveX MyCtrl.
Давайте усложним наш элемент 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:
void CMyCtrlCtrl::OnClose()
{
if ( timerOn )
{
KillTimer( idTimer );
timerOn =FALSE;
}
CWnd::OnClose();
}
Используя ClassWizard, добавьте обработчик события WM_TIMER в класс CMyCtrlCtrl.
void CMyCtrlCtrl::OnTimer(UINT nIDEvent)
{
m_tick++;
SetModifiedFlag();
InvalidateControl();
COleControl::OnTimer(nIDEvent);
}
Здесь m_tick – переменная, добавленная в класс CMyCtrlCtrl для подсчета тиков таймера:
ULONG m_tick;
Метод просто изменяет значение переменной m_tick и вызывает перерисовку элемента.
Для вывода значения m_tick измените метод отрисовки элемента OnDraw - добавьте в конец его строки:
CString strTick;
strTick.Format("%d",m_tick);
pdc->ExtTextOut((rcBounds.left + rcBounds.right)/2,(rcBounds.top + tm.tmHeight),
ETO_CLIPPED, rcBounds, strTick, strTick.GetLength(),NULL);
Эти строки выведут значение m-tick в верхней строке элемента.