Страница 1 из 1

OnIdle в Dialog based и SDI

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

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

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

Добавлено: 19 июл 2004, 17:06
Eugie
Просто у dialog based приложения нет обработчика события OnIdle (класс CDialog не является наследником CWinApp).

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

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

Добавлено: 20 июл 2004, 12:42
Borys
Как же так получается. Мне неплохо бы перерисовывать CView на диалоге, там OpenGL анимация, я хотел это делать на OnIdle, в SDI это получалось, а теперь наверное единственный выход -- перерисовывать через SetTimer? Что скажите?

Добавлено: 20 июл 2004, 16:46
Eugie
Вообще-то есть метод CView::OnDraw, специально предназначенный для рисования.

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

Добавлено: 21 июл 2004, 16:27
Borys
Это все, что я хотел прочитать. Казалось, это делается как-то по-другому, более просто.
Спасибо всем.