![]() |
|
|
![]()
|
|
| ANTON_AL |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 292 Регистрация: 27.1.2007 Репутация: нет Всего: нет |
Доброго дня!
Есть объект класса CImage, который используется в качестве заднего буффера для окна, для того, чтобы убрать мерцание при перерисовке. Получив CDC объекта этого класса, в него рисуется вся графика, а потом выводится на экран по сообщению WM_PAINT
Всё работает отлично, но, когда минимизирую окно (minimize), а потом восстанавливаю (restore), то выбрасывается Access violation reading location 0xfeeefeee. Посмотрев в отладчике, вижу, что этот адрес имеет CDC::m_hDC, и CDC::m_hAttribDC. . . Вероятно, что при сворачивании окна теряется Device Context. . . Вот и возникает задача - как это определить ?? Это сообщение отредактировал(а) ANTON_AL - 4.2.2008, 17:40 |
|||
|
||||
| Nuzur |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 4.7.2004 Репутация: 3 Всего: 5 |
ANTON_AL, Сейчас под руками нет доков но тав вроде надо использовать что то в духе GetSafeHandle, вроде так
-------------------- Never again... |
|||
|
||||
| ANTON_AL |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 292 Регистрация: 27.1.2007 Репутация: нет Всего: нет |
Не помогает, этот метод возвращает такой же мусор 0xfeeefeee
|
|||
|
||||
| dizzy1984 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 10 Всего: 25 |
А ты уверен что так можно? Просто обычно двойню буферизацию организуют через CBitmap.
Вот посмотри эту ссылку. Можно еще много примеров найти если поискать. |
|||
|
||||
| ANTON_AL |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 292 Регистрация: 27.1.2007 Репутация: нет Всего: нет |
dizzy1984, да, так можно, я уже сделал. Всё работает через CImage, т.к. никакой разницы нет. Мои действия аналогичны тем, которые в той ветке представлены. Только там создание битмапа происходит каждый раз, при событии OnDraw, а у меня только по необходимости.
При сворачивании окна я ловлю WM_SIZE и делаю CImage::Destroy( ); - т.е. уничтожаю CImage, который является back buffer'ом. При восстановлении окна я заново создаю back buffer ( CImage::Create() ). И всё работает отлично. . . Но такой способ не решает проблему определения правильности DC, а просто предполагается, что потеря произойдёт. Так что вопрос остаётся открытым. Добавлено @ 19:38 Если кратко, то задача такая: есть объект класса CDC, который инициализирован любыми ( даже просто левыми) значениями. Необходимо определить, корректный ли это объект или нет. Думаю, что некая функция типа ValidateDC( ) должна существовать, наверняка ведётся какой нибудь список существующих в данный момент DC. . . Добавлено @ 19:42 Например, в DirectX есть метод IDirect3DDevice9::ValidateDevice(), который используется для аналогичных целей Это сообщение отредактировал(а) ANTON_AL - 5.2.2008, 20:34 |
|||
|
||||
| Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
ANTON_AL, двойной буфер нужно делать через CBitmap. А когда перепишеш код готов поспорить всё заработает.
У меня же нет таких проблем -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Нереально. Что касается вопроса, то ты несовсем корректно делаешь. После использования DC, полученного вызовом GetDC нужно обязательно его особождать, вызывая ReleaseDC. Т.е. контекст нужно все время пересоздавать - его нельзя хранить между сообщениями. -------------------- ... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 3 Всего: 459 |
Точно! Даже более того, в обработчике WM_PAINT его нужно каждый раз получать, а по окончанию работы обработчика каждый раз уничтожать. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| MTWizard |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 8.10.2007 Где: Київ Репутация: нет Всего: 4 |
Я тоже так делал, но из-за этого в осносном и наблюдались тормоза при перерисовке ((( Я поступил по-другому: в OnInitDialog получил CDC* через GetDC(), у него взял HDC и к нему "прицепился" своим CDC, который является членом класса окна и уже не пропадёт. Просто те CDC, которые получены через GetDC, явлются временными и MFC их может грохнуть когда угодно. Но их HDC - не временный, а настоящий HDC окна и к нему можно цепляться на сколько угодно времени. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 3 Всего: 459 |
Больше чем уверен, что тормоза из-за чего-то другого. Так делают все. Эти правила писаны мелкомягкими. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| ANTON_AL |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 292 Регистрация: 27.1.2007 Репутация: нет Всего: нет |
Earnest,
Alexeis, Спасибо огромное, вот этот нюанс я как раз упустил. Теперь всё работает без глюков. MTWizard, да, у меня идет постоянная загрузка на 50% при этом. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |