logo search
Литература_1 / photon_old

Запуск процесса печати

Если вы используете приложение, которому надо что-то знать о контексте печати, Вы можете использовать функцию PpGetPC(), с помощью которой можно получить соответствующую информацию. Например, Вам может понадобится узнать о выбранной ориентации (для того, чтобы правильно сориентировать Ваши виджеты). Если Вам понадобится узнать размеры полей, Вы можете вызвать функцию PpGetCanvas().

Перед началом печати Вы должны установить размер или разрешение источника. Например:

При установке размера источника учитывайте непечатаемые зоны принтера. Все принтеры имеют поля по краям страницы, на которых они не в состоянии печатать, даже если поля страниц установлены в 0. Поэтому размер, установленный выше, в действительности несколько больше, чем размер страницы, и шрифт будет масштабирован в сторону уменьшения, так чтобы поместиться в доступной для печати части листа.

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

#include <stdio.h>

#include <stdlib.h>

#include <Pt.h>

PtWidget_t *label, *window;

PpPrintContext_t *pc;

int quit_cb (PtWidget_t *widget, void *data, PtCallbackInfo_t *cbinfo ) {

exit (EXIT_SUCCESS);

return (Pt_CONTINUE);

} // функции quit_cb()

int print_cb (PtWidget_t *widget, void *data, PtCallbackInfo_t *cbinfo ) {

int action;

PhDim_t size;

PhRect_t const *rect;

PhDim_t const *dim;

action = PtPrintSelection(window, NULL, "Demo Print Selector", pc, Pt_PRINTSEL_DFLT_LOOK);

if (action != Pt_PRINTSEL_CANCEL) {

/* Получение непечатаемой зоны и размера страницы, всё - в 1/1000 дюйма */

PpGetPC(pc, Pp_PC_NONPRINT_MARGINS, &rect);

PpGetPC(pc, Pp_PC_PAPER_SIZE, &dim);

size.w = ((dim->w - (rect->ul.x + rect->lr.x)) * 72) / 1000;

size.h = ((dim->h - (rect->ul.y + rect->lr.y)) * 72) / 1000;

/* Установка размера источника */

PpSetPC( pc, Pp_PC_SOURCE_SIZE, &size, 0);

/* Начало печати надписи */

PpStartJob(pc);

PpContinueJob(pc);

/* Повреждение виджета */

PtDamageWidget(label);

PtFlush();

/* Закрытие печати */

PpSuspendJob(pc);

PpEndJob(pc);

}

return (Pt_CONTINUE);

} // функции print_cb()

int main(int argc, char *argv[]) {

PtArg_t args[10];

PtWidget_t *print, *quit;

PhDim_t win_dim = { 400, 200 };

PhPoint_t lbl_pos = {0, 0};

PhArea_t print_area = { {130, 170}, {60, 20} };

PhArea_t quit_area = { {210, 170}, {60, 20} };

PtCallback_t callbacks[2] = { {print_cb, NULL}, {quit_cb, NULL} };

if (PtInit(NULL) = = -1) PtExit(EXIT_FAILURE);

/* Создание главного окна */

PtSetArg (&args[0], Pt_ARG_DIM, &win_dim, 0);

PtSetArg (&args[1], Pt_ARG_WINDOW_TITLE, "Пример печати", 0);

if ((window = PtCreateWidget(PtWindow, Pt_NO_PARENT, 1, args)) = = NULL)

PtExit (EXIT_FAILURE);

/* Создание контекста печати */

pc = PpCreatePC();

/* Создание надписи для печати */

PtSetArg (&args[0], Pt_ARG_POS, &lbl_pos, 0);

PtSetArg (&args[1], Pt_ARG_TEXT_STRING, "Моя высота 1 дюйм", 0);

PtSetArg (&args[2], Pt_ARG_TEXT_FONT, "swiss72", 0);

PtSetArg (&args[3], Pt_ARG_MARGIN_HEIGHT, 0, 0);

PtSetArg (&args[4], Pt_ARG_MARGIN_WIDTH, 0, 0);

PtSetArg (&args[5], Pt_ARG_BEVEL_WIDTH, 0, 0);

label = PtCreateWidget (PtLabel, window, 6, args);

/* Создание кнопки печати */

PtSetArg(&args[0], Pt_ARG_AREA, &print_area, 0);

PtSetArg(&args[1], Pt_ARG_TEXT_STRING, "Печать", 0);

PtSetArg(&args[2], Pt_CB_ACTIVATE, &callbacks[0], 0);

print = PtCreateWidget (PtButton, window, 3, args);

/* Создание кнопки завершения */

PtSetArg(&args[0], Pt_ARG_AREA, &quit_area, 0);

PtSetArg(&args[1], Pt_ARG_TEXT_STRING, "Конец", 0);

PtSetArg(&args[2], Pt_CB_ACTIVATE, &callbacks[1], 0);

quit = PtCreateWidget (PtButton, window, 3, args);

PtRealizeWidget(window);

PtMainLoop();

return (EXIT_SUCCESS);

} // main()

Вы должны также установить смещение источника – верхний левый угол того, что печатается. Например, если у Вас есть кнопка, нарисованная на (20,20) от верхнего левого угла панели и Вы хотите, чтобы на странице она рисовалась на (0,0), установите в (20,20) смещение источника. Любые другие виджеты рисуются на своих позициях относительно этого начального значения виджетов. Виджет, расположенный на (40,40), будет прорисован на странице в позиции (20,20). Код для этого следующий:

PhPoint_t offset = {20, 20};

...

PpSetPC( pc, Pp_PC_SOURCE_OFFSET, &offset, 0 );

Сразу же после установки размеров источника и смещения, Вы можете запустить печать:

PpStartJob(pc);

PpContinueJob(pc);

Функция PpStartJob(pc) устанавливает контекст печати для процесса печати и функция PpContinueJob(pc) делает контекст печати активным, в результате чего все команды рисования Photon'а перенаправляются на адресата, заданного в контексте печати.