На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Отобразить графический объект в стороннем окне

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Отобразить графический объект в стороннем окне
 
Здравствуйте господа разработчики !

Имеется некий графический объект нарисованный в диалоге medChoicePointImage для болванки "HOBJ" и скопированный оттуда функциями   mapDrawParameters mapDrawImageв память
В Итоге, у меня в памяти нормальная структура типа IMGMULTIMARK. Используя указатель на эту структуру, я корректно и правилно создаю объекты на карте НО у меня стоит задача
ДО того как выполнено нанесение (на этапе настройки вида) отобразить этот дамп на TPanel или TForm неважно на потомке TControl

Пересмотре все возможные варианты функций остановился на mapPaintExample


Подготовил структуру котрая передаётся вторым параметром

fTmpMark    : TPAINTEXAMPLE;
fRect       : TRect;
------------
 fRect := imgDraw.ClientRect;  
 FillChar(fTmpMark, sizeof(fTmpMark), 0);
 fTmpMark.DC    := GetDC(imgDraw.Handle);  // imgDraw это TPanel
 fTmpMark.Rect  := @fRect;
 fTmpMark.Func  := IMG_MULTIMARK;
 fTmpMark.Local := OL_MARK;
 fTmpMark.VisualType := cVT_SCREEN;
 fTmpMark.FillIntensity := 100;

-------------------------
теперь заливаю "начинку" в Parm

obj : HOBJ;
ref : Pointer;


obj := mapCreateSiteObject(fTask.FHMap,fTask.FHMap);
mapRegisterDrawObject(obj, 0, OL_MARK);
if Assigned(fTmpMark.Parm) then // если уже есть вид передаём в диалог
   mapAppendDraw(obj, IMG_MULTIMARK, fTmpMark.Parm);
if (medChoicePointImage(fTask.FHMap, fTask.FParm, obj, 0, 0)<>0) and   (mapDrawImage(obj,1) = IMG_MULTIMARK) then
begin
if Assigned(fTmpMark.Parm) then FreeMem(fTmpMark.Parm);
fTmpMark.Parm := nil;
ref := mapDrawParameters(obj, 1);
if Assigned(ref)  then // запоминаем вид в памяти
begin
  GetMem(fTmpMark.Parm, PIMGMULTIMARK(ref)^.Head.Length);
  move(ref^, fTmpMark.Parm^, PIMGMULTIMARK(ref)^.Head.Length); // залил

end;
end;
mapFreeObject(obj);



---------------------
отрисовка - НА ПАНЕЛИ НИЧЕГО НЕ ВИДНО
procedure TdlgLoadParcel.FormPaint(Sender: TObject);
begin
 if Assigned(fTask) and (fTmpMark.DC<>0) and Assigned(fTmpMark.Parm) then
    mapPaintExample(fTask.FHMap, fTmpMark);
end;

ВОПРОС, что я не правильно заполнил ?
Хотел бы получить эффект по типу "предварительного просмотра вида объекта

в редакторе классфикатора
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Скорее всего, fTmpMark.Parm некорректно заполняется.

Функция mapDrawParameters должна возвращать указатель на TIMGMULTIMARKHEAD, при этом  в параметре Length структуры TIMGMULTIMARKHEAD должна быть длина не менее, чем sizeof(TIMGMULTIMARKHEAD) + sizeof(TIMGMARKCHAIN).

Проверьте, что у Вас возвращается после вызова mapDrawParameters.

Для чистоты эксперимента можно попробовать вручную заполнить fTmpMark (без вызова диалогов) и посмотреть как отработает mapPaintExample.
 
Цитата
Денис Вицко написал:
Скорее всего, fTmpMark.Parm некорректно заполняется.
Денис, если бы заполнялась некорректно, то не было бы этого эффекта (отрисовки в диалоге при повторном вызове):



Кроме того, я не работаю со структурой, я работаю с памятью
Выделил GetMem-ом слил туда дамп функцией mapDrawParameters и забыл до "деструктора" или повторного вызова.

Цитата
Денис Вицко написал:
Для чистоты эксперимента можно попробовать вручную заполнить fTmpMark (без вызова диалогов) и посмотреть как отработает mapPaintExample.
"Воз" там же.

Тут стоит вопрос как правильно заполнять TPAINTEXAMPLE
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Цитата
KFF написал:
Кроме того, я не работаю со структурой, я работаю с памятью
Выделил GetMem-ом слил туда дамп функцией mapDrawParameters и забыл до "деструктора" или повторного вызова.

В таком случае вообще не стоит привязываться к типизированным указателям. А чтобы узнать длину буфера есть функция mapDrawLength.

Цитата
KFF написал:
Тут стоит вопрос как правильно заполнять TPAINTEXAMPLE

Всё на первый взгляд корректно.

Рекомендуется выполнять отрисовку на DС, взятого от TCanvas, а не самой панели. Есть подозрение, что проблема отрисовки может быть связана с VCL-компонентом TPanel.
У компонента TPanel свойство Canvas скрыто. Поэтому придется либо добавить панели новый Canvas, либо создав наследника от TPanel переопределить область видимости свойства Canvas.
В частности, в диалоге, который корректно отрисовывает графику из установленного буфера, используется именно DС, взятый от TCanvas.

Кроме всего прочего, всё что отрисовано на панели, будет перетёрто методом Paint этой панели. Поэтому mapPaintExample лучше вызывать в обработчике OnPaint самой панели.
Страницы: 1
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности