Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
 Аватар для laplace
0 / 0 / 0
Регистрация: 03.08.2011
Сообщений: 6

компонент карта/план с подвижными маркерами

05.08.2011, 09:15. Показов 3229. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Требуется объект, способный выводить на экран карту/план с отмеченными маркерами. Маркеры перемещаются по карте. Компоненту передаются данные о координатах маркера (целочисленные значения), его цвете и форме. Всего одновременно до 12 маркеров, есть вероятность, что у двух маркеров окажутся одинаковые координаты, объект должен с этим справляться. Есть ли готовые решения, или придется писать свой компонент? Если писать самому, то на основе чего?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.08.2011, 09:15
Ответы с готовыми решениями:

Карта с маркерами из картинки
Добрый день! Подскажите пожалуйста, есть карта в виде большой картинки. Нужно сделать оконное приложение с этой картой и...

Карта-план здания
Привет народ. Есть достаточно большое здание. нужно сделать сайт на котором будет карта этого здания ну там где выходы где какие кабинеты....

Выставить компонент на передний план
Привет есть DesktopPane в нем у меня есть JToolbar подскажите как выставить JToolbar на передний план то есть что бы он...

15
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.08.2011, 14:15
Думаю лучше свой, вроде не сильно сложно, да и всеровно придется со временем доробатывать как это обычно бывает.

Я бы писал в TImage и работал с его Canvas. Добавил бы в компонент Bitmap в который загружал изображение маркера, а потом бы его прорисовывал в нужнем месте Imag-a.

А обязательно компонент нужен?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
05.08.2011, 14:27
Карту хорошо иметь в векторном формате, типа WMF, EPS и т.п., иначе никаких ресурсов не напасешься, я так понимаю. А вот грузится ли все это в Image ?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.08.2011, 14:41
С этим согласен недостаток...
Да и рисовать кажется на канве можно если только .bmp
Ну тут думать надо о конкретном решении возможно и подойдет.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
05.08.2011, 14:48
если самое простое-доступное решение, можно использовать обычные динамически создаваемые или не динамические, если известно, что их 12, метки (TLabel) для маркеров, присвоив им в виде капшена стрелочку, (сhar)17; , кажется, и размещая метки по координатам поверх Image. да, и тогда по одним координатам можно хоть тыщу меток разместить, а вот как рисунок подгружать, это уже совсем другая проблема.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.08.2011, 15:08
Ну с метками это уже частное решение можно и панельки на которых Imag-ы двигать.

Добавлено через 3 минуты
Не могу найти файлы что бы проверить откроит ли TImage.

Добавлено через 11 минут
Но должен...
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
05.08.2011, 15:13
если вы имеете ввиду векторные файлы, то открываете КорелДро, рисуете там всякие линии в виде улиц и домики в виде квадратиков, сохраняете или экспортируете в нужный формат
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.08.2011, 15:30
Открывает, создавал wmf c помощью M Visio.

Добавлено через 1 минуту
Но такое не канает:
C++
1
2
Image1->Canvas->MoveTo(100,0);
Image1->Canvas->LineTo(100,200);
0
 Аватар для laplace
0 / 0 / 0
Регистрация: 03.08.2011
Сообщений: 6
07.08.2011, 10:29  [ТС]
План рисую и загружаю тоже я, так что могу сделать его в любом формате. Начал писать на основе TImage. Маркеры рисую в виде кружков, методом canvas->ellipse(). Проблема со стиранием маркера и восстановлением изображения под ним. Сейчас использую метод xor, и для стирания перерисовываю маркер поверх старых координат. Такой метод не подойдет, если фон не однотонный. Думаю лучше запоминать участок изображения под маркером, и после перемещения его восстанавливать. Есть пример кода?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.08.2011, 18:28
Я загружал сначала весь фоновый рисунок не в Image а в созданный в нем BitMap и при перерисовках
делал:
C++
1
2
this->Assign(this->BitMap);  // где  this -наш Image, BitMap  - Graphics::TBitmap
Canvas->Ellipse(...);  // Перерисовка с новыми коодинатами
Для подавления мерцаний Form...->DoubleBuffered = true;
Опять таки другой вариант:

h-файл компонента
C++
1
2
3
4
5
6
7
8
9
10
11
class PACKAGE TmyPanel : public TPanel    
{
private:
   TImage *Im;
protected:
public:
   TImage *Marker;
        __fastcall TmyPanel(TComponent* Owner);
        __fastcall ~TmyPanel() {delete Im,Marker; };
__published:
};
cpp-файл компонента
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
__fastcall TmyPanel::TmyPanel(TComponent* Owner)
        : TPanel(Owner)
{
Width = 400;
Height = 400;
 
Im = new TImage(this);
Im->Parent = this;
Im->Align = alClient;
Im->Stretch = true;
 
Im->Picture->LoadFromFile("Фон.bmp");
 
Marker = new TImage (this);
Marker->Parent = this;
 
Marker->Canvas->Brush->Color = clLime;
Marker->Canvas->FillRect(Marker->BoundsRect);
Marker->Canvas->Pen->Color = clRed;
Marker->Width = 20;
Marker->Height = 20;
Marker->Canvas->Ellipse(0,0,20,20);
Marker->Transparent = true;
 
Marker->Left= Width/2;
Marker->Top= Height/2;
}
Перемещение маркера:
C++
1
2
myPanel1->Marker->Left=...;
myPanel1->Marker->Top=...;
Естественно можно создавать маркера динамически взависимости от необходимого их количества,а также загружать картинку для маркера, создать методы для перемещения и создания,удаления маркеров...
0
 Аватар для laplace
0 / 0 / 0
Регистрация: 03.08.2011
Сообщений: 6
08.08.2011, 16:32  [ТС]
Примерно таким путем и иду, только зачем панель? Пишу сразу на основе Image. Или при таком подходе возможны проблемы?
Маркеры рисую в TBitmap, потом копирую в Image->Picture->Bitmap, но при таком подходе мерцание при перерисовке. Как можно с этим справиться?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.08.2011, 19:13
Если я не ошибаюсь Image не может быть родителем именно поэтому используется панель.

Мерцания: Form...->DoubleBuffered = true;
0
 Аватар для pomkalk
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
08.08.2011, 22:14
Вот смотрите, вы наследуете от TPanel, в чем прикол, не пойму, если вы потом будете рисовать на TImage!
Я бы сделал так(можно компонент создать из всего этого) - сделал класс, который будет рисовать саму карту, из передаваемой в него картинки - саму местность, план!, далее в этом классе динамический список объектов(Для примера TList или простой однонаправленный список) - тобишь маркеров, которые будут перерисовываться вместе с самой мапой(планом) + класс отвечает за функционал, а именно добавление удаление маркеров, и перерисовка всего этого добра!

Был бы у меня Буилдер, я б тебе накал пример!
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.08.2011, 23:32
Панель выступает как контейнер, только для того что бы на ней разместить несколько Image-в один фон,остальные маркеры...
Думаю просто перемещать imag-ы -маркеры на поверхности панели думаю легче чем организовать перерисовку Canvas и нет необходимости выдумывать новый класс для маркеров.
0
 Аватар для pomkalk
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
09.08.2011, 00:10
Легко, но глупо!
Необходимость есть, если есть вероятность что ты когда то это будешь как то усовершенствовать! в твоем случае, придется все переделывать, в моем, доделывать, надеюсь разница понятна! И в моем варианте конструктор так же ко всей этот системе сделать можно, что бы можно было масштабировать, добавлять/удалять маркеры, и прочие действия(например что бы появлялась подсказка с картинкой) или еще что то подобное!
У меня Буилдера нет, по этому если хочешь я тебе заготовку сделаю, а ты будешь доделывать + я буду подсказывать что и как!
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.08.2011, 01:02
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class PACKAGE TmyPanel : public TPanel
{
private:
   TImage *Im;
 
protected:
public:
      vector <TImage*> Marker;
        __fastcall TmyPanel(TComponent* Owner);
        TImage* __fastcall AddMarker();
        __fastcall ~TmyPanel();
__published:
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//---------------------------------------------------------------------------
__fastcall TmyPanel::TmyPanel(TComponent* Owner)
        : TPanel(Owner)
{
Width = 400;
Height = 400;
 
Im = new TImage(this);
Im->Parent = this;
Im->Align = alClient;
Im->Stretch = true;
 
Im->Picture->LoadFromFile("Ôîí.bmp");
}
//---------------------------------------------------------------------------
TImage* __fastcall TmyPanel::AddMarker()
{
TImage *NewMarker = new TImage (this);
NewMarker->Parent = this;
 
this->Marker.push_back(NewMarker);
 
NewMarker->Canvas->Brush->Color = clLime;
NewMarker->Canvas->FillRect(NewMarker->BoundsRect);
NewMarker->Canvas->Pen->Color = clRed;
 
NewMarker->Width = 20;
NewMarker->Height = 20;
 
NewMarker->Canvas->Ellipse(0,0,20,20);
NewMarker->Transparent = true;
 
NewMarker->Left= Width/2;
NewMarker->Top= Height/2;
 
return NewMarker;
}
//---------------------------------------------------------------------------
__fastcall TmyPanel::~TmyPanel()
{
delete Im;
for (int i=0;i<Marker.size();i++) delete Marker[i];
};
//---------------------------------------------------------------------------
Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
TForm1 *Form1;
TmyPanel *Panel;
int n;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
Panel= new TmyPanel(this);
Panel->Parent = this;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Panel->AddMarker();
Panel->Marker[n]->Left = 40*n;
Panel->Marker[n]->Top  = 40*n;
n++;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
delete  Panel;
}
//---------------------------------------------------------------------------
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.08.2011, 01:02
Помогаю со студенческими работами здесь

Компонент StringGrid на задний план
Хочу Label поверх компонента StringGrid(таблица) поставить. Упорно проваливается под него. Пробовал Send to back на таблице и обратную...

Как компонент, перекрытый другими, поместить на передний план
Народ, подскажите: Есть форма, на ней два элемента: toolStrip и datagridview. toolStrip, располагается сверху (Dock =Top ) ...

Вариационная задача с двумя подвижными границами
Привет всем, решая данную задачу с двумя подвижными границами: ▼ Задача Даны два взаимно перпендикулярных луча ОА и ОВ с общей вершиной...

Компонент "Карта сайта"
Подскажите, пожалуйста, можно ли в битриксе сделать помимо общей карты сайта, еще одну, отдельную для многоуровневого раздела?

Список с разными маркерами
Как правильно сделать список чтобы у каждого элемента списка была своя картинка-маркер? создал Вот такой список: &lt;div...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru