Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Свойство Canvas TImage 
:(
    Опции темы
Glorius
Дата 22.6.2007, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



Вопрос такой. Допустим на канве нарисован некий объект. Поверх него создан еще один объект, скажем в виде стрелки. Как можно стереть эту стрелку, неповредив нижележащий объект?
PM MAIL   Вверх
Klin
Дата 22.6.2007, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



имхо канва перерисовывает, поэтому нужно создать новый объект (типа канвы) и передвигать ее.


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Alexeis
Дата 22.6.2007, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



  Предварительно скопировать квадратик такого размера как стрелка на битмап, а потом, когда нужно восстановить, то нарисовать битмап обратно туда где он был.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
zkv
Дата 22.6.2007, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 92



Цитата(Glorius @  22.6.2007,  21:28 Найти цитируемый пост)
Вопрос такой. Допустим на канве нарисован некий объект. Поверх него создан еще один объект, скажем в виде стрелки. Как можно стереть эту стрелку, неповредив нижележащий объект? 

можно сконструировать свое окно, регион ему в виде стрелки установить, потом можно работать как с обычным окном. Не знаю правда как в Билдере реализуется.
PM MAIL   Вверх
Glorius
Дата 23.6.2007, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



Цитата(Alexeis @ 22.6.2007,  21:41)
Предварительно скопировать квадратик такого размера как стрелка на битмап, а потом, когда нужно восстановить, то нарисовать битмап обратно туда где он был.

Я рассматривал такой вариант, но это решение очень громоздкое какое-то. таких стрелочек может быть много, нужно постоянно, перед вставкой очередной стрелки запомнать тот участочек канвы, создать ассоциацию именно с этой стрелкой...хотелось бы решение попроще.

Добавлено через 1 минуту и 38 секунд
Цитата(zkv @ 22.6.2007,  23:13)
можно сконструировать свое окно, регион ему в виде стрелки установить, потом можно работать как с обычным окном. Не знаю правда как в Билдере реализуется.

Я могу сделать окошко ввиде стрелки...надо подумать, но опять же как-то это через ж..у по-мойму))

Добавлено через 2 минуты и 56 секунд
Цитата(Klin @ 22.6.2007,  21:30)
имхо канва перерисовывает, поэтому нужно создать новый объект (типа канвы) и передвигать ее.

А если у меня 25 таких стрелок, то осздавать 25 холстов? И еще немного не догнал методу создания новой канвы...
PM MAIL   Вверх
Alexeis
Дата 23.6.2007, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Цитата(Glorius @  23.6.2007,  10:02 Найти цитируемый пост)
А если у меня 25 таких стрелок, то осздавать 25 холстов? И еще немного не догнал методу создания новой канвы... 

  В таких случаях перерисовывают всю картинку целиком это быстрее чем восстанавливать много мелких каритнок.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
zkv
Дата 23.6.2007, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 92



Цитата(Glorius @  23.6.2007,  10:02 Найти цитируемый пост)
Я могу сделать окошко ввиде стрелки...надо подумать, но опять же как-то это через ж..у по-мойму))

через ж.. или нет понятно только тебе, так как ты один знаешь условие задачи. 
Я предложил альтернативу, выбор за тобой. 

Если тебе нужно просто программно двигать свои стрелки, то создание окна для этого, возможно(!), перебор, но если нужен еще какой-либо функционал (реагирование на клавиатуру, мышь, еще что нить) то этот вариант избавит от изобретения многих велосипедов.

Кстати, может ты просто не правильно реагируешь на слово "окно", в курсе что все контролы (кнопки, комбо-боксы и пр.) по сути - окна? Возьмем тот же static-text (не знаю как в Билдере правильно называется) - получается для вывода строки текста, мы создаем целое окно! - это тоже через ж.. придумали?

Это сообщение отредактировал(а) zkv - 23.6.2007, 16:32
PM MAIL   Вверх
Glorius
Дата 23.6.2007, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



Цитата(zkv @ 23.6.2007,  16:30)
через ж.. или нет понятно только тебе, так как ты один знаешь условие задачи. 
Я предложил альтернативу, выбор за тобой. 

Если тебе нужно просто программно двигать свои стрелки, то создание окна для этого, возможно(!), перебор, но если нужен еще какой-либо функционал (реагирование на клавиатуру, мышь, еще что нить) то этот вариант избавит от изобретения многих велосипедов.

Кстати, может ты просто не правильно реагируешь на слово "окно", в курсе что все контролы (кнопки, комбо-боксы и пр.) по сути - окна? Возьмем тот же static-text (не знаю как в Билдере правильно называется) - получается для вывода строки текста, мы создаем целое окно! - это тоже через ж.. придумали?

Я поясню тогда задачу. На канве компонента TImage я создаю расчетную схему балки. Балка - это прямая жирная линия, она никогда не меняется. Нагрузка на балку двух типов - сосредоточеная сила в виде стрелки и распределенная нагрузка в виде тонкой горизонтальной прямой линии (длиной, соглосно действующей нагрузки) и от этой линии вниз идут маленькие стрелочки. Так вот большие стрелки сосредоточенных сил могут и будут пересекаться с распределенной нагрузкой. Я хочу сделать так, чтобы пользователь мог удалять ошибочно введенные нагрузки без ущерба для остального рисунка. Прихожу к выводу, что нужно постоянно перерисовывать весь рисунок в таком случае.
PM MAIL   Вверх
_hunter
Дата 25.6.2007, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



что через ж а что нет определяется очень легко: реализуем самый простой вариант (минимум кода) -- а именно перерисовку всего окна. если при таком варианте нет заметных морганий -- останавливаемся на этом варианте. если есть -- реализуем другой.
кстати. создать ассоциированные битмапы -- не так уж и сложно: создаем постой битмап и кладем его в map'у (с id == id стрелки (стрелка should be классом (хотя можно и ее указатель использовать...))


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Glorius
Дата 25.6.2007, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



Цитата(_hunter @ 25.6.2007,  10:42)
что через ж а что нет определяется очень легко: реализуем самый простой вариант (минимум кода) -- а именно перерисовку всего окна. если при таком варианте нет заметных морганий -- останавливаемся на этом варианте. если есть -- реализуем другой.

hunter, похоже это действительно самый правильный вариант, поскольку графической информации должно быть не так уж и много.

Но меня еще интересует и вопрос перемещения графических объектов мышкой (это из другой программы). Как это лучше делать?
PM MAIL   Вверх
Lazin
Дата 25.6.2007, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 18
Всего: 154



Цитата

Допустим на канве нарисован некий объект. Поверх него создан еще один объект, скажем в виде стрелки. Как можно стереть эту стрелку, неповредив нижележащий объект?

Если нужно быстро перерисовать часть изображения, можно использовать Xor. Сначала рисуешь фон, затем устанавливаешь ...->Canvas->Pen->Mode = pmXor и рисуешь стрелку. Когда надо перерисовать, сначала рисуешь стрелку ещё раз (Pen->Mode = pmXor), после этого остаётся только фон, затем рисуешь её в другом месте.
Код

void __fastcall TForm1::Image2MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
    static int _x = -20, _y = -20;
    Image2->Canvas->Pen->Mode = pmXor;
    Image2->Canvas->Brush->Style = bsNone;
    Image2->Canvas->Ellipse(_x-10,_y-10,_x+10,_y+10);
    Image2->Canvas->Ellipse(X-10,Y-10,X+10,Y+10);
    _x = X;
    _y = Y;
}

PM MAIL Skype GTalk   Вверх
_hunter
Дата 25.6.2007, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



а вот для перемещения уже желательно переходить на классы: тогда (при опускании кнопки) просто пробегаем по вектору стрелок и смотрим лежит ли точка в пределах стрелки (метод класса "стрелка") если лежит -- при перемещении мыши задаем стрелке новые координаты и перерисовываем экран.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Glorius
Дата 25.6.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



Hunter, спасибо. smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1310 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.