![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Здравствуйте, появился следующий прикол. Есть форма на ней рисуются Круги и Линии, а так же 4угольник.
Так вот если отрисовать КРУГ пока еще не нарисован 4угольник то круг выглядит нормально, но если это делать, когда 4угольник нарисован, то круг выглядит как-то странно ![]() С права нормальный вариант КРУГОВ. По сути это ГПИ(начинающий), поэтому эти элементы выделяются. Так вот если создать 4кгольник и выделить круги то результат будет как на картинке с лева, а потом если выделить 4угольник, то круги приобретают нормальную форму, как с права. Я думаю это возможно из-за того, что 4угольник может поворачиваться через XFORM и возможно координаты как-то меняются, что изменяет форму круга. Есть идеи? |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
кусочек кода был бы уместен
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| TGrey |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Так я даже не знаю, кусочек какой части кода будет уместен. Если бы я понимал причину этого эффекта, я бы возможно методом тыка, что-то надумал. А так я даже не знаю, от куда начинать.
Вот надыбал
Вот если убрать функцию Rotate(dc); то круг не изменяется.
Вот тут и есть проблема. Это сообщение отредактировал(а) TGrey - 23.1.2010, 14:59 |
||||
|
|||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
скрыть Rotate и есть метод тыка ) у меня пока 3 мысли: 1. почему SetGraphicsMode вызывается в Rotate, когда в конце вывода графики стоит SetWorldTransform (как понимаю - восстановление единичной матрицы преобразования) SetWorldTransform работает только в GM_ADVANCED, так что лучше вынести смену режима из каких-либо дополнительных методов, а самый главный GM_ADVANCED, помимо преобразований влияет еще на простые GDI-функции, так что разногласия при таких условностях в принципе закономерны 2. не считал матрицу поворота, но она должна образовываться из умножения 3-х матриц: - перенос фигуры из точки, вокруг которой нужно ее повернуть в ноль - сам поворот - перенос фигуры обратно в точку, вокруг которой нужно ее повернуть все соответствует? 3. все функции возвращают результат, можно проверить что не выполняется -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 5 Всего: 64 |
GremlinProg, прав на счёт SetWorldTransform.
Тогда лучше так:
-------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Та все вроде работает, поворачивает на все 360 градусов нормально. Я думал возможно после Фнкции поворота очистить экран, чтобы оно могла отрисовать уже с нормальными координатами. Но плохо то, что сстановка норм. коорд происходит после отрисовки 4угольника. Поэтому если потом вызывать Invalidate, то стирается и сам рисунок.
|
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Не не помогло возвращать ГрафикМод. Все равно круг выглядит странно, до тех пор пока, не выделить 4угольник.
А функция выделения устанавливает только флаг, что оно выделено. После чего обновляется окно. Но такой же эффект происходит и с выделением круга, почему оно его не возвращает в нормальное состояние |
|||
|
||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 5 Всего: 64 |
Конечно не видя кода, тяжело что-то сказать... Попробуйте например и координаты в исходное состояние вернуть:
Может для вас в этой же функции не удобно рисовать и восстанавливать координаты (я же не знаю -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Так они и так восстанавливаются.
В самом низу установка норм. коорд. + я дописал еще ГрафМод останавливать, но тоже ничего. |
|||
|
||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 5 Всего: 64 |
Сори. Не посмотрел
Странно. Надо бы всю прогу глянуть. Что и как устроено. Может вы в логике где-то ошиблись... -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| TGrey |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Так а логика тут при чем? Тут работают 3 функции.
Клик, Поворот, Отрисовка.
Вот функция клика, все что она делает это устанавливает флаг ВЫДЕЛЕНО. Больше она ни на что не влияет. Поэтому выполняется все так Click->InvalidateRect->Draw->Rotate ------------------------------ Посидев, потыкав нашел вот что. При клике по объекту вызывается функция UpdateZOrder(); которая выводит на верхний план выделенный объект, а все объекты записаны в векторе и во время отрисовки рисуются тоже по вектору. Поэтому и выходит, что если выделить 4угольник, то круг становится меньше Зордером и рисуется ДО 4угольника и значит ДО изменения координат. Потом же если выбрать круг, то 4угольк падает ниже и рисуется раньше круга, поэтому круг уже идет со смещением. Это выходит, что преобразование к нормальным координатам, устанавливает не совсем нормальные координаты как хотелось бы. А за нормальные мой друг взял
|
||||
|
|||||
| GremlinProg |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
чтобы не быть голословным, выполни следующий код в любом месте WM_PAINT
запусти программу, сделай скриншот, а теперь раскомментируй строки, запусти программу и снова сделай скриншот, сравни результаты
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||||
|
|||||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Хорошо, сейчас попробую, но у меня возникла такая идея, что раз после преобразования коорд. в норм состояние они становятся не совсем нормальными, то можно сразу в OnPaint к примеру до отрисовки чего-либо изменить их на те НЕ совсем нормальные коорды. После чего когда нарисуется повернутый четырехугольник и оно вернет коорды. в норм состояние, круги и т.п. уже будут рисоваться тоже по нем.
Тогда конечно немного странная форма останется, но по крайней мере не будет изменятся после кликов. |
|||
|
||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 5 Всего: 64 |
Я про это и толковал ;)
А может сейчас странная форма... -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Та не) После преобразования круги не совсем круглые какие-то.
artsb я видимо не допонял суть. Ну я попробовал, в общем нормально, придется привыкать к таким кружкам) По видимому вопрос решен. Будут предложения - пишите. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |