Я пишу приложение под Document\View. Нужно через определённые интервалы времени дорисовывать кое что, например, в CMyView : public CView. Т.е что-то вроде игры. Параметры того что выводится могут быть изменены с помощью мыши или клавы. Вывод начинается по нажатии кнопки на ToolBar (вызывается CreateTimer) и производится в OnTimer. Проблема: в один прекрасный момент указатель на CDC, доставаемый в OnTimer, портится и и приложение падает на отрисовке в этой ф-ии с ошибкой "память не может быть прочтена".
Если кто знает подскажите пожалуста как правильно проводить динамическую отрисовку и синхронизировать её с обработкой событий от мыши и клавы.
wrote in message news:634452@news.rsdn.ru... > Я пишу приложение под Document\View. Нужно через определённые интервалы времени дорисовывать кое что, например, в CMyView : public CView. Т.е что-то вроде игры. Параметры того что выводится могут быть изменены с помощью мыши или клавы. Вывод начинается по нажатии кнопки на ToolBar (вызывается CreateTimer) и производится в OnTimer. Проблема: в один прекрасный момент указатель на CDC, доставаемый в OnTimer, портится и и приложение падает на отрисовке в этой ф-ии с ошибкой "память не может быть прочтена". > Если кто знает подскажите пожалуста как правильно проводить динамическую отрисовку и синхронизировать её с обработкой событий от мыши и клавы.
как получаешь контекст ? GetDC() ?
а потом делаешь ему ReleaseDC() ? или у тебя контекст приватный ?
покажи код — тогда можно будет точнее сказать
Здравствуйте, Аноним, Вы писали:
А> Проблема: в один прекрасный момент указатель на CDC, доставаемый в OnTimer, портится ...
Насколько мне известно — CDC* к событию таймер не имеет никакого отношения. Что можно сделать для перерисовки в этом обработчике — так это изменить параметры прорисовки — а затем вызвать Invalidate
Re[2]: CDC и OnTimer
От:
Аноним
Дата:
11.05.04 07:13
Оценка:
Здравствуйте, aeroteam, Вы писали:
A>как получаешь контекст ? GetDC() ?
да A>а потом делаешь ему ReleaseDC() ? или у тебя контекст приватный ?
не делаю A>покажи код — тогда можно будет точнее сказать
код в самом простейшем случае просто сгенерираван визардом (это сути не меняет) MFC AppWizard (exe)/Sigle Document/.../MFC Standard
Re[2]: CDC и OnTimer
От:
Аноним
Дата:
11.05.04 07:16
Оценка:
Здравствуйте, AlexEagle, Вы писали:
AE>Здравствуйте, Аноним, Вы писали:
А>> Проблема: в один прекрасный момент указатель на CDC, доставаемый в OnTimer, портится ...
AE>Насколько мне известно — CDC* к событию таймер не имеет никакого отношения.
К событию таймер нет, но его используют у меня и другие обработчики событий (от мыши) видимо возникает конфликт.
Здравствуйте, Аноним, Вы писали:
А>К событию таймер нет, но его используют у меня и другие обработчики событий (от мыши) видимо возникает конфликт.
вообще правильно чтобы CDC использоватлся только в OnPaint (OnDraw) — а все остальные события только влияли на параметры перерисовки и заставляли окно перерисовываться (Invalidate)
Re[4]: CDC и OnTimer
От:
Аноним
Дата:
11.05.04 07:24
Оценка:
Здравствуйте, AlexEagle, Вы писали:
AE>вообще правильно чтобы CDC использоватлся только в OnPaint (OnDraw) — а все остальные события только влияли на параметры перерисовки и заставляли окно перерисовываться (Invalidate)
Попробуй делать с частотой 20 мс Invalidate. Посмотри что получится
> Здравствуйте, aeroteam, Вы писали: > A>а потом делаешь ему ReleaseDC() ? или у тебя контекст приватный ? > не делаю
В MSDN написано : Unless the device context belongs to a window class, the ReleaseDC member function must be called to release the context after painting. То есть, после получения контекста и рисования на нём ты ДООЛЖЕН вызвать ReleaseDС() иначе у тебя текут ресурсы...
Опят же — это при условии, что контекст не приватный.
Здравствуйте, Аноним, Вы писали:
А> Попробуй делать с частотой 20 мс Invalidate. Посмотри что получится
Ну пробуй частичную перерисовку (InvalidateRgn). И так, ради инетереса, а что вообще за задача такая, если игра то лучше пробуй OpenGL — проще будет
Re[4]: CDC и OnTimer
От:
Аноним
Дата:
11.05.04 07:49
Оценка:
Здравствуйте, aeroteam, Вы писали:
A>В MSDN написано : Unless the device context belongs to a window class, the ReleaseDC member function must be called to release the context after painting. То есть, после получения контекста и рисования на нём ты ДООЛЖЕН вызвать ReleaseDС() иначе у тебя текут ресурсы... A>Опят же — это при условии, что контекст не приватный.
Спасибо, начал делать ReleaseDС, вроде не падает