![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Здравствуйте, пишу приложение с графическим интерфейсом и на данный момент происходит слишком много бликов. С этим я пока ничего не делал, но возникла другая проблема. По сути соединяются 2 объекта линией. И получается что если создать:
1 объект Линия 2 Объект то при перемещении концы линии рисуются у объекта создавая эффект положения на месте. Но если создать в таком порядке, то линия рисуется раньше чем второй объект и перед тем, как конец линии будет дорисован возле объекта видно, что линия тоже двигается. Так я вот что подумал, это же видно только если рисовать прямо на канву формы, но если построить изображение в буффере, а потом вывести его полностью, то этого не будет. Сделал значит я буфер и получил значит все тоже самое, только мигает сильнее
Не пойму почему оно движение линии продолжает рисовать если по идее рисунок уже должен быть цельным?! Что посоветуете? |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
TGrey, что такое "движение линии"?
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Ну графический интерфейс. Линия это объект, выделили ее одним кликом и потащили мышкой в другое место. Если имеются другие объекты к которым подключена линия(прямоугольник к примеру), то при его отрисовке конец, которым подключена линия рисуется возле прямоугольника. И выходит, что если линия в векторе объектов находится раньше второго прямоугольника, а значит рисуется раньше, видно что она пытается двигаться, хоть сразу при отрисовке второго прямоугольника линию перерисовывает в нужно место, но этот эффект не очень желателен.
Как я сказал, если в теории выдавать все на задний буфер, а потом полностью уже на форму, то по идее оно не должно так дергать линии, ведь рисунок уже будет полный. На рисунке, что прикрепил линия соединяет 2 прямоугольника и я ее пытаюсь перетянуть и как видно 2 конец, где-то в стороне. Присоединённый файл ( Кол-во скачиваний: 7 )
error.JPG 26,28 Kb |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
верно, так и будет, если вышеприведенный код вызывается только в ответ на сообщение WM_PAINT, если это не так, то заводить задний буфер смысла нет, т.к. для него не выполнено главное условие: единовременный вывод буфера на передний план -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Да тот код вызывается в WM_PAINT, почему же я и говорю, что никакой разницы, только моргает в 2 раза больше и заметнее.
Это сообщение отредактировал(а) TGrey - 24.2.2010, 17:54 |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
здесь ключевое слово не "WM_PAINT", а "только WM_PAINT"
если стало моргать сильнее, значит увеличилось число перерисовок (число смен цвета на пиксел), поэтому я и предлагаю проверить этот момент, хотя конечно, если WM_ERASEBKGND не контролируется, двойной буфер от морганий так же не спасет, только вот сила моргания от этого не зависит -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Что значит только WM_PAINT? У меня отрисовка всех элементов в этом сообщении только записана. Остальные действия вызывают Invalidate тем самым вызывая перерисовку. Что мне еще проверять?
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
например отсутствие UpdateWindow после Invalidate в любом виде, хоть через RedrawWindow или явные вызовы методов прорисовки при движении мыши и т.п., т.к. видимость вот этого движения линии от присоединенного к ней объекта говорит о том, что изменение координат и линии и этих объектов производится с некоторым отставанием друг от друга с разбавлением этого процесса перерисовкой если конечно я правильно понял проблему неплохо бы было посмотреть именно этот момент, я так понимаю - WM_MOUSEMOVE, а лучше всю связку: HITTEST-DOWN-MOVE-UP Добавлено через 1 минуту и 42 секунды а еще лучше - прикрепить к этому собранный бинарник для наглядности -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Во всех сообщениях мыши вызываются виртуальные функции которые рассчитывают клик, перемещение и другие функции над объектами. И в конце каждого сообщения
InvalidateRect(hwnd, NULL, true); Для теста сперва создать Проводник, а потом два любых объекта и соединить их проводником. Выделение снимать Еск. Это сообщение отредактировал(а) TGrey - 26.2.2010, 01:35 Присоединённый файл ( Кол-во скачиваний: 5 )
TOE.rar 106,42 Kb |
|||
|
||||
| GremlinProg |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
посмотрел,
тут дело не в прорисовке, неправильно производится перемещение объектов, т.е. привязка смещения для мыши должна быть постоянной, а у тебя ее скорее всего нет, надо делать примерно так: при старте перемещения:
это первое, второе - это то, что привязанный проводник пытается самостоятельно двигаться, т.е. каша у тебя в перемещениях и видимо в структуре самих объектов, выдели проводники как отдельный объект и работай с ними отдельно, это же не точечный объект, и двигать-то его не надо, либо, если уж и двигать, то совсем по-другому: с перемещением связных объектов, т.е. в любом случае, первым делом надо отделить отрезки от точек -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Насчет того, что оно перекидывает объект на центр курсора это я знаю думал потом профиксить.
Не понял, что нужно сделать для проводника? Что значит пытается двигаться самостоятельно? Он же и так вроде один и должен перемещаться если его тянуть? А если конец прикреплен к чему либо, то я рассчитывал, что оно в общей картинке отрисует конец в месте соединенияи проблем не должно было быть. Не понял, что имелось ввиду под !"это же не точечный объект, и двигать-то его не надо" и "первым делом надо отделить отрезки от точек ". Буду благодарен за пояснения. |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
нет, это как раз работает нормально (при залипании мыши на таких мелких точках, центрирование курсора - нормально) ну соедини проводник с 2-мя объектами и попробуй его переместить, видно, что производится попытка его двигать, а присоединенные объекты ему этого сделать не дают, проводник бьется в конвульсиях - это ненормально соединяющая линия обычно не живет своей жизнью, т.к. ее смысл как раз в объединении нескольких объектов, какой смысл ее двигать, пусть она опирается на координаты соответствующих присоединенных объектов, тогда ее и двигать не придется: сама будет двигаться за объектами при их перемещении значит делаем не 1 массив объектов, а 2 в первом будут отрезки, во втором - объекты вместо концов отрезков можно указать номера объектов, тогда привязка будет корректной всегда, не придется постоянно синхронизировать координаты -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Но проводник идет с расчетом на то, что его можно отсоединить, переключить, сторону переместить... В таком случае я могу дописать проверку, что если сторона подключена, то пропускать вызов функции перемещения конца.
Ну так а с миганием, что делать то?) |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
с миганием уже сказал: контролировать, или просто перекрыть WM_ERASEBKGND:
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Здается мне, что я уже пробовал и эффект был плохим. А так же посылал в Инвалидат последний параметр ФОЛС. Попробую сейчас еще.
Добавлено через 8 минут и 56 секунд О спасибо все получилось. Дело в том, что когда я пробовал, то я запрещая удаление бекграуна сразу рисовал, но форме. Потому там получалась каша из всего, что есть. А сейчас заливая битмап цветом фона после чего рисуя на нем все элементы и выводя готовое в окно все мерцание пропало Оно хоть никак не влияет на систему, что оно постоянно рисует поверх? Это так на всякий случай. |
|||
|
||||
![]()
|
| Правила форума "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. |