OnIdle в Dialog based и SDI

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Borys
Сообщения: 18
Зарегистрирован: 09 июл 2004, 17:25
Откуда: Киев

Проблема заключается в следующем: хотелось бы, чтоб в dialog based приложении выполнялись некоторые операции когда нечего делать. Я добавляю в мой наследник класса CWinApp обработчик событий OnIdle премерно таким образом:

Код: Выделить всё

BOOL CTempApp::OnIdle(LONG lCount) 
{
	TRACE(_T("Idle"));
	AfxMessageBox("Idle");
	return 1;
	//return CWinApp::OnIdle(lCount);
}
В итоге получается, что OnIdle никогда не вызывается. Интересно то, что если сделать то же на SDI -- там все работает.
Какие есть соображения по этому поводу?
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Просто у dialog based приложения нет обработчика события OnIdle (класс CDialog не является наследником CWinApp).
Borys
Сообщения: 18
Зарегистрирован: 09 июл 2004, 17:25
Откуда: Киев

Я наверное не очень понятно написал, сорри.
В dialog based приложении, помимо наследника CDialog, есть наследник класса CWinApp, который и инициализирует диалог (например как у меня class CTestApp : public CWinApp).
Именно в него я и добавляю BOOL CTestApp::OnIdle(LONG lCount). Причем добавляю стандартными методами, через Ctrl+W -> MessageMaps, там есть OnIdle.
Так вот: в dialog based эта функция никогда не вызывается. А в SDI, в котором есть такой же наследник CWinApp, все работает нормально, функция вызывается.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Дело в том, что у dialog based приложения главное окно модальное, т.е. имеет собственную очередь сообщений (не связанную с очередью CWinApp), а она не обрабатывает OnIdle. Если бы этот модальный диалог не был одновременно главным окном приложения, то можно было бы ловить в его окне-владельце сообщение WM_ENTERIDLE - станд.метод для модальных диалогов. А так, боюсь, не получится.
Borys
Сообщения: 18
Зарегистрирован: 09 июл 2004, 17:25
Откуда: Киев

Как же так получается. Мне неплохо бы перерисовывать CView на диалоге, там OpenGL анимация, я хотел это делать на OnIdle, в SDI это получалось, а теперь наверное единственный выход -- перерисовывать через SetTimer? Что скажите?
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Вообще-то есть метод CView::OnDraw, специально предназначенный для рисования.
DeeJayC
Сообщения: 497
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

Borys писал(а):Как же так получается. Мне неплохо бы перерисовывать CView на диалоге, там OpenGL анимация, я хотел это делать на OnIdle, в SDI это получалось, а теперь наверное единственный выход -- перерисовывать через SetTimer? Что скажите?
Я перерисовываю OpenGL на диалоге именно через SetTimer.
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC
Borys
Сообщения: 18
Зарегистрирован: 09 июл 2004, 17:25
Откуда: Киев

Это все, что я хотел прочитать. Казалось, это делается как-то по-другому, более просто.
Спасибо всем.
Ответить