| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Проблемма с CDC |
| Автор: ShurikA 22.3.2006, 14:51 | ||||||
| Есть вот такой код: При загрузки картинки из фаила:
при том что:
При прорисовке:
и так... Когда я поднимаю любую картинку, поднимается чёрный квадрат на котором прекрасно бырисовывается measureMgr->Paint(&dcFull); но правда белого цвета а не того как я задаь (зелёного)... |
| Автор: Earnest 22.3.2006, 16:13 |
| Не вижу, что у тебя там зеленое должно быть? Если то, что рисует measureMgr->Paint, так приведи его код. |
| Автор: Earnest 22.3.2006, 18:30 |
| Сразу сложно сказать. Попробуй сначала локализовать проблему: где пропадает картинка в dcFull или dcMain. А еще есть одна ошибка: перед созданием CompatibleBitmap ты делаешь старому Detach. Это нехорошо - чревато утечкой GDI-ресурсов. Делать надо DeleteObject(). Добавлено @ 18:34 И еще: создавал бы ты контексты, совместимые с экраном, а не с твоим растром. Тебе ведь на экран выводить надо, а растр модет попасться, например, черно-белый. |
| Автор: ShurikA 22.3.2006, 20:35 | ||||
если так то всё работает, но мне удобнее было бы со всем этим монипулировать (зум, сдвиги и т.д.) если это двумя разными контекстами. что значит попасться??? Разве я не могу его сам определить? и разве вот это его не определяет:
|
| Автор: Earnest 22.3.2006, 21:25 | ||
И чему это противоречит? Создавай оба контекста по экранному, а не по растровому. Дело в том, что именно копирование между совместимыми контекстами происходит быстро (т.к. у них одинаковый формат памяти). А если контексты имеют разную цветность, то нужен дополнительный маппинг цветов. Так что нет особого смысла создавать совместимые контексты не по экрану. По идее должен создасться контекст такой же цветности, как растр... Это значит, если растр серый, то ты не сможешь цветом рисовать. У меня есть некоторые сомнения, что в качестве параметра CreateCompatibleDC можно использовать контекст, полученный от растра... Для проверки запроси у совместимого битмапа сразу после создания... |
| Автор: ShurikA 23.3.2006, 00:29 | ||
| УРААААААААААААААААА!!!!!!!!!!!!!!!!!!!!! Решилось вот так:
|
| Автор: ShurikA 28.3.2006, 17:02 |
| Как это правильно сделать? размер окна может меняться... |
| Автор: Earnest 28.3.2006, 18:07 |
| В качестве аргумента для CreateCompatibleDC и CreateCompatibleBitmap используй контекст окна или всего дисплея, а не контекст растра. И какая разница, какие там размеры. |
| Автор: ShurikA 28.3.2006, 21:40 | ||
| Потом обьясню
В таком лучае мне надо создавать этот самый контекст каждую перерисовку... Это не есть хорошо!!! |
| Автор: Earnest 29.3.2006, 08:11 |
| Вовсе нет... кто мешает создать один раз? От того, что ты освободишь экранный контекст, созданный по нему совместимый контекст не протухнет. При создании совместимого контекста всего лишь копируются некоторые параметры исходного (к битмэпу это тоже относится). Кроме того, наиболее емкая операция - это выделение и копирование битмэпа. Так что можно хранить только битмэп, а контекст создавать каждый раз заново - по времени это семечки. А вот куча лишних переменных, хранимых в классе, засоряет его определение... ИМХО. |
| Автор: ShurikA 29.3.2006, 10:41 |
| Earnest, Я не об этом, а о том что если создать контекст один раз по размеру окна то он и быдет в размер окна в момент создания. А что будет если юзер делает переразмерку самого окна? Скажем так: Имеет ли смысл делать контекст в который при прорисовке быдет всё копироваться, и только потом на экран? |
| Автор: Earnest 29.3.2006, 16:00 | ||
| Не контекст в размер экрана, а битмэп... но в вобщем я поняла... Можно, конечно, ловить WM_SIZE и инициализировать контекст заново. Но если включена опция "показывать содержимое окна во время ресайза", то, наверное, может притормаживать... Не знаю, не пробовала. Я обычно использую совместимые контексты двумя способами: 1) для самопальных контролов, чтобы избежать мерцания. Тогда я просто создаю временный контекст и битмэп каждый раз на OnPaint. 2) как виртуальную подложку для "большого" рабочего экрана, чтобы ускорить вывод графики. Тогда делаю подложку на весь экран. Это больше чем нужно (есть ведь еще рамки-заголовки-скроллы), но так проще, и чего ее (память) жалеть. Потом нужно только ловить сообщение об изменении размеров дисплея (если по-хорошему).
Конечно, имеет - это борьба с мерцанием. |
| Автор: ShurikA 29.3.2006, 16:31 | ||
Вот этого я и хотел избежать, ведь это долго. Но я так понимаю что ето довольно таки геморойно. Добавлено @ 16:32 И ещё вопрос: Как запросить у окна его DC? |
| Автор: Earnest 29.3.2006, 16:57 |
| Нет, это как раз довольно быстро. Я имею в виду только создание. StretchBlt - уже относительно долго (зависит от размеров, конечно). Но твой случай, конечно, второй, когда нужна постоянная подложка - растр ведь может быть довольно большим, да и еще какая-то графика у теюя есть. CDC* CWnd::GetDC() (потом не забудь сделать ReleaseDC). Или просто CWindowDC dc(CWnd*); или CClientDC dc(CWnd*); |