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

Печать без вывода диалога печати

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

Помогите, пожалуйста, с печатью прямо на принтер, без вызова диалога.
Если вызвать диалог печати (установив Regime = MPR_PRINT и File = 1), печать выполняется нормально.
Если поменять Regime = MPR_PRINTONLY и File = 0, то появляется на небольшое время сообщение, что идет печать(файл с расширением .tmp), но на принтер ничего не уходит.
Принтер по умолчанию в Windows 10 установлен .
Код ниже:

   HPRINTER printer = 0;
   MAPPRINTPARMEX printparm;
   memset(&printparm,0,sizeof(printparm));
   printparm.Length = sizeof(MAPPRINTPARMEX);
   printparm.Regime = MPR_PRINTONLY;
   printparm.Handle = hWnd;
   printparm.File = 0;
   printparm.PlaneFrame =  dfarme;
   printparm.TypeOutput = MPT_NORMAL;
   printparm.FitToPage = (ui->printMode_split->isChecked()) ? MPF_SPLITTOPAGES : MPF_FITTOPAGE;
   printparm.Preview = MPV_MAP;
   printparm.Scale = scale;
   printparm.FieldLTmm = ui->fldLeft->text().toInt();
   printparm.FieldUPmm = ui->fldTop->text().toInt();
   printparm.FieldRTmm = ui->fldRight->text().toInt();
   printparm.FieldDNmm = ui->fldBut->text().toInt();
   printparm.PaperWidth = static_cast<int>(paperW * 1000.);
   printparm.PaperHeight = static_cast<int>(paperH * 1000.);

   HINSTANCE libinst = nullptr;
   HPRINTER (WINAPI * prnLoadPrinter)() = nullptr;
   long int (WINAPI * prnMapPrintEx)(HMAP hmap, HPRINTER printer,  MAPPRINTPARMEX* printparm,TASKPARM* taskparm, char* title) = nullptr;
   long int (WINAPI * prnFreePrinter)(HPRINTER printer) = nullptr;

   prnLoadPrinter = (HPRINTER (WINAPI * )())  mapLoadLibrary("gisu64forms.dll",&libinst,"prnLoadPrinter");
   prnMapPrintEx = (long int (WINAPI * )(HMAP hmap, HPRINTER printer, MAPPRINTPARMEX* printparm, TASKPARM* taskparm, char* title)) ::mapGetProcAddress(libinst,"prnMapPrintEx");
   prnFreePrinter = (long int (WINAPI * )(HPRINTER printer)) ::mapGetProcAddress(libinst,"prnFreePrinter");

   if (prnLoadPrinter)
       printer = prnLoadPrinter();

   if (printer == 0) {
   if (libinst)
       FreeLibrary(libinst);
   return;
   }

   TASKPARM parm;
   memset(&parm, 0, sizeof(parm));
   if (prnMapPrintEx && hMap)
   prnMapPrintEx(hMap, printer, &printparm, &parm, "");


Спасибо

С уважением,
Сергей Подолян
 
Проверили печать без вызова диалога - печать выполняется.
Возможные причины отсутствия изображения - ошибки при инициализации полей структуры:

1. printparm.TypeOutput = MPT_NORMAL;  // 3 (такого типа нет в MAPPRINT_OUTPUT)

   В описании структуры написано:

 char TypePrint;       // Тип печати (см. MAPPRINT_TYPE) MPT_NORMAL = 3, MPT_TRANSPARENT = 4, MPT_CONTOUR = 5
 char TypeOutput;      // Тип вывода (см. MAPPRINT_OUTPUT)  MPO_VECTORIAL = 0, MPO_RASTERIAL = 1, MPO_VECTORIALEX = 4

2. Ошибочная область вывода (printparm.PlaneFrame). При открытии диалога ошибочная область (нулевая или вырожденная: X1 >= X2 или Y1 >= Y2) может исправиться автоматически (устанавливается по габаритам карты).
3. Ошибочный масштаб печати. При открытии диалога ошибочный масштаб может исправиться автоматически.
4. При печати карты в указанном масштабе изображение не помещается на одну страницу, а на первую страницу не попадают объекты.
5. Печатаются растровые данные и не установлен растровый тип вывода (printparm.TypeOutput = MPO_RASTERIAL).

В качестве теста прошу включить флаг печати рамки печатаемой области (printparm.Border = 1). Напечаталась ли полная прямоугольная рамка?

Примечание: параметры размеров страницы не используются (printparm.PaperWidth, printparm.PaperHeight) - используется формат установленный для используемого устройства (HPRINTER printer) по умолчанию, либо установленный пользователем средствами диалога печати.
 
Здравствуйте,

Спасибо за помощь, сейчас печатается прямо на принтер.
Но, появилось две новые проблемы:
1. Печатается только первая страница
2. Шрифты надписей не при выводе не принтер не масштабируются (выводятся очень маленьким шрифтом). При этом если печатать из диалога, то шрифты нормальные. Текст функции печати ниже.

void PrintGraphDoc::printText(Requisite req)
{
   HOBJ reqObj = mapCreateSiteObject(hMap, hSite, IDDOUBLE2,0);
   mapSetObjectPress(reqObj, 0);
   mapRegisterDrawObject(reqObj, 172150000, LOCAL_TITLE);
   IMGTRUETEXT parmText;
   memset((void*) &parmText, 0, sizeof(parmText));
   parmText.Text.Color = RGB(0, 0, 0);
   parmText.Text.BkgndColor = IMGC_TRANSPARENT;
   parmText.Text.ShadowColor = 0xFFFFFFFF;
   parmText.Text.Height = static_cast<unsigned int>(req.fontSize);
   parmText.Text.Flag = IMGTEXT_SCALE;
   QByteArray ba = req.fontName.toLocal8Bit();
   const char* fontName = ba.data();
   strcpy(parmText.FontName, fontName);
   mapAppendDraw(reqObj, IMG_TRUETEXT, (const char*) &parmText);
   QString text = req.text;
   mapPutTextUnicode(reqObj, reinterpret_cast<const WCHAR *>(text.constData()), 0);
   int alignV = (align.contains(req.verticalAlign))   ? align[req.verticalAlign]   : FA_MIDDLE;
   int alignH = (align.contains(req.horizontalAlign)) ? align[req.horizontalAlign] : FA_CENTER;
   mapPutTextVerticalAlign(reqObj, alignV, 0);
   mapPutTextHorizontalAlign(reqObj, alignH, 0);
   DOUBLEPOINT textPP;
   textPP.x = static_cast<double>(req.xmm) / 1000.;
   textPP.y = static_cast<double>(req.ymm) / 1000.;
   hView->getCoordinate(textPP, PP_PLANE);
   double x = (paperPP_BR.x + static_cast<double>(req.xmm) / 1000. * static_cast<double>(scale));
   double y = (paperPP_TL.y + static_cast<double>(req.ymm) / 1000. * static_cast<double>(scale));
   mapAppendPointPlane(reqObj, x, y);
   mapAppendPointPlane(reqObj, x+1000, y+1000);
   long numObj = mapCommitObject(reqObj);
}

Спасибо

С уважением,
Сергей Подолян
 
1. Для печати нескольких страниц необходимо в INI-файл карты в раздел "PRINT" записать список номеров печатаемых страниц "PagesCollect" (при отсутствии записи печатается страница 1):

[PRINT]
PagesCollect=1,2,4,5

mapGetMapIniName(hMap) - запросить имя INI-файла.

2. IMGTEXT_SCALE       // Признак растягивания по метрике - высота вычисляется исходя из длины отрезка [x; y] - [x+1000; y+1000] (в масштабе печатаемой карты). Если 1000 заменить на 2000, то подпись увеличится в 2 раза.
При выборе флага IMGTEXT_SCALE параметр parmText.Text.Height игнорируется.

Разница размера шрифта может объясняться разными масштабами печати (printparm.Scale) - в диалоге масштаб печати может изменяться автоматически - зависит от выбранных настроек.
Признак "Не сжимать", который устанавливается функцией mapSetObjectPress, на подписи, растягиваемые по метрике (IMGTEXT_SCALE), не действует.
 
Цитата
Сергей Подолян написал:
Помогите, пожалуйста, с печатью прямо на принтер, без вызова диалога. Если вызвать диалог печати (установив Regime = MPR_PRINT и File = 1), печать выполняется нормально. Если поменять Regime = MPR_PRINTONLY и File = 0, то появляется на небольшое время сообщение, что идет печать(файл с расширением .tmp), но на принтер ничего не уходит.Принтер по умолчанию в Windows 10 установлен .
Данное замечание поправлено в 13 версии.
На нашем сайте будет доступна ссылка на скачивание программы с вошедшими изменениями.

Спасибо за сообщение!
Страницы: 1
Читают тему (гостей: 1)



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

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