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