
| Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
![]() |
||
Движущаяся линия в GDI+
|
||
| Философия, технологии, алгоритмы! |
![]() |
|
|
Опции темы |
|
|
#1 |
|
///
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45
|
Движущаяся линия в GDI+
Господа, нужна помощь.
Работаю в Builder XE, использую для рисования графики GDI+. На TImage нарисована сеточка, а на сеточке толстая линия. Хочу перемещать эту линию нажатием на ее концы. То есть при перемещении линия должная стираться и рисоваться в новом месте. Как это сделать? Если я буду каждый раз перерисовывать фон, будет мерцание. Может есть какой-то способ рисовать линию создавая ее как объект с параметрами? Наверняка в GDI есть какая-то функция для этого. Спасибо. |
|
|
|
#2 | |
|
Форумец
Сообщений: 44,543
Регистрация: 27.05.2003
Возраст: 48
|
Цитата:
быренько всё перерисовываем LockWindowUpdate(NULL);//Разрешили реальную отрисовку на экране InvalidateRect(хэндл окна, NULL, FALSE);//Пометили всё окно как требующее перерисовки UpdateWindow(хэндл окна);//Принудительно перерисовали Это если через чистый GDI работать. |
|
|
|
|
#3 | |
|
Registered User
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 58
|
Цитата:
2. Координаты того чего хочешь нарисовать хранишь в массиве. 3. Я рисовал всё на PaintBox. Вешаешь в обработчике OnPaint. то что хочешь нарисовать. И когда происходит его вызов делаешь следующее. 3.1. Очищаешь холст. 3.2. Рисуешь координатную сетку (или что там у тебя) 3.3 Рисуешь из массива свои линии. (Скорее всего у тебя, координаты и матрица смежности, в случае если они соединены). Делал по такому принципу. Мерцаний не заметил. Есть ещё метод когда сначала создают массив TBitMap и рисуют там, потом его копируют на холст. Но я делал по 1-ому способу и было всё ок. |
|
|
|
|
#4 | |
|
///
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45
|
хм... что-то не догоняю.
Вот мой код: Цитата:
|
|
|
|
|
#8 |
|
///
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45
|
Сделал на OnMouseMove - получилось. Тормозило. Но когда отключил сглаживание при прорисовке сетки - тормозить перестало. Линии то в сетке ортогональные.
Но это же временный вариант. А если у меня на фоне картинка будет - каждый раз ее перерисовывать - это жуть. |
|
|
|
#9 |
|
Registered User
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 58
|
Я вопроса не понял.
Что касается PaintBox. Он сам перерисовыватся не может для этого ему нужно обрабатывать метод OnPaint. Тут идеология следующая. изменил значение->нарисовал. 1. В OnPaint у тебя рисуется то что находится в массиве. 2. На onMouseMove, onMouseDown, onMouseUp изменяешь координаты нужных линий. После этого вызываешь OnPaint. Таким образом, у тебя и данные изменяются и программа корректно их отображает. А TImage насколько я понял, может сам "перерисовываться". Вот от этого и нужно отталкиваться. Тем более TImage в основном для хранения и обработки картинок используют. А тебе активно рисовать нужно, так что сам думай ![]() Upd. Я понял что ты хотел сказать. В принципе ты написал то-же что я тебе предложил. Т.е. у меня тоже в OnMouseMove в конце вызывалась перерисовка. |
|
|
|
#10 |
|
Форумец
Сообщений: 44,543
Регистрация: 27.05.2003
Возраст: 48
|
|
|
|
|
#12 | |
|
///
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45
|
Вот что выясняется в ходе экспертиментов:
1. Без Inavalidate не работает. То есть даже TImage нужна принудительная перерисовка. 2. Если на OnMouseMove поставить загрузку картинки в TImage - invalidate не нужен. Получилось реально работающее вот что: Цитата:
|
|
|
|
|
#13 | ||
|
///
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45
|
Spectator,
Цитата:
В общем-то спасибо за советы. А то я уж грешным делом думал для каждой линии свой прозрачный TImage рисовать. Линий всего 4, но в планах еще одна программа другого назначения, но похожей структуры,там линий будет до 200... Цитата:
Учитывая, что нет onPaint, непонятно, где надо рисовать. |
||
|
|
|
#14 | |
|
Форумец
Сообщений: 44,543
Регистрация: 27.05.2003
Возраст: 48
|
Цитата:
Выкинь его нахрен, он не для рисования предназначен, а для загрузки картинок, что вполне понятно из названия. Рисуй прямо на канве формы. |
|
|
|
|
#18 | |
|
Форумец
Сообщений: 44,543
Регистрация: 27.05.2003
Возраст: 48
|
Цитата:
Изврат еще тот. |
|
|
|
|
#19 |
|
Форумец
Сообщений: 248
Регистрация: 17.01.2005
|
На заборе тоже пишут, а там дрова. Если качество работы тебя устраивает, то оставляй, как есть. Там проблемы могут быть в основном только с масштабированием, насколько я помню. Я бы использовал TPaintBox или как он там.
|
|
|
|
#20 |
|
Форумец
Сообщений: 248
Регистрация: 17.01.2005
|
PaintBox - это обычный Cancas
Картинку грузить как обычно, через TBitMap загрузить используя LoadFromFile картинку, потом установить размеры для PaintBox, а потом PaintBox.Canvas.Draw для экземпляра TBitMap. Извини, точнее по методам не скажу, потому что Borland жлобит выкладывать справку по компонентам своим в свободный доступ. |
|
|
|
#21 |
|
Форумец
Сообщений: 44,543
Регистрация: 27.05.2003
Возраст: 48
|
|
|
|
|
#22 |
|
Registered User
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 58
|
|
|