![]() |
|
|
![]()
|
|
| takedo |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
Dreamer_0x01
Earnest Я вот и спрашивал
-------------------- я не гольфист - я хоккеист |
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Лучше бы все делать в одном месте, т.е. в DrawItem. Кто тебе мешает заливать фон здесь? В этой функции можешь делать все то же самое - вызываешь какой-нибудь FillRect, и все.
Конечно, пример - это только пример, далеко не полный. При нажатии текст кнопки действительно надо сдвигать, примерно на 1,1 вниз по диагонали. Не забудь после отрисовки состояние DC поменять на исходное - MSDN на этом очень настаивает. Я обычно, чтобы не парится с востановлением всего, что наменяла, использую SaveDC - RestoreDC. Еще удобнее - завернуть все в классик:
Ставишь в начала функции SAVE_DC_STATE() и больше ни о чем не заботишься. Добавлено @ 09:08 takedo, на пару минут опередил -------------------- ... |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
Я вот так сделал, много лишнего, но это вырезка из кода, думаю не страшно
-------------------- я не гольфист - я хоккеист |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
Earnest
посмотрел SaveDC так в мсдн говорят, что все текущее состояние сохраняется в "context stack" - это куда, можно узнать? Спрашиваю потому, что как и обычно твой классик - весьма удобен, но вот сомнения терзанули, а сколько может быть сохранено в этом контексте? -------------------- я не гольфист - я хоккеист |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
Earnest
Я почему спросил, мотому что не понял в каком стеке? То есть у каждого DC есть свой стек? В который мы и записываем. Но вот какая мне проблема видится: есть функция обработчик1 и функция обработчик2 сообщения 1 и 2. В фукнции 1 мы сохраняем SaveDC(hdc), в это время, приходит сообщение, вызывающее обработчик 2, в котором мы тоже SaveDC(hdc). В итоге, если сохраняем в одно и то же место можем восстановить по Restore не то. Или как то возвращаемый SaveDC параметр влияет. Вот не могу этого понять -------------------- я не гольфист - я хоккеист |
|||
|
||||
| JoyEx |
|
||||||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 5 Всего: 12 |
Где-то в GDI-памяти, механизм стека для этих целей можно и самому сделать, но лучше не быть SaveDC(hdc) ==> RestoreDC(hdc, -1) ведь очень удобно!
Пока SaveDC() не вернет 0
Да-да, "возвращаемый SaveDC параметр" и нужен для того, чтобы не появился хаос: RestoreDC(hdc, сюда его прописывай). Это сообщение отредактировал(а) JoyEx - 9.12.2005, 16:15 -------------------- Если ты уже никого не боишься, значит ты самый страшный |
||||||
|
|||||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
JoyEx все правильно говорит.
takedo Честно говоря, я не знаю, сколько состояний выдержит этот стек, не экспериментировала. Обычно я ставлю сохранение DC контекста в начале самой внешней функции отрисовки (которую Windows или MFC вызывают), а во внутренних уже не забочусь о том, что изменилось - внешняя функция, завершаясь, все подчистит. Пользуюсь давно, проблем не было. -------------------- ... |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
А может, кто на пальцах пояснит, для чего вообще этот RestoreDC нужен? Только в MSDN просьба не отсылать, на английском не пойму...
-------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 5 Всего: 12 |
Нуууу... Это сообщение отредактировал(а) JoyEx - 10.12.2005, 16:43 -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Да ровно для того, чтобы не писать все эти многочисленные pDC->SelectObject(pOldPen) и не запоминать олд-пены. Есть такая весьма распространенная ошибка: создаем в функции GDI-объект, выбираем его в контекст, по выходе из функции созданный объект удаляем, но забываем восстановить старый. Так вот, в этом случае GDI-объект вовсе не удаляется. Особенно в 98 это весело выглядит: пара минут работы, и все рисуется белым - кончились GDI-ресурсы, остались одни стандартные. А когда пишешь более-менее сложный код, согласись, есть о чем думать, кроме того, чтобы запомнить, что ты там выбрал в контекст. В идеале - совсем об этом не заботиться. Вот для этого идеально подходит парочка SaveDC-RestoreDC. -------------------- ... |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |