![]() |
|
![]() ![]() ![]() |
|
serg405 |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 12.6.2008 Репутация: нет Всего: нет |
Очень активно рисую на окне через OnPaint. И иногда в непредсказуемые моменты прога вилетает на ассерте в функциях рисовани типу FileSolidRect() на проверке
Может ли это быть связано с тем, что я dc я получаю через GetDC(), а не через
Ище перед вылетом прога иногда выводит сообщение как на рисунке ![]() И вот что я вижу в Output.
Странно я ище ни в одном примере не видел чтобы тело onPaint - а брали в try Это сообщение отредактировал(а) serg405 - 6.8.2009, 19:29 |
||||||
|
|||||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Если ты в рисуешь в OnPaint, то контекст все же нужно получать через CPaintDC, причем один раз на рисование. Дело в том, что не только рисовать нужно, но и некоторые другие действия выполнять; и делает это именно CPaintDC.
Из твоего поста вообще можно понять, что ты получаешь контекст через GetDC КАЖДЫЙ РАЗ. И вообще, у тебя где-то явная лажа с кодом, раз такая фигня лезет. Что касается ловли исключений в OnPaint, так мало ли что ты не видел. Все зависит от кода рисования. Если он может вызвать исключение, значит, надо ловить. Кстати, CResourseException говорит о том, что ты безбожно разбазариваешь GDI-ресурсы (т.е. на возвращаешь их). -------------------- ... |
|||
|
||||
serg405 |
|
||||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 12.6.2008 Репутация: нет Всего: нет |
Имееш ввиду что не делаю вот так?
А и кстаит дополнительный вопрос. Зачем седлали GetDC(), если можно во всех функциях кроме OnPaint использовать
Кстати здесь тож нужно делать
правильно? Вот ето нашол в MSDN
А если я сделал не так
а вот так
что тогода релизать, тут я так понимаю ненадо? Или всетаки чтото надо. И дайте ссылку кто может как правильно и грамотно пользоваться CDC CClientDC CPaintDC OnPaint CustomDraw и так далее. Может есть какаято книга по рисованию в MFC. Потому что MSDN мне чтото мало потогает. Это сообщение отредактировал(а) serg405 - 7.8.2009, 10:32 |
||||||||||||
|
|||||||||||||
GavriKos |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 8.8.2007 Где: Донецк, Украина Репутация: нет Всего: 1 |
1) По поводу ресурсов - это касется не только контекста устройства. Не забывай выгружать кисти, ручки и прочее. Выгружай все ))
2) Лучше приведи полный код, а то действительно непонятно что и как ты используешь для рисования --------------------
Донецкая группа IT - присоединяемся |
|||
|
||||
serg405 |
|
||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 12.6.2008 Репутация: нет Всего: нет |
1)
Уменя в проекте немерено кода по рисованию пишут его 3 человека каждий по своему. Тоесть суть не в коде а в том что ево много и мы непривильно спользуем ресурсы. 2)
3)Выгружать кисти это значит запоминать старую и возвращать ее? Или просто делетать поинтреы(ну это я и так знаю)? или нужно самому делетать созданый обэкт ну от допустим обезательно ли делать вот так
4)Кстати а если сделать вот так
5)А вот ище пример. Так правильно?
В DrawPicker просто рисую квадраты круги и так далее. 6) А если я рисую в OnCtrlColor? там в функцию приходит DC я так думаю там эго релизать ненадо? А что будет если я эго релизну? Это сообщение отредактировал(а) serg405 - 7.8.2009, 11:06 |
||||||||||
|
|||||||||||
Earnest |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Здесь как раз релизить не надо. И в случае с ClientDC тоже - это делает деструктор. А вот здесь как раз очень даже надо. Вообще так нельзя делать именно потому, что ты не сохраняешь переменную CDC и непонятно что релизить.
Либо так, либо выбирать в контекст стандартную кисть (StockObject). А потом, разумеется удалять саму кисть (после выгрузки ее из контекста). Причем, если ты используешь автоматические переменные, то они сами разрушатся.
Еще какие! Нельзя разрушать объект, выбранный в контекст.
Не надо здесь релизить. А будет неизвестно что и неизвестно когда - неопределенное поведение. Вообще реилизить нужно только то, что сам создал, это общий принцип. И с основами C++ и MFC разобраться не помешает. -------------------- ... |
||||||||
|
|||||||||
GavriKos |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 8.8.2007 Где: Донецк, Украина Репутация: нет Всего: 1 |
По поводу литературы... Есть у меня хорошая книга в бумашке, но она харьковского издания, не знаю можно ли нарыть ее в инете. Название до боли простое - Visul c++. В принципе в любой книге именно по вижуалам должно по идее быть рисование.
На сколько помню из школьных уроков мфс - правило хорошего тона при рисовании - старые объекты для рисования запоминать и потом обратно подключать. Очень спасает такая привычка в ситуации когда в середину рисования надо что то впихнуть свое. --------------------
Донецкая группа IT - присоединяемся |
|||
|
||||
serg405 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 12.6.2008 Репутация: нет Всего: нет |
||||
|
||||
GavriKos |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 8.8.2007 Где: Донецк, Украина Репутация: нет Всего: 1 |
С. В. Глушаков, А.В. Коваль "Visual c++ руководство разработчика"
--------------------
Донецкая группа IT - присоединяемся |
|||
|
||||
serg405 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 12.6.2008 Репутация: нет Всего: нет |
спасибо за втора. Так ище вопрос
Не ловит ничево. |
|||
|
||||
serg405 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 12.6.2008 Репутация: нет Всего: нет |
А кто что скажет на щет такого кода
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Такой обработчик имеет смысл только в единственном случае: когда CWnd не является прямым предком CMyWnd, и прямой предок (или кто-то из предков) переопределяет OnPaint. Во всех остальных случаях он нафик не нужен. Как и оператор return.
-------------------- ... |
|||
|
||||
serg405 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 12.6.2008 Репутация: нет Всего: нет |
не ну у маня там if и другой код по else просто не будет ли какогото подводоного камня. Я сам понимаю что пользы от этого в чистом виде 0.
|
|||
|
||||
serg405 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 12.6.2008 Репутация: нет Всего: нет |
Так везде где вызывался GetDC() все выглыдит вот так
Ошыбка не пропала. Осталось впринципе только проверить все SelectObject(). Но я уже начинаю сомневаться что проблема в этом. Я бы показал сурс но у меня ево немерено и я незнаю где именно все вылетает. Хочу ище попробовать протрейсать все GetDC и поймать момент когда возникает первый CResourceError. А у когото вообще такое бывало. Если да то скажыте где нашли ошибку. |
|||
|
||||
Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Тогда правильно будет примерно так:
Т.е. создавать CPaintDC нужно только в коде своей прорисовки, но никак не перед вызовом стандартного метода. Убери нифиг все GetDC из прорисовки. Вся прорисовка, вызываемая из OnPaint должна получать контекст CPaintDC, инициализируемый здесь же. Перепиши свои функции так, чтобы они получали контекст CDC как параметр, по ссылке, и вызывай из OnPaint или если приспичит - из других мест. Если где-то и нужно контекст через GetDC или CClientDC получать - таких мест не должно быть много. Чаще всего - это прорисовка каких-то временных объектов, скажем, при движении мыши. Но для основной прорисовки должен быть единиый контекст CPaintDC. -------------------- ... |
||||
|
|||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |