[B]Печать карты под операционной системой МСВС:
[/B]
[B]Способ №1 Использование библиотек QT
[/B]
[code]
// создаем принтер
printer = new QPrinter( QPrinter::ScreenResolution);
HDC FmapDC;
RECT mapRect;
QPainter *p;
p = new QPainter();
// создаем изображение равное по размеру области вывода карты
QPixmap * pixmap = new QPixmap(MAP->viewport()->width(),MAP->viewport()->height());
if (MAP -> hMap) // если карта открыта заполняем созданное изображение
{ //изображением карты отображенной на экране
FxDC.xcDisplay = pixmap -> x11AppDisplay();
FxDC.xcWindow = pixmap -> handle();
FxDC.xcContext = XCreateGC(FxDC.xcDisplay, FxDC.xcWindow, 0, NULL);
FxDC.xcPoint.X = MAP->viewport()->x();
FxDC.xcPoint.Y = MAP->viewport()->y();
FmapDC = HDC(&FxDC);
mapRect.left = MAP->viewport()->x() + MAP->contentsX();
mapRect.top = MAP->viewport()->y() + MAP->contentsY() ;
mapRect.right = MAP->viewport()->x() + MAP->viewport()->width() + MAP->contentsX();
mapRect.bottom = MAP->viewport()->y() + MAP->viewport()->height() + MAP->contentsY();
mapPaint95( MAP->hMap,FmapDC,1,&mapRect);
XFreeGC( FxDC.xcDisplay,FxDC.xcContext );
printer->setFullPage( TRUE );
// запускаем стандартный диалог печати
if ( printer->setup(this) ) { // printer dialog
qDebug("start printing");
if( !p -> begin( printer ) ) { // paint on printer
qDebug( "Printing aborted");
return;
}
// распечатываем полученное изображение
p->drawTiledPixmap(0,0,MAP->viewport()->width(),MAP->viewport()->height(),*pixmap,0,0);
}
}
delete(p);
delete(pixmap);
delete(printer);
[/code]
[B]Достоинства данного способа:[/B]
1. Используются только функции QT и функции содержащиеся в библиотеке libmapacces.so
2. Возможности дополнительного редактирования и совершенствования
[B]Недостатки:[/B]
1. При использовании данного примера на печать выводится только область карты видимая на экране.
2. Размер выводимого изображения не превышает размеров экрана, в связи с этим нет возможности детальной печати изображения на листах большого формата (A3-A0 и более)
Но указанные недостатки могут быть устранены при использовании достоинства №2.
[B]Способ № 2. Печать с использованием функций MapApi. (Пример взят из файла prnapi.h)[/B]
[code]
// Загрузить принтер
HPRINTER printer = prnLoadPrinter();
// Вызвать диалог печати
// (печать выбранного фрагмента карты производится
// автоматически при нажатии кнопки "Печать")
ret = prnMapPrint(hmap, printer, printparm, taskparm);
// При успешном выполнении диалога возвращаемое значение не равно 0
if (ret != 0)
{
// Закрытие диалога при помощи кнопки "Выбрать"
if (printparm->Regime == MPR_SELECTFRAME)
{
// Вызвать пользовательскую функцию выбора прямоугольной области
// ...
}
// Закрытие диалога при помощи кнопки "Изменить"
if (printparm->Regime == MPR_CHANGEFRAME)
{
// Вызвать пользовательскую функцию изменения прямоугольной области
// ...
}
}
// Освободить принтер
prnFreePrinter(printer);
[/code]
Более подробно см. prnapi.h
[B]Недостатки: [/B]
Данный способ под МСВС реализовать не удалось, так как не удалось найти аналога библиотекам mapprint.dll, gisforms.dll для операционной системы МСВС.
Вопрос администрации:
Реализована ли подсистема печати при помощи вышеописанных функций?
Если да, то в каких библиотеках они размещаются?
[/B]
[B]Способ №1 Использование библиотек QT
[/B]
[code]
// создаем принтер
printer = new QPrinter( QPrinter::ScreenResolution);
HDC FmapDC;
RECT mapRect;
QPainter *p;
p = new QPainter();
// создаем изображение равное по размеру области вывода карты
QPixmap * pixmap = new QPixmap(MAP->viewport()->width(),MAP->viewport()->height());
if (MAP -> hMap) // если карта открыта заполняем созданное изображение
{ //изображением карты отображенной на экране
FxDC.xcDisplay = pixmap -> x11AppDisplay();
FxDC.xcWindow = pixmap -> handle();
FxDC.xcContext = XCreateGC(FxDC.xcDisplay, FxDC.xcWindow, 0, NULL);
FxDC.xcPoint.X = MAP->viewport()->x();
FxDC.xcPoint.Y = MAP->viewport()->y();
FmapDC = HDC(&FxDC);
mapRect.left = MAP->viewport()->x() + MAP->contentsX();
mapRect.top = MAP->viewport()->y() + MAP->contentsY() ;
mapRect.right = MAP->viewport()->x() + MAP->viewport()->width() + MAP->contentsX();
mapRect.bottom = MAP->viewport()->y() + MAP->viewport()->height() + MAP->contentsY();
mapPaint95( MAP->hMap,FmapDC,1,&mapRect);
XFreeGC( FxDC.xcDisplay,FxDC.xcContext );
printer->setFullPage( TRUE );
// запускаем стандартный диалог печати
if ( printer->setup(this) ) { // printer dialog
qDebug("start printing");
if( !p -> begin( printer ) ) { // paint on printer
qDebug( "Printing aborted");
return;
}
// распечатываем полученное изображение
p->drawTiledPixmap(0,0,MAP->viewport()->width(),MAP->viewport()->height(),*pixmap,0,0);
}
}
delete(p);
delete(pixmap);
delete(printer);
[/code]
[B]Достоинства данного способа:[/B]
1. Используются только функции QT и функции содержащиеся в библиотеке libmapacces.so
2. Возможности дополнительного редактирования и совершенствования
[B]Недостатки:[/B]
1. При использовании данного примера на печать выводится только область карты видимая на экране.
2. Размер выводимого изображения не превышает размеров экрана, в связи с этим нет возможности детальной печати изображения на листах большого формата (A3-A0 и более)
Но указанные недостатки могут быть устранены при использовании достоинства №2.
[B]Способ № 2. Печать с использованием функций MapApi. (Пример взят из файла prnapi.h)[/B]
[code]
// Загрузить принтер
HPRINTER printer = prnLoadPrinter();
// Вызвать диалог печати
// (печать выбранного фрагмента карты производится
// автоматически при нажатии кнопки "Печать")
ret = prnMapPrint(hmap, printer, printparm, taskparm);
// При успешном выполнении диалога возвращаемое значение не равно 0
if (ret != 0)
{
// Закрытие диалога при помощи кнопки "Выбрать"
if (printparm->Regime == MPR_SELECTFRAME)
{
// Вызвать пользовательскую функцию выбора прямоугольной области
// ...
}
// Закрытие диалога при помощи кнопки "Изменить"
if (printparm->Regime == MPR_CHANGEFRAME)
{
// Вызвать пользовательскую функцию изменения прямоугольной области
// ...
}
}
// Освободить принтер
prnFreePrinter(printer);
[/code]
Более подробно см. prnapi.h
[B]Недостатки: [/B]
Данный способ под МСВС реализовать не удалось, так как не удалось найти аналога библиотекам mapprint.dll, gisforms.dll для операционной системы МСВС.
Вопрос администрации:
Реализована ли подсистема печати при помощи вышеописанных функций?
Если да, то в каких библиотеках они размещаются?