![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Интересно, почему дажу в MSDN в обработчиках события Paint не вызывается Dispose для PaintEventArgs.Graphics. Насколько я понимаю, в наследниках Control нет поля для хранения Graphics, поэтому PaintEventArgs.Graphics создается каждый раз при обработке события. Если так, то странно, что не вызывается Dispose.
Поправьте, если не прав. |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 7 Всего: 93 |
а эта догадка откуда? -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Хм... Просто увидел в MSDN:
Мне это показалось странным, ведь событие Paint вызывается очень часто. От туда же - из MSDN. Graphics каждый раз получается путем создания нового объекта через CreateGraphics или через статические методы Graphics.FromXXX. Хотя вполне логично было бы ожидать, чтобы Graphics создавался один раз и хранился в Контроле. Но почему-то сделано не так :(. Это сообщение отредактировал(а) Idsa - 15.3.2007, 05:11 |
|||
|
||||
| altarvic |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 2.3.2007 Репутация: 1 Всего: 1 |
||||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Ну имхо, это тривиально: обработка событий в дотнет идёт по цепочке, т.е. если допустим на Paint подписано несколько обработчиков - все они получат один и тот же PaintEventArgs. Если один обработчик задиспозит графикс, остальные не смогут в нём рисовать. Всё сказанное дальше - только в познавательных целях. Чтобы узнать, кем создаётся и кем убивается графикс для Paint, открываем рефлектор, смотрим где впервые создаётся графикс для OnPaint/события Paint (можно по "instantiated by" для PaintEventArgs), и видим сие:
Оказывается, что внутри контрола для Paint создаётся и диспозится чудесный объект BufferedGraphics, а также есть возможность передать в WM_PAINT свой контекст вывода через wparam. -------------------- ![]() |
|||
|
||||
| nikitao |
|
|||
![]() Кот-программист ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1206 Регистрация: 30.8.2005 Где: Спб Репутация: 4 Всего: 26 |
Общее правило относительно любого любого обьекта Graphics :
Это сообщение отредактировал(а) nikitao - 15.3.2007, 17:51 -------------------- Жизнь - печальная штука. |
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Логично. +1. Вопрос
А вот вопрос, почему бы не сделать поле, например, в классе Control для хранения ссылки на Graphics, остается открытым. По всей видимости, есть необходимость создавать новый объект Graphics при каждой отрисовке (какой-то параметр часто меняется)... однако при рассмотрении Graphics в MSDN и рефлекторе я так и не понял, что же такое "частоменяющееся" хранится в Graphics. Если бы ссылка на Graphics хранилась в контроле, то все было бы гораздо проще. Нужно было бы проверить ее на null и использовать. Ответ, вроде считаю несостоятельным. P. S. Мои размышления основываются на том, что нет необходимости создавать Graphics при каждой отрисовке, что в нем нет таких полей, которые бы менялись при каждой отрисовке. Однако я более чем уверен, что я неправ в этом предположении Это сообщение отредактировал(а) Idsa - 15.3.2007, 18:43 |
|||
|
||||
| Naum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 743 Регистрация: 7.9.2005 Где: Саратов, ул. Поса дского, 298 Репутация: 8 Всего: 15 |
Idsa, конечно, не уверен, но думаю это связано с занимаемой памятью. Пустая форма итак, занимает много места. Если все ее контролы будут хранить свой Graphics, потом тебе захочется еще чего-нибудь "хранить".
А, сообственно, (с Dispose()-то понятно) чем тебе не нравится, что Graphics() создается, когда он нужен, а не хранится? -------------------- У нас всего два праздника Новый год и ТЯПница. |
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
А не нравится мне вот что. Graphics нужен все время жизни, например, формы, в течение которого ее Visible == true. Если бы мы сохранили ссылку на Graphics в каком-нибудь поле, то затратили бы на это X байт памяти. А получается же, что Graphics создается очень часто, и до сборки мусора у нас может уйти n*X байт памяти, где n - не такое уж и маленькое число. Вопрос-то собственно был задан с целью узнать, может, в Graphics передаются какие-то меняющиеся в процессе выполнения параметры. Видимо, мое предположение оказалось неверным. Тогда получается, что Microsoft решила не хранить постоянно X-байт, а периодически выделять и "собирать" n*X байт. Что ж, это их право P. S. Раньше думал, что Paint вызывается и при движении мышки по форме. Однако сейчас убедился в обратном. Почему так происходит? Как будто курсор мышки в другом слое |
|||
|
||||
| altarvic |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 2.3.2007 Репутация: 1 Всего: 1 |
Graphics во время жизни формы нужен кому? Система сама позаботится об отрисовке. Graphics это вообще обертка над HDC - контекстами устройства Win32 и если каждый контрол будет его хранить, то ресурсов системы рано или поздно не хватит однозначно (ресурсы != память)
|
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Ответ нужно искать в WinAPI, в том как винда отрисовывает окна (тема About Painting and Drawing в мсдн), ну и конечно же хранить для каждого окна HDC - значит забить все ресурсы винды (в среднем приложении м.б. сотни окон - кнопки и пр.), количество которых почему-то ограничено.
-------------------- ![]() |
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
С вопросом от том, что хранение Graphics - пустая трата ресурсов, убедили! А вот с вопросом, почему событие Paint не вызывается при движении курсора мыши, я так и не разобрался :(
|
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Отрисовкой курсора управляет ось, уж она может позаботиться о том чтобы корректно смешивать два буфера (рисунок курсора с маской и текущее содержимое десктопа) перед выводом на экран, вместо того чтобы тупо перерисовывать десктоп на каждый чих мышки. Практически то же самое относится к передвижениям окна: перерисовывается только то, что под окном, а передвигаемое окно - нет, пока не будет затронуто краями десктопа или topmost-окнами. -------------------- ![]() |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |