ActiveX с нуля

         

Добавление новых свойств, методов и событий в элемент 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 в верхней строке элемента.


Содержание раздела