Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 03.08.2011
Сообщений: 6
1

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

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


Доброго времени суток.
Требуется объект, способный выводить на экран карту/план с отмеченными маркерами. Маркеры перемещаются по карте. Компоненту передаются данные о координатах маркера (целочисленные значения), его цвете и форме. Всего одновременно до 12 маркеров, есть вероятность, что у двух маркеров окажутся одинаковые координаты, объект должен с этим справляться. Есть ли готовые решения, или придется писать свой компонент? Если писать самому, то на основе чего?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.08.2011, 09:15
Ответы с готовыми решениями:

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

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

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

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

15
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,390
Записей в блоге: 29
05.08.2011, 14:15 2
Думаю лучше свой, вроде не сильно сложно, да и всеровно придется со временем доробатывать как это обычно бывает.

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

А обязательно компонент нужен?
0
LK
Заблокирован
05.08.2011, 14:27 3
Карту хорошо иметь в векторном формате, типа WMF, EPS и т.п., иначе никаких ресурсов не напасешься, я так понимаю. А вот грузится ли все это в Image ?
0
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,390
Записей в блоге: 29
05.08.2011, 14:41 4
С этим согласен недостаток...
Да и рисовать кажется на канве можно если только .bmp
Ну тут думать надо о конкретном решении возможно и подойдет.
0
LK
Заблокирован
05.08.2011, 14:48 5
если самое простое-доступное решение, можно использовать обычные динамически создаваемые или не динамические, если известно, что их 12, метки (TLabel) для маркеров, присвоив им в виде капшена стрелочку, (сhar)17; , кажется, и размещая метки по координатам поверх Image. да, и тогда по одним координатам можно хоть тыщу меток разместить, а вот как рисунок подгружать, это уже совсем другая проблема.
0
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,390
Записей в блоге: 29
05.08.2011, 15:08 6
Ну с метками это уже частное решение можно и панельки на которых Imag-ы двигать.

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

Добавлено через 11 минут
Но должен...
0
LK
Заблокирован
05.08.2011, 15:13 7
если вы имеете ввиду векторные файлы, то открываете КорелДро, рисуете там всякие линии в виде улиц и домики в виде квадратиков, сохраняете или экспортируете в нужный формат
0
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,390
Записей в блоге: 29
05.08.2011, 15:30 8
Открывает, создавал wmf c помощью M Visio.

Добавлено через 1 минуту
Но такое не канает:
C++
1
2
Image1->Canvas->MoveTo(100,0);
Image1->Canvas->LineTo(100,200);
0
0 / 0 / 0
Регистрация: 03.08.2011
Сообщений: 6
07.08.2011, 10:29  [ТС] 9
План рисую и загружаю тоже я, так что могу сделать его в любом формате. Начал писать на основе TImage. Маркеры рисую в виде кружков, методом canvas->ellipse(). Проблема со стиранием маркера и восстановлением изображения под ним. Сейчас использую метод xor, и для стирания перерисовываю маркер поверх старых координат. Такой метод не подойдет, если фон не однотонный. Думаю лучше запоминать участок изображения под маркером, и после перемещения его восстанавливать. Есть пример кода?
0
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,390
Записей в блоге: 29
07.08.2011, 18:28 10
Я загружал сначала весь фоновый рисунок не в 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
0 / 0 / 0
Регистрация: 03.08.2011
Сообщений: 6
08.08.2011, 16:32  [ТС] 11
Примерно таким путем и иду, только зачем панель? Пишу сразу на основе Image. Или при таком подходе возможны проблемы?
Маркеры рисую в TBitmap, потом копирую в Image->Picture->Bitmap, но при таком подходе мерцание при перерисовке. Как можно с этим справиться?
0
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,390
Записей в блоге: 29
08.08.2011, 19:13 12
Если я не ошибаюсь Image не может быть родителем именно поэтому используется панель.

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

Был бы у меня Буилдер, я б тебе накал пример!
0
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,390
Записей в блоге: 29
08.08.2011, 23:32 14
Панель выступает как контейнер, только для того что бы на ней разместить несколько Image-в один фон,остальные маркеры...
Думаю просто перемещать imag-ы -маркеры на поверхности панели думаю легче чем организовать перерисовку Canvas и нет необходимости выдумывать новый класс для маркеров.
0
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
09.08.2011, 00:10 15
Легко, но глупо!
Необходимость есть, если есть вероятность что ты когда то это будешь как то усовершенствовать! в твоем случае, придется все переделывать, в моем, доделывать, надеюсь разница понятна! И в моем варианте конструктор так же ко всей этот системе сделать можно, что бы можно было масштабировать, добавлять/удалять маркеры, и прочие действия(например что бы появлялась подсказка с картинкой) или еще что то подобное!
У меня Буилдера нет, по этому если хочешь я тебе заготовку сделаю, а ты будешь доделывать + я буду подсказывать что и как!
0
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,390
Записей в блоге: 29
09.08.2011, 01:02 16
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2011, 01:02

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

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

Вариационная задача с двумя подвижными границами
Привет всем, решая данную задачу с двумя подвижными границами: ▼ Задача Даны два взаимно...

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.