RUS  ENG 

Прорисовка объекта

Страницы: 1
RSS
Прорисовка объекта
 
Добрый день!
Как прорисовать объект(Delphi 7.0), который находится в одном из форматов(.ico gif и т.д.)
Вчастности меня интересует к какому методу нужно обращатся.
Зарание благодарен!!!
 
Похоже, это к Zulu вообще не относится.
В Delphi есть компонент TImage.
У него есть возможность Image.Picture.LoadFromFile().
 
Извините, я наврное не совсем коректно поставил вопрос:-(
Попробую еще раз:
существует карта. при определенных событиях на эту карту
нужно нанести графический объект(зарание известной формы).
Я вижу две проблемы:
1. я не знаю в каком формате хранить объект который будет
наносится на карту(так как этих объектов может быть множество
и при разных событиях нужно будет наносить разные объекты)
2. какой метод будет прорисовывать вышеуказаный объект на карте.
Я ожидаю что должно быть что-то типа CtrlMapZulu.Map.Layers.Active.drawOBJECT(OBJECT);
по аналогии к прорисовке поли-линии:
CtrlMapZulu.Map.Layers.Active.AddPolyLine(Poly,Style,-1,-1)
которая у меня успесно заработала:-)
Оговорюсь что объект как правило представляет собой, геометрическую фигуру(
например: объединение круга и триугольника и т.д.)

Зарание благодарен!!!
 
Видите ли, CtrlMapZulu.Map.Layers.Active.AddPolyLine(Poly,Style,-1,-1) не прорисовывает линию, а добавляет новый объект-линию в слой, а она (объект-линия) и рисоваться окном карты будет, и печататься и т.д.
Для того, чтобы наносить на карту какие-то объекты (или перемещать имеющиеся), Вы можете создать символы (можно программно), а потом по событиям добавлять символьные объекты, т.е. точечные объекты, которые будут отображаться в виде пиктограмм(символов), которые Вы создали. Символ может состоять как из примитивных геометрических фигур (как у Вас - круг с треугольником), так и содержать небольшие bitmap'ы.
См. Symbol.AddXXXX, Symbols.AddItem, Layer.AddSimpleSymbol
 
Добрый день!!!
Возникли следующие вопросы:
1. Существует растровое изображение add.bmp, я его загружаю в символ, вот таким образом
var sym:Isymbol;
SymbolId:integer;
begin
CtrlMapZulu.Map.EditMode:=eEditModeSymbol;
sym:=coSymbol.Create;
CtrlMapZulu.Map.Layers.Active.Symbols.AddItem(sym);
CtrlMapZulu.Map.Layers.Active.Symbols.Item[0].AddImagePath('add.bmp',100,100);
SymbolID:= CtrlMapZulu.Map.Layers.Active.Symbols.Item[0].Id;
//далее хочу просмотреть этот символ с помощью страндартного компонента Img : Timage;
//по аналогии примеру на Basic, который был любезно предоставлен вами.
Img.Picture.Bitmap:=CtrlMapZulu.Map.Layers.Active.Symbols.ItemById[SymbolID].Picture;
end;
Проблема:
Идет не согласование типов данных моего типа данных Bitmap и вашего IPictureDesp.
Что можно предпринять????

2. Если в приведенном мною выше примере, я правильно загрузил растнорвое изображения
в символ и этот символ был создан, какая команда добавит символ с номером SymbolId на
карту???? Предполагаю что это будет следующий код, но он не срабатывает:
hDC:= GetDc(FrMain.Handle);
CtrlMapZulu.Map.Layers.Active.Symbols[0].Draw(hDC,100,100,10,0);
ReleaseDC(FrMain.Handle,hDC);}

3. Походу возник еще вопрос: когда я загружаю AddImagePath('add.bmp',X,Y)
м прорисовываю символ Draw(hDC,X1,Y1,10,0), я указываю координады X,Y,X1,Y1.
Вопрос: положение объекта на карте будет равно X+X1, Y+Y1/
Будьте добры разьяснить данный ньюанс.

Зарание благодарен!!!
 
1. Св-во Picture возвращает стандартный OLE тип IPictureDisp, разумеется, что свойству типа TBitmap его не приравняешь. Кроме того, Picture, возвращаемый символом - это metafile. Т.о. Вы можете у IPictureDisp взять св-во Handle и попробовать приравнять это хэндл так: Img.Picture.MetaFile.Handle = handle;
Имейте в виду, что OLE-объект Picture поддерживает также интерфейс IPersistStream. Так что Вы можете сохранить картинку в IStream независимо от ее формата, чтобы потом использовать дельфийские методы LoadFromStream (см. также TOleStream)
2. В приведенном примере Вы пытаетесь нарисовать символ в контекст устройства. Добавить символ можно именно в СЛОЙ (т.е. в графическую базу), а слой, будучи загруженный в карту будет отображен со всеми своими объектами. Поэтому, добавляем символ в слой так: CtrlMapZulu.Map.Layers.Active.AddSimpleSymbol. X и Y - координаты на местности.
3. Символ содержит объекты, которые расположены на внутреннем воображаемом поле 256х256 точек. X и Y у AddImagePath - положение bitmap'а внктри символа. Дальше этот символ, отображаясь на карте будет масштабироваться. Поэтому положение картинки на экране будет X1 + X * Scale, Y1 + Y * Scale
 
Приношу свои извенения но ваш
MapCtrl1.Map.Layers.Active.Symbols.ItemById(SymbolID).picture
не содержит handle
MapCtrl1.Map.Layers.Active.Symbols.ItemById(SymbolID).picture.handle - не правильно
Как получить handle из MapCtrl1.Map.Layers.Active.Symbols.ItemById(SymbolID).picture?????????????????
 
Да нет, он не "наш", это стандартный OLE объект Picture, который возвращает интерфейс IPictureDisp (а также поддерживает IPicture, IPersistStream и прочие) (см. документацию по OLE, или MSDN). Если Вы не можете средствами Delphi получить свойство Handle, можно воспользоваться процедурой SetOlePicture (увидел такую в описании по VCL к Delphi 7).
Страницы: 1