| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > WinAPI, заливка замкнутых фигур |
| Автор: KasMP 23.3.2009, 23:17 | ||||||||||||
| Есть граф. Мы вычисляем для каждой вершины подходящий ей цвет и потом хотим все это нарисовать. У меня получилось все кроме непосредственно заливки окружностей, соответствующих вершинам. Судя по всему, нам не обойтись без сплошных кистей:
Кисть, как и любой другой объект, надо создать:
Ну а теперь осталось связать вместе
Вот только у меня все начинается с очень странной ошибки
и непонятно, как можно что-то рисовать, не получив hdc. Почему у всех все работает, а у меня вечно какая-то глупая ошибка? Добавлено через 3 минуты и 34 секунды Граф:
Ф-я, рисующая существующий граф:
|
| Автор: Alexeis 23.3.2009, 23:27 | ||||
Это похоже на GDI+ . Тогда явно не хватает.
и
Но это метод класса Graphics . Если же нужно использовать GDI, то функция называется Ellipse. Она тоже заливает фигуру. Добавлено через 3 минуты и 23 секунды Вот тут можно почитать http://msdn.microsoft.com/en-us/library/dd162510(VS.85).aspx Добавлено через 7 минут и 39 секунд А вот еще такое чтобы кисть заработала нужно ее выбрать для конетекста функцией SelectObject |
| Автор: mes 23.3.2009, 23:35 |
| и для вопросов по WinAPI есть соответствующая тема, там больше шансов на ответ |
| Автор: Alexeis 23.3.2009, 23:47 |
Функция SelectObject меняет у контекста вспомогательные объекты. Кисти, карандаши и т.д. 1) параметр контекст на котором рисуем. 2) дескриптор новой кисти. 3) результат дескриптор старой кисти. Добавлено через 3 минуты и 46 секунд P.S. старую кисть нужно сохранить, и потом по выходу вернуть на место, свою кисть уничтожить. По окончанию текущего кадра все что использовалось следует удалить или освободить. Разве что битмапы не стоит удалять (если используются). Рисовать можно не везде и не всегда. Правильно рисовать, по получению сообщения WM_PAINT. |
| Автор: KasMP 24.3.2009, 15:23 | ||||
Alexeis, благодаря твоим ответам я поняла, в каком направлении искать, и нашла
Да, я это понимаю. DrawGraph() вызывается в WM_PAINT Добавлено через 3 минуты и 23 секунды То, что мне полностью помогло:
|
| Автор: GremlinProg 24.3.2009, 17:27 | ||||
это не совсем верно, поскольку новые API, которые осуществяют поддержку с темами XP, определяют GDI объекты в ран-тайме в зависимости от выбранной конфигурации (в расширении VS), так что при возврате таких функций могут присутствовать как предопределенные объекты, так и заказные, так что, если частичная или полная интеграция двух API: GDI и VisualStyles таки произойдет, то все программы, которые это не учитывают, будут генерировать утечки GDI-ресурсов хотя майкрософт пока на это и не особенно акцентируется, но внимание, таки обращает:
|
| Автор: KasMP 28.3.2009, 21:32 | ||
| GremlinProg, спасибо большое Добавлено через 5 минут и 9 секунд Вобщем внутри DrawGraph() у меня появилось примерно такое:
Вроде бы все правильно. Да |
| Автор: KasMP 28.3.2009, 21:54 |
| Мне нравится http://radikal.ru/F/s53.radikal.ru/i141/0903/2b/9c5d36259ae2.jpg.html http://radikal.ru/F/s43.radikal.ru/i099/0903/6c/0b52b6133c32.jpg.html |
| Автор: bitt 4.4.2009, 17:28 |
| а исходник этой программы может выложить кто нибудь ? |
| Автор: KasMP 1.5.2009, 09:54 |
| Ребят, я наивно верю, что у кого-то из вас есть желание взять мой полный проект на WinAPI (ищущий для графа 4-раскраску и рисующий ее), поковыряться в нем и покритиковать его Желающим пришлю на мыло |
| Автор: Alexeis 5.5.2009, 15:24 |
Можно тут приатачить к посту. Тогда им смогут полюбоваться намного больше народу |
| Автор: KasMP 7.5.2009, 15:11 |
| Alexeis, вот именно, что тогда многие только картинки посмотрят, а непосредственно вникать мало кто захочет А если человек уже напишет сюда о своем желании, то тогда он точно настроен |
| Автор: KasMP 4.7.2009, 18:08 | ||||||
GremlinProg, твое сообщение
Пожалуйста, скажи еще несколько ключевых слов, связанных с этой проблемой, чтобы было проще искать |
| Автор: Forsaken 5.7.2009, 20:41 |
| KasMP, А он ведь Вам все уже рассказал. Проблема ясна, и рекомендация по решению есть. И слов много для поиска |
| Автор: KasMP 5.7.2009, 21:16 |
| Forsaken, сообщение действительно достаточно полное Давайте я тогда задам конкретные вопросы, которые совсем не знаю
|
| Автор: Forsaken 5.7.2009, 22:12 |
| 1. run-time -Это значит во время выполнения программы 2. VisualStyles -визуальные стили оформления, темы (например можно скачать тему для XP так что она будет выглядеть как Vista) 3. VS под этим сокращением подразумевалось VisualStyles 4. В случае о котором говорилось подойдет ProcessExplorer там можно увидеть хэндлы GDI (и обнаружить утечки -хэндлы будут увеличиваться со временем) -к примеру: выбираете там нужный процесс, щелкаете прав. кн. мышки и щелкаете Properties и на закладке Perfomance увидите их кол.во Суть проблеммы в том что GetStockObject в случае использования визуальных стилей может возвратить объект который нужно удалить (потому что он не есть "Stock" -"предопределенный" по русски) Вот как это я понял. Я сам два месяца программирую на C++ под Win32 API, так что прошу прощения если я сам что-то не так понял. |
| Автор: KasMP 6.7.2009, 21:41 | ||||||||
Я так и подозревала
Как все просто оказалось
Благодарю
Я тоже так поняла
Надеюсь, GremlinProg еще заглянет на наш огонек и разъяснит все точно |
| Автор: Earnest 7.7.2009, 07:47 |
| Forsaken все правильно сказал. Только при проверки GDI-рескрсов с помощью эксплорера нужно учитывать некоторые тонкости. Скажем, чсло хандлов после открытия, скажем, какого-то окна программы, возрастает. Казалось, было бы логично ожидать, что после закрытия этого окна, число хандлов уменьшится до предыдущего уровня (если все правильно). Но увы, это не так. Есть некоторое число хандлов, которое раз выделившись, не исчезает - это все, что загружено из ресурсов. Поэтому, стабильное число открытых хандлов вы получите только после закрытия окна. Вот оно-то и не должно дальше возрастать... В общем, это довольно геморройная тема. Нужно усвоить несколько правил: 1) Все перья, кисти, шрифты, курсоры и т.д., которые вы сами создаете, вы же должны и хранить, а потом удалять (т.е. нельзя создать, отдать контексту и забыть). 2) Перед удалением нужно убедиться что перо (кисть, etc) никуда не выбрано - выбранные в контекст ресурсы на самом деле не удаляются и дают утечки. 3) Полезно пользоваться функциями SaveDC\RestoreDC как альтернативой сохранению старых перьев и прочих замененных ресурсов. В общем, все не так сложно, но достаточно рутинно. |
| Автор: KasMP 8.7.2009, 14:00 |
| Earnest, спасибо за ценные конкретные советы (если раньше я так делала и сомневалась, то теперь буду продолжать так делать и буду уверена Попробую еще сама последить за числом и номерами хэндлов |