Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Окна и графические контексты, Вопрос по... 
:(
    Опции темы
regis
Дата 9.6.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 12.12.2005
Где: Москва, Россия

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



Здравствуйте все!

Вопрос наверное для опытных Win-программистов немного чайниковский, за что прошу извинить. Суть такая: если надо рисовать что-то в окне, для получения-освобождения графического контекста используем GetDC/ReleaseDC. Во всех примерах Win-кода, которые я видел, это делается при обработке каждого сообщения (вроме WM_CHAR или WM_KEYDOWN), что меня немного смущает. Почему, собственно, нельзя получить GC один раз при создании окна? Или есть какие-то веские причины для того, чтобы GC создавать/уничтожать каждый раз? Буду признателен специалистам, если объяснят, в чем тут дело.

 
--------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой.
PM MAIL WWW   Вверх
_hunter
Дата 9.6.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



веских -- нету. но ресурсы GDI довольно-таки ограничены и освобождать их максимально быстро считается хорошим тоном. 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Earnest
Дата 9.6.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Очень часто окно не имеет собственного контекста, а разделяет его с другими окнами.
Тянется это еще со времен Win16, когда ресурсов было мало.
Можно, конечно, при создании окна (т.е. класса) определить, что оно будет иметь собственный контекст. А, например, поля диалога очень часто рисуются в контексте родительского окна. Вот чтобы от этого не зависеть и принято брать контекст "ненадолго". 
И лучше рисовать не в "каждом сообщении", а только в WM_PAINT, получая контекст через BeginPaint. 


--------------------
...
PM   Вверх
regis
Дата 13.6.2006, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 12.12.2005
Где: Москва, Россия

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



Всем спасибо, но вопросы остались:

Цитата

Очень часто окно не имеет собственного контекста, а разделяет его с другими окнами.
Тянется это еще со времен Win16, когда ресурсов было мало.
Можно, конечно, при создании окна (т.е. класса) определить, что оно будет иметь собственный контекст. А, например, поля диалога очень часто рисуются в контексте родительского окна. Вот чтобы от этого не зависеть и принято брать контекст "ненадолго". 


А как можно разделить контекст с другими окнами? Вроде бы, у контекста слишком много уникальных аттрибутов (кистья, перья, шрифты, своя область отсечения и пр.)?

Кстати, еще один вопрос возник: если несколько раз (при обработке одного сообщения, я имею в виду)
сделать GetDC, то будут ли возвращенные контесты одними и тем же, или различными. Я имею в виду примерно следующее:

Код

HDC gc1 = GetDC (hWnd);
HDC gc2 = GetDC (hWnd);

SelectObject (gc1, my_font);


станет ли my_font текущим шрифтом для gc2 или нет?

Цитата

И лучше рисовать не в "каждом сообщении", а только в WM_PAINT, получая контекст через BeginPaint. 


Естественно. Я имею в виду другие ситуации вывода в окно, помимо отрисовки по WM_PAINT. (Если, скажем, надо нарисовать там нечто по нажатию клавиши, движению мыши или по WM_COMMAND.)
 
--------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой.
PM MAIL WWW   Вверх
Earnest
Дата 13.6.2006, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(regis @  13.6.2006,  15:45 Найти цитируемый пост)
А как можно разделить контекст с другими окнами? Вроде бы, у контекста слишком много уникальных аттрибутов (кистья, перья, шрифты, своя область отсечения и пр.)?

Контекст - это всего лишь структура данных, с окном особо не связанных. Она больше привязана к девайсу, на котором ты будешь рисовать. Когда ты сначала устанавливаешь свои перья-кисти, а потом убираешь за собой (восстанавливаешь, что было), ты как раз и способствешь безпроблемному использованию этого контекста другими.
Дело даже не столько в том, что контексты могут совместно использоваться, а в том, что "правильный" код сумет нарисовать в любом переданном контексте (а это могут быть экран, принтер, метафайл, etc). Поэтому идиома "получил контекс - установил свои параметры - нарисовал - убрал за собой" и является общепринятой. Насчет многих атрибутов: когда их больше одного-двух удобнее перед установкой своих параметров сохранить состояние контекста (CDC::SaveDC), а потом ахом все восстановить (RestoreDC).

Цитата(regis @  13.6.2006,  15:45 Найти цитируемый пост)
 если несколько раз (при обработке одного сообщения, я имею в виду)
сделать GetDC, то будут ли возвращенные контесты одними и тем же

Точно не знаю, но легко проверить. Думаю, что это зависит от класса окна: если в классе используется common или class DC, то, очевидно, это будет тот же самый контекст. Если private - скорее всего тоже. Но при вызове ReleaseDC установленные атрибуты ведут себя по разному (сбрасываются или нет). 

Зачем усложнять себе жизнь, если можно пользоваться устоявшимися практиками?
 


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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