Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потеря HDC при сворачивании окна 
V
    Опции темы
ANTON_AL
Дата 4.2.2008, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Доброго дня!


Есть объект класса CImage, который используется в качестве заднего буффера для окна, для того, чтобы убрать мерцание при перерисовке. Получив CDC объекта этого класса, в него рисуется вся графика, а потом выводится на экран по сообщению WM_PAINT
Код

CImage img; //Back buffer

CDC *pDC = CDC::FromHandle( img.GetDC() );

//Draw to back buffer . . .
pDC->BitBlt( /*. . .*/ );



Всё работает отлично, но, когда минимизирую окно (minimize), а потом восстанавливаю (restore), то выбрасывается  Access violation reading location 0xfeeefeee.
Посмотрев в отладчике, вижу, что этот адрес имеет CDC::m_hDC, и CDC::m_hAttribDC. . . 

Вероятно, что при сворачивании окна теряется Device Context. . . Вот и возникает задача - как это определить ??

Это сообщение отредактировал(а) ANTON_AL - 4.2.2008, 17:40
PM MAIL   Вверх
Nuzur
Дата 4.2.2008, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



ANTON_AL, Сейчас под руками нет доков но тав вроде надо использовать что то в духе GetSafeHandle, вроде так smile


--------------------
Never again...
PM MAIL   Вверх
ANTON_AL
Дата 4.2.2008, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Не помогает, этот метод возвращает такой же мусор 0xfeeefeee
PM MAIL   Вверх
dizzy1984
Дата 5.2.2008, 06:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



А ты уверен что так можно? Просто обычно двойню буферизацию организуют через CBitmap.
Вот посмотри эту ссылку. Можно еще много примеров найти если поискать.
PM MAIL   Вверх
ANTON_AL
Дата 5.2.2008, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
Rapalex
Дата 6.2.2008, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

Репутация: 6
Всего: 8



ANTON_AL, двойной буфер нужно делать через CBitmap. А когда перепишеш код готов поспорить всё заработает.
У меня же нет таких проблем  smile 


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Earnest
Дата 6.2.2008, 15:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(ANTON_AL @  5.2.2008,  20:34 Найти цитируемый пост)
Если кратко, то задача такая: есть объект класса CDC, который инициализирован любыми ( даже просто левыми) значениями. Необходимо определить, корректный ли это объект или нет.

Нереально.
Что касается вопроса, то ты несовсем корректно делаешь. После использования DC, полученного вызовом GetDC нужно обязательно его особождать, вызывая ReleaseDC. Т.е. контекст нужно все время пересоздавать - его нельзя хранить между сообщениями.


--------------------
...
PM   Вверх
Alexeis
Дата 6.2.2008, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 3
Всего: 459



Цитата(Earnest @  6.2.2008,  14:20 Найти цитируемый пост)
Т.е. контекст нужно все время пересоздавать - его нельзя хранить между сообщениями.

  Точно! Даже более того, в обработчике WM_PAINT его нужно каждый раз получать, а по окончанию работы обработчика каждый раз уничтожать.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MTWizard
Дата 7.2.2008, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 8.10.2007
Где: Київ

Репутация: нет
Всего: 4



Цитата(Earnest @  6.2.2008,  15:20 Найти цитируемый пост)
Т.е. контекст нужно все время пересоздавать - его нельзя хранить между сообщениями.

Я тоже так делал, но из-за этого в осносном и наблюдались тормоза при перерисовке (((

Я поступил по-другому: в OnInitDialog получил CDC* через GetDC(), у него взял HDC и к нему "прицепился" своим CDC, который является членом класса окна и уже не пропадёт.
Просто те CDC, которые получены через GetDC, явлются временными и MFC их может грохнуть когда угодно. Но их HDC - не временный, а настоящий HDC окна и к нему можно цепляться на сколько угодно времени.

PM MAIL   Вверх
Alexeis
Дата 7.2.2008, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 3
Всего: 459



Цитата(MTWizard @  7.2.2008,  08:36 Найти цитируемый пост)
Я тоже так делал, но из-за этого в осносном и наблюдались тормоза при перерисовке (((

  Больше чем уверен, что тормоза из-за чего-то другого. Так делают все. Эти правила писаны мелкомягкими. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ANTON_AL
Дата 7.2.2008, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Earnest, 
Alexeis, 
Спасибо огромное, вот этот нюанс я как раз упустил. Теперь всё работает без глюков.



MTWizard, да, у меня идет постоянная загрузка на 50% при этом. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0577 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.