| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Глюк при отрисовке |
| Автор: TGrey 22.1.2010, 18:12 |
| Здравствуйте, появился следующий прикол. Есть форма на ней рисуются Круги и Линии, а так же 4угольник. Так вот если отрисовать КРУГ пока еще не нарисован 4угольник то круг выглядит нормально, но если это делать, когда 4угольник нарисован, то круг выглядит как-то странно ![]() С права нормальный вариант КРУГОВ. По сути это ГПИ(начинающий), поэтому эти элементы выделяются. Так вот если создать 4кгольник и выделить круги то результат будет как на картинке с лева, а потом если выделить 4угольник, то круги приобретают нормальную форму, как с права. Я думаю это возможно из-за того, что 4угольник может поворачиваться через XFORM и возможно координаты как-то меняются, что изменяет форму круга. Есть идеи? |
| Автор: GremlinProg 23.1.2010, 08:54 |
| кусочек кода был бы уместен |
| Автор: TGrey 23.1.2010, 14:50 | ||||
| Так я даже не знаю, кусочек какой части кода будет уместен. Если бы я понимал причину этого эффекта, я бы возможно методом тыка, что-то надумал. А так я даже не знаю, от куда начинать. Вот надыбал
Вот если убрать функцию Rotate(dc); то круг не изменяется.
Вот тут и есть проблема. |
| Автор: artsb 23.1.2010, 18:22 | ||
| GremlinProg, прав на счёт SetWorldTransform. Тогда лучше так:
|
| Автор: TGrey 23.1.2010, 18:34 |
| Та все вроде работает, поворачивает на все 360 градусов нормально. Я думал возможно после Фнкции поворота очистить экран, чтобы оно могла отрисовать уже с нормальными координатами. Но плохо то, что сстановка норм. коорд происходит после отрисовки 4угольника. Поэтому если потом вызывать Invalidate, то стирается и сам рисунок. |
| Автор: TGrey 23.1.2010, 19:06 |
| Не не помогло возвращать ГрафикМод. Все равно круг выглядит странно, до тех пор пока, не выделить 4угольник. А функция выделения устанавливает только флаг, что оно выделено. После чего обновляется окно. Но такой же эффект происходит и с выделением круга, почему оно его не возвращает в нормальное состояние |
| Автор: artsb 23.1.2010, 21:03 | ||
Конечно не видя кода, тяжело что-то сказать... Попробуйте например и координаты в исходное состояние вернуть:
Может для вас в этой же функции не удобно рисовать и восстанавливать координаты (я же не знаю |
| Автор: TGrey 23.1.2010, 23:30 | ||
Так они и так восстанавливаются.
В самом низу установка норм. коорд. + я дописал еще ГрафМод останавливать, но тоже ничего. |
| Автор: artsb 23.1.2010, 23:56 | ||
Сори. Не посмотрел
Странно. Надо бы всю прогу глянуть. Что и как устроено. Может вы в логике где-то ошиблись... |
| Автор: TGrey 24.1.2010, 00:53 | ||||
| Так а логика тут при чем? Тут работают 3 функции. Клик, Поворот, Отрисовка.
Вот функция клика, все что она делает это устанавливает флаг ВЫДЕЛЕНО. Больше она ни на что не влияет. Поэтому выполняется все так Click->InvalidateRect->Draw->Rotate ------------------------------ Посидев, потыкав нашел вот что. При клике по объекту вызывается функция UpdateZOrder(); которая выводит на верхний план выделенный объект, а все объекты записаны в векторе и во время отрисовки рисуются тоже по вектору. Поэтому и выходит, что если выделить 4угольник, то круг становится меньше Зордером и рисуется ДО 4угольника и значит ДО изменения координат. Потом же если выбрать круг, то 4угольк падает ниже и рисуется раньше круга, поэтому круг уже идет со смещением. Это выходит, что преобразование к нормальным координатам, устанавливает не совсем нормальные координаты как хотелось бы. А за нормальные мой друг взял
|
| Автор: GremlinProg 24.1.2010, 09:49 | ||||||
чтобы не быть голословным, выполни следующий код в любом месте WM_PAINT
запусти программу, сделай скриншот, а теперь раскомментируй строки, запусти программу и снова сделай скриншот, сравни результаты
|
| Автор: TGrey 24.1.2010, 11:30 |
| Хорошо, сейчас попробую, но у меня возникла такая идея, что раз после преобразования коорд. в норм состояние они становятся не совсем нормальными, то можно сразу в OnPaint к примеру до отрисовки чего-либо изменить их на те НЕ совсем нормальные коорды. После чего когда нарисуется повернутый четырехугольник и оно вернет коорды. в норм состояние, круги и т.п. уже будут рисоваться тоже по нем. Тогда конечно немного странная форма останется, но по крайней мере не будет изменятся после кликов. |
| Автор: artsb 24.1.2010, 11:44 | ||||
Я про это и толковал ;)
А может сейчас странная форма... |
| Автор: TGrey 24.1.2010, 11:49 |
| Та не) После преобразования круги не совсем круглые какие-то. artsb я видимо не допонял суть. Ну я попробовал, в общем нормально, придется привыкать к таким кружкам) По видимому вопрос решен. Будут предложения - пишите. |