Canvas does not allow drawing
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.141] |
|
|
Canvas does not allow drawing
|
Сообщ.
#1
,
|
|
|
|
Здравствуйте!
Тема, наверное, WinAPI-шная, но вызовы идут из программы на Билдере - потому тут и пишу. Пока моя рисовалка работала с одной картой, проблем не было. А сейчас рухает с сообщением ![]() ![]() void __fastcall TFMain::AppException(TObject *Sender, Exception *E) { Screen->Cursor = crDefault; if (onSxfLoad) { sprintf(buf, "Файл %s\r\nОшибка на объекте %d:%d:", OpenDialog1->FileName, sxfItem->api->MapObj->code, sxfItem->api->MapObj->num); switch (sxfItem->api->MapObj->local) { case 0 : strcat(buf, "LIN"); break; case 1 : strcat(buf, "SQR"); break; case 2 : strcat(buf, "DOT"); break; case 3 : strcat(buf, "TXT"); break; case 4 : strcat(buf, "VEC"); break; case 5 : strcat(buf, "MIX"); break; default : strcat(buf, "UFO"); break; } strcat(buf, "\r\n"); strcat(buf, E->Message.c_str()); Application->MessageBox(buf, "Ошибка чтения файла", MB_ICONWARNING); } else { ShowMessage(E->Message.c_str()); // вот сюда попадаю Application->Terminate(); } } ![]() ![]() void __fastcall TFMain::PBPaint(TObject *Sender) { PB->Canvas->Draw(0, 0, bmp); } |
|
Сообщ.
#2
,
|
|
|
|
поток я так понимаю у тебя один, поэтому скорее всего что то из этого
Цитата Question: What does the error message 'Canvas does not allow drawing' mean? Answer: you may have run out of resources, which means a new DC cannot be allocated. Usually this is a result of not freeing unused DCs or other objects. you are attempting to draw to an device context that is not yet valid. Such as in the create constructor of a component. you are trying to draw on a canvas while your last draw-operation has not finished yet. In this case you can use Canvas.Lock() or Canvas.TryLock() to fix it. |
|
Сообщ.
#3
,
|
|
|
|
Цитата #SI# @ Проверить, всем ли SelectObject() есть соответствующие DeleteObject()? Интересно, а зачем вообще их понадобилось юзать. Чем VCL-ные обертки не устраивают, или хочется создать "гремучую смесь" VCL и API ?! |
|
Сообщ.
#4
,
|
|
|
|
leo, научи, как висюльками нарисовать PolyPolygon() и выполнить TransparentBlt(). Ну шо те стоит, а?
![]() Да, и заодно как такое пёрышко создать? ![]() --- По сабжу - поотключал часть функций рисовалки, загрузил 61 карту сотки на Московскую область. Полёт нормальный. Это говорит о том, шо где-то в отключенных функциях порылась собака. |
|
Сообщ.
#5
,
|
|
|
|
Цитата #SI# @ Да, и заодно как такое пёрышко создать? Не понятно, чем ты вообще занимаешься - хочешь слепить свою самоделку лучше или дешевле, чем Панорама ГИС-вьюер ?! |
|
Сообщ.
#6
,
|
|
|
|
leo, ты по делу можешь ответить? Если нет - то не парься, ага? А с поделками этой конторы я знаком не понаслышке...
--- По сабжу - нашёл пяток косяков, исправил. Но вывод полигонов всё равно глючит. Тот же глюк, шо и в вышеупомянутой Панораме - только там EAV не обрабатывается и писюк не поднимается даже тремя пальцами. Вот пример вывода: ![]() ![]() switch (obj->code) { //..... case 71323000 : pen = ::CreatePen(PS_SOLID, 1, clBlack); logBrush.lbStyle = BS_HATCHED; logBrush.lbColor = clBlack; logBrush.lbHatch = HS_CROSS; brush = ::CreateBrushIndirect(&logBrush); DrawPolygon(hdc, points, pointCount, metricCount, pen, brush); return; //----------------------------------------------------------------------- case 71610000 : pen = ::CreatePen(PS_DASH, 1, clBlack); brush = ::CreateSolidBrush(clWhite); DrawPolygon(hdc, points, pointCount, metricCount, pen, brush); return; //======================================================================= default : // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! pen = ::CreatePen(PS_SOLID, 1, clFuchsia); brush = ::CreateSolidBrush(clFuchsia); DrawPolygon(hdc, points, pointCount, metricCount, pen, brush); return; } } А вот вывод полигона: ![]() ![]() void DrawPolygon(HDC dc, TPoint *pnts, int *pCount, int mCount, HPEN pen, HBRUSH brush) { HPEN dcPen = ::SelectObject(dc, pen); HBRUSH dcBrush = ::SelectObject(dc, brush); ::PolyPolygon(dc, pnts, pCount, mCount); ::SelectObject(dc, dcPen); ::DeleteObject(pen); ::SelectObject(dc, dcBrush); ::DeleteObject(brush); } Кстати, щяс в дефолт подставлю её и посмотрю что получится. --- ![]() ![]() default : pen = ::CreatePen(PS_SOLID, 1, clFuchsia); // brush = ::CreateSolidBrush(clFuchsia); logBrush.lbStyle = BS_HATCHED; logBrush.lbColor = clBlack; logBrush.lbHatch = HS_CROSS; brush = ::CreateBrushIndirect(&logBrush); DrawPolygon(hdc, points, pointCount, metricCount, pen, brush); return; --- Всё ещё роюсь... Круг поиска сузился... ЗЫ - ещё одна Панорамная фенька - если работает тот же плейер, то в момент загрузки карты звук просто заикается. Очень смешно... ![]() --- Поймал хаду! Громко не ржать! ![]() ![]() // плотнозастроенные case 1 : value = GetAtrValue(atrs, 243); switch (value) { // крупный город case 20 : brush = ::CreateSolidBrush(RGB(255, 148, 40)); // жёлтенькие break; // малый город, ПГТ case 21 : case 22 : brush = ::CreateSolidBrush(LTGRAY_BRUSH); break; // с/х и дачные посёлки case 23 : case 24 : brush = ::CreateSolidBrush(BLACK_BRUSH); break; // прочие НП case 26 : brush = ::CreateSolidBrush(BLACK_BRUSH); break; // любые НП /* а кисти - нет */ case 28 : ::CreateSolidBrush(RGB(255, 148, 40)); // жёлтенькие break; /* -*- */ default : ::CreateSolidBrush(RGB(255, 0, 0)); // UFO } break; Всем спасибо за внимание! ЗЫ - этой баге года 2, не меньше. Пока работал с одной картой - всё сходило с рук... ЗЗЫ - Лео, ежели кинет тебя судьба и заставит писать на Панорамных MapAPI / GTK - спрашивай, не стесняйся. Чем смогу - помогу! |
|
Сообщ.
#7
,
|
|
|
|
![]() Цитата #SI# @ Лео, ежели кинет тебя судьба и заставит писать на Панорамных MapAPI / GTK - спрашивай, не стесняйся. Чем смогу - помогу! "Эт вряд ли"(С). "Не царское это дело" заниматься какими-то рисовалками, поэтому "помощников" мне и так хватает, и не они мне советуют что и как делать, а я им "с высоты птичьего полета", поскольку прежде чем грузить "61 карту сотки на Московскую область" нужно подумать - а нужно ли это вообще и можно ли решить эту задачу иначе |
|
Сообщ.
#8
,
|
|
|
|
Цитата leo @ Штаны не потеряй. Давай ты будешь своим делом заниматься, а я - своим. И помогать друг другу. А по части флудежа в тематике тебе всё равно за мной не угнацца. Не веришь - спроси тутошних модераторов. Они много чего могут вспомнить а я им "с высоты птичьего полета" Добавлено --- А вопрос таки решён. |
|
Сообщ.
#9
,
|
|
|
|
Цитата #SI# @ Давай ты будешь своим делом заниматься Я своим и занимаюсь - пытаюсь обратить внимание на то, что, возможно, вы НЕ "верной дорогой идете, товарисч!" В предыдущем топике ты пытался параллельно рисовать 4-5 карт в разных потоках - видимо есть какие-то проблемы с быстродействием. Теперь речь зашла об отрисовке 20-60 карт и возникли вопросы с нехваткой ресурсов. Хотя судя по этой картинке, уже при отображении 3-4 листов одновременно, разобрать что-либо на такой с позволения сказать "карте" практически невозможно - тут явно нужна генерализация. Поэтому если и юзать многопоточность, то не для того, чтобы параллельно рисовать "кашу" на экране, а создавать\обновлять прореженный список\списки генерализованных объектов, которые следует отображать в мелких масштабах. И если кол-во одноврменно отображаемых объектов при разных мелких масштабах будет примерно одинаковым (или хотя бы будет отличаться раза в 2-3, а не в сотни раз), и ссылки на отображаемые объекты будут занесены в отдельный список (чтобы не искать их по всем картам при каждой перерисовке), то и основному потоку будет практически пофиг рисовать одну подробную карту или 60 мелких генерализованных. (Ну и ес-но одна мелкая схематическая карта-навигатор на весь район - штука весьма полезная).Хотя ты, видимо, и сам все это знаешь, поэтому - "извиняйте за беспокойство, не смею больше тревожить" |
|
Сообщ.
#10
,
|
|
|
|
Да простят меня модеры за забивание форума картинками...
![]() ![]() ![]() ![]() Потенциальная банка за наезд на участника форума Мил человек, не рассказывай мне, как делаются ГИСы. Я этим занимался ещё тогда, когда ты штаны мочил... Ничего личного. Ага. Не надо считать собеседников дебилами. --- По сабжу - я действительно не работал с потоками для такого конкретного случая. Таки, положа руку на сердце, от тебя ничего, окромя высокозаумного мычания, я не услышал. --- ЗЫ - таки багу я нашёл. Исправил. Отписал тут чуть выше. Искренне желаю ребятам, которые в глаза излучают тебе улыбки, а за глаза ... не попадать в такие ситуации. Добавлено Таки для поклонников поделок КБ Панорама (сорри за качество, но клаву она при ошибке блокирует, снимал мобилкой): ![]() ![]() Вопрос к МАСТЕРАМ уровня Адиля/Тренера (в алфавитном порядке ) - чем так можно засрать память, что система просто не реагирует? |