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

Принтерный вид карты в GTK15

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Принтерный вид карты в GTK15
 
Отрисовываю карту средствами mapapi GTK 15.1.5.1 через mapViewImageToXImage , после открытия карты пробовал установить принтерный вид карты
Код
hMap=mapOpenDataUn((WCHAR*)FileName.utf16(),0);
if (hMap){
   mapSetViewType(hMap, VT_PRINTRST);
...
какой параметр ни ставь, карта отображается в экранном виде, а хотелось бы иметь возможность отображать на карту со сглаживанием условных знаков.
Такая же история при отображении вида знака из классификатора, что VT_SCREEN, что VT_PRINT - все равно:
Код
QImage *GetRscImageDC(HMAP hMap, HRSC hRsc, int incode)
{
    int imageSize=100;

    RSCOBJECT rscObject;
    mapGetRscObject(hRsc, incode, &rscObject);

    // Получить номер функции отображения и параметры из классификатора: IMG_LINE,IMG_SQUARE,...
    long rscObjectFunctionNumber = mapGetRscObjectFunction(hRsc, incode);
    const char *rscObjectParameters = mapGetRscObjectParameters(hRsc, incode);

    COLORREF mapColors[256];
    memset(mapColors, 0, sizeof(mapColors));
    long mapColorsCount = mapGetSiteColorsCount(hMap, hMap);
    mapGetSiteColors(hMap, hMap, mapColors, mapColorsCount);


    RECT rect;
    rect.left = 0;
    rect.right = imageSize;
    rect.top  = 0;
    rect.bottom = imageSize;

    HDC hDC = GetDC(NULL);
    HBITMAP hBitmap = CreateCompatibleBitmap(hDC, imageSize, imageSize);
    HDC hBitmapDC = CreateCompatibleDC(hDC);
    SelectObject(hBitmapDC, hBitmap);
    SetViewportOrgEx(hBitmapDC,0,0,NULL);

    mapPaintExampleFunc(hMap,hBitmapDC,rect,rscObjectFunctionNumber,(char *)rscObjectParameters,mapColorsCount, mapColors,VT_SCREEN,NULL,rscObject.Local,hRsc,1);

    QPixmap pixmap = QtWin::fromHBITMAP(hBitmap);
    DeleteObject(hBitmap);
    DeleteDC(hBitmapDC);

    QImage *img=new QImage(pixmap.toImage());
    return img;
}
Изменено: Валерий Парусов - 20.01.2026 06:29:01
 
Если в функцию рисования не передается параметр типа visualType (viewType), то mapSetViewType(hMap, VT_PRINTRST) необходимо вызывать непосредственно перед функцией рисования:

Код
  // Устанавливаем экранный тип визуализации
  long int viewType = mapSetViewType(ident->Map, VT_PRINTRST);

  // Рисуем знак
  int retPaint = mapPaintObject95(ident->Map, dcApp, &rect, ident->Obj);

  // Восстанавливаем тип визуализации карты
  mapSetViewType(ident->Map, viewType);


Если передается параметр типа visualType (как в Вашем примере), то значение должно быть корректным:

mapPaintExampleFunc(hMap,hBitmapDC,rect,rscObjectFunctionNumber,(char *)rscObjectParameters,mapColorsCount, mapColors, VT_PRINTRST , NULL,rscObject.Local,hRsc,1);


Текст функции рисования образца объекта на вкладке "Вид" в диалоге выбора объекта карты (vcl, Windows) и на вкладках "Вид" (VT_SCREEN) и "На печать" (VT_PRINTRST) в редакторе классификатора (на вкладке "Объекты"):

Код
void TFormObjImage::PaintObject()
{
  if (TotalParam == 0)
    return;

  HDC dc = PaintBox1->Canvas->Handle;
  RECT rect = PaintBox1->ClientRect;

  HRSC hrsc = GetRsc();
  HOBJ info = GetInfo();
  if (info)
  {
    SEMANTIC* semantic = 0;
    int exampleflags = 0;
    int local = GetLocal();

    if (local == LOCAL_SQUARE && Incode)
    {
      if (mapGetRscObjectPolygonPointFlag(hrsc, Incode))
        exampleflags |= EXAMPLE_POLYGONPOINT;

      if (mapGetRscObjectDirect(hrsc, Incode) == OD_RIGHT)
        exampleflags |= EXAMPLE_CLOCKWISE;
    }

    TEMPLIBRARY lib(MAPACCLIB);
    typedef SEMANTIC* (WINAPI* t_func)(HOBJ hobj);
    t_func func = (t_func)lib.GetFunction("mapGetObjectSemantic");
    if (func)
      semantic = func(info);

    mapPaintExampleFuncEx(GetMap(), dc, rect, ParmHead.Func, TotalParam, RscColorCount, RscPalette,
      VisualType, 0, local, hrsc, 1, 0, semantic, exampleflags);
  }
  else
  {
    mapPaintExampleRscObjectEx(GetMap(), hrsc, dc, &rect, Incode, VisualType, 0, 100, 0);
  }
}

В диалоге выбора объекта карты вкладка "Вид" содержит оба типа визуализации (кроме подписей и шаблонов, имеющих один вид):

Код
  if (DiaType == DI_SCR)
    VisualType = VT_SCREEN;
  else
    VisualType = VT_PRINTRST;
 
Цитата
mapPaintExampleFunc(hMap,hBitmapDC,rect,rscObjectFunctionNumber,(char *)rscObjectParameters,mapColorsCount, mapColors, VT_PRINTRST , NULL,rscObject.Local,hRsc,1);
Не работает. Даже если перед этим вызовом поставить mapSetViewType(hMap,VT_PRINTRST), то все равно не сглаживает.
Вот так у меня отображается знак из классификатора: https://disk.yandex.ru/i/g5C3Hx1ihVXV9w
А вот если вставить mapSetViewType(hMap,VT_PRINT) перед вызовом функций
Код
mapDrawImageMapObject(hScreen, hMap, &objectView, selObj.at(i));
...
mapDrawImageSelect(hScreen,hMap,&r,&tempPoint,hSelect,selColor1,1);
...
mapViewImageToXImage(hScreen, &ximage, 0, 0);
...
То на карте сглаживание есть, а из классификатора знак отображается странно: https://disk.yandex.ru/i/yN6rCWQZhRNBXA
 
Поставил VT_PRINTRST и все нормально отображается.
Спасибо за ответы.
Страницы: 1
Читают тему (гостей: 1)



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

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