У меня изначально был элемент управления ActiveX, который зарегистрировал таймер Windows (с SetTimer()
), который срабатывает каждые несколько секунд. До сих пор это работало нормально. Теперь, чтобы реализовать полноэкранный режим, я добавил в свой элемент управления дочернее окно, которое должно отображать содержимое, а сам элемент управления управляет всеми элементами ActiveX.
Проблема, с которой я столкнулся при таком подходе, заключается в том, что мой WM_TIMER внезапно перестает запускаться через некоторое время. Я проследил это до UIDeactivate()
вызывается на моем контроле, но я не знаю, почему этот метод вызывается (я думаю, что это связано с потерей фокуса), когда он не был вызван раньше.
Я также хотел бы знать, почему мои события WM_TIMER внезапно прекращаются, в то время как все остальное, кажется, работает нормально. И что это может делать с отображением содержимого в дочернем окне вместо самого элемента управления ActiveX?
Таймеры останавливается по причине. Который может быть:
KillTimer
вызовHWND
справитьсяWM_TIMER
сообщения, которые вы включили ранееЧто нужно сделать — без дополнительной информации по данному вопросу на руках:
WM_TIMER
отсутствует, или они просто не доходят до вашего кода; также вы можете увидеть другие интересные сообщения вокругВот выдержка из реализации ATL CComControlBase
(Я полагаю, что ваш контроль наследует от этого). Проверьте часть, отмеченную <<<<<<<<<<<
:
inline HRESULT CComControlBase::IOleInPlaceObject_InPlaceDeactivate(void)
{
if (!m_bInPlaceActive)
return S_OK;
if(m_bUIActive) {
CComPtr<IOleInPlaceObject> pIPO;
ControlQueryInterface(__uuidof(IOleInPlaceObject), (void**)&pIPO);
ATLENSURE(pIPO != NULL);
pIPO->UIDeactivate();
}
m_bInPlaceActive = FALSE;
// if we have a window, tell it to go away.
//
if (m_hWndCD)
{
ATLTRACE(atlTraceControls,2,_T("Destroying Window\n"));
if (::IsWindow(m_hWndCD))
DestroyWindow(m_hWndCD); <<<<<<<<<<<<<<<<<<<<<<<<<<<
m_hWndCD = NULL;
}
if (m_spInPlaceSite)
m_spInPlaceSite->OnInPlaceDeactivate();
return S_OK;
}
При деактивации окно управления разрушается. Поэтому он больше не может обрабатывать WM_TIMER.