В чем «противоположность» OnSetActive ()? - PullRequest
1 голос
/ 18 января 2012

У меня есть куча PropertyPages, связанных вместе с PropertyPage (для создания представления с вкладками). одна из этих страниц запускает таймер внутри своего метода OnSetActive (), чтобы обновить некоторую информацию о состоянии. Теперь я хочу, чтобы этот таймер остановился, если я покину эту вкладку и поменяю свое мнение. какое событие вызывается после «выхода» из вкладки? я пробовал OnKillActive (), OnClose (), OnKillFocus (), но ни один из них не работает должным образом. есть идеи?

Ответы [ 4 ]

3 голосов
/ 18 января 2012

Согласно документации, OnKillActive должен быть именно тем, что вы ищете.Если вы поставили точку останова в функции, вы ее нажали?

Как правило, когда вы покидаете вкладку, вкладка все еще жива и ждет в фоновом режиме.Вы можете продолжать ждать сообщения таймера и просто игнорировать его, если вы не активная вкладка.

Редактировать: вы говорите в комментариях, что OnKillActive не вызывается.Одна из приятных сторон MFC заключается в том, что Microsoft предоставляет вам исходный код для просмотра;вызов OnKillActive генерируется в CPropertyPage :: OnNotify.Есть пара условий, которые заставили бы его возвратиться рано, прежде чем достигнуть этой точки.Одним из них является вызов CDialog :: OnNotify, в котором есть подозрительный комментарий «разрешить переопределение карты сообщений».Это означает, что если у вас есть собственный обработчик OnNotify для WM_NOTIFY и он возвращает TRUE, обработка по умолчанию будет пропущена.

0 голосов
/ 19 января 2012

хорошо, мы нашли рабочее решение

void Status::OnShowWindow(BOOL bShow, UINT nStatus) {
    if (bShow == 0) {
        selectedDevice= NULL;   
        KillTimer(TIMER_ID);            }
    CMFCPropertyPage::OnShowWindow(bShow, nStatus);
}

OnShowWindow() вызывается либо при входе и выходе со страницы, «BShow» - актуальный статус (true при входе, false при выходе)

OnShowWindow() объявляется как afx_msg и запускается событием ON_WM_SHOWWINDOW

спасибо за вашу помощь

0 голосов
/ 18 января 2012

Функция, которую вы ищете: virtual BOOL OnKillActive() Она вызывается на вкладке, которую вы покидаете, прежде чем активировать другую страницу. Здесь, на работе, мы используем ее, чтобы проверить, может ли пользователь изменить страницу и предотвратить ее изменение с помощьювозвращая false.

Если событие не сработало, возможно, вы можете посмотреть в своем заголовочном файле, если вы отметили OnKillActive как виртуальное.Если вы этого не сделали, событие не сработает.

0 голосов
/ 18 января 2012

Почему бы просто не иметь таймер, который срабатывает периодически, как у вас уже есть, и в обратном вызове таймера получить текущую активную вкладку и обновить при необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...