Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
76
Добавлен:
02.04.2015
Размер:
8.79 Mб
Скачать
    1. Печать требуемых виджетов

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

  • Функции Pg*

  • Функция PpPrintWidget() – Вы можете напечатать даже виджет, который не был нереализован (unrealise).

 Если вы можете напечатать всё содержание скроллируемого виджета, Вам понадобится выполнить определённые подготовительные операции. См. раздел "Печать скроллирующихся виджетов" ниже.

      1. Печать новой страницы

Вы можете в любой точке выполнить принудительный конец страницы, вызвав функцию PpPrintNewpage():

PpPrintNewPage(pc);

Заметьте, что как только Вы вызвали функцию PpStartJob(), какие-либо изменения контекста печати будут иметь эффект только после следующего вызова функции PpPrintNewPage().

Photon предполагает, что номера страниц увеличиваются по 1. Если это не так, вручную установите член Pp_PC_PAGE_NUM контекста печати для установки нужного номера страницы. Не делайте номер страницы уменьшающимся, так как в этом случае драйверы печати могут не работать должным образом.

      1. Печать скроллирующихся виджетов

Если Вы хотите напечатать всё содержание скроллирующегося виджета, Вам надо выполнить некую особую обработку.

          1. PtList

Единственным способом заставить PtList напечатать (или нарисовать) все пункты – это изменить его размеры так, чтобы высота была равна общей высоте всех пунктов. Простейшим решением этого является, вероятно, использование политики изменения размеров:

 Это будет работать только в том случае, если общая высота меньше чем 65К пикселей.

  1. Открыть и запустить контекст печати.

  2. Получить для виджета PtList текущие значения флагов изменения размеров (Pt_ARG_RESIZE_FLAGS).

  3. Установить флаги изменения размеров в значение Pt_RESIZE_XY_ALWAYS, в результате изменяя размер списка так, чтобы он вместил весь свой текст.

  4. Вызвать функцию PpPrintWidget() для виджета или родительского виджета.

  5. Переустановить флаги изменения размеров для виджета PtList.

  6. Остановить и закрыть контекст печати.

          1. PtMultiText

Из-за программного дефекта в флагах изменения размеров в многострочном виджете, метод, используемый для виджета PtList, работает неверно с виджетом PtMultiText.

Чтобы напечатать весь текст виджета PtMultiText:

  1. Откройте и запустите контекст печати.

  2. Получите текущие значения ресурсов Pt_ARG_MULTITEXT_NUM_LINES и Pt_ARG_MULTITEXT_NUM_LINES_VISIBLE виджета.

  3. Сохраните значение ресурса Pt_ARG_MULTITEXT_NUM_LINES_VISIBLE в локальной переменной (помните, что PtGetResources() даёт Вам указатель во внутренней памяти виджета – не расчитывайте, что в нём можно хранить число видимых строк).

  4. Установите Pt_ARG_MULTITEXT_ROWS в значение Pt_ARG_MULTITEXT_NUM_LINES.

  5. Вызовите PpPrintWidget() для виджета или родительского виджета.

  6. Переустановите значение Pt_ARG_MULTITEXT_ROWS, чтобы в нём хранилось число видимых строк.

  7. Остановите и закройте контекст печати.

Вот ответная реакция, которая распечатывает виджет PtMultiText:

int prt_multi( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ) {

int action;

PhDim_t size = { 850, 1100 };

long *num_lines;

short *num_lines_visible;

long vis_lines;

PtArg_t args[2];

/* предотвращает предупреждения (варнинги) об отсутствии ссылок */

widget = widget, apinfo = apinfo, cbinfo = cbinfo;

/* Вы можете выполнить эти вызовы PpSetPC() просто после создания контекста печати

Его наличие позволяет Вам повторно использовать контекст печати */

/* Установка разрешения источника пропорционально размеру страницы */

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

action = PtPrintSelection(ABW_base, NULL, "Демонстрационный селектор печати", pc,

Pt_PRINTSEL_DFLT_LOOK);

if (action != Pt_PRINTSEL_CANCEL) {

/* Запуск печати панели окна. Заметьте, что мы используем

один и тот же контекст печати для всех печатных работ */

PpStartJob(pc);

PpContinueJob(pc);

/* Получение числа строк и количества видимых строк */

PtSetArg (&args[0], Pt_ARG_MULTITEXT_NUM_LINES, &num_lines, 0);

PtSetArg (&args[1], Pt_ARG_MULTITEXT_NUM_LINES_VISIBLE, &num_lines_visible, 0);

PtGetResources (ABW_multi, 2, args);

/* Сохранение числа видимых строк в локальной переменной;

помните, что num_lines_visible указывает на внутреннюю память виджета */

vis_lines = *num_lines_visible;

/* Установка числа строк равным числу строчек текста */

PtSetResource( ABW_multi, Pt_ARG_MULTITEXT_ROWS, *num_lines, 0);

/* Печать виджета */

PpPrintWidget(pc, ABW_multi, NULL, NULL, 0);

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

PpSuspendJob(pc);

PpEndJob(pc);

/* Переустановка числа строк в сохранённое значение количества видимых строчек */

PtSetResource (ABW_multi, Pt_ARG_MULTITEXT_ROWS, vis_lines, 0);

}

return( Pt_CONTINUE );

}

          1. PtScrollArea

Для PtScrollArea Вам необходимо печатать его виртуальный холст, в котором размещены все виджеты, созданные внутри него или перемещаемые по зоне прокрутки:

  1. Получите указатель на виртуальный холст, вызвав:

PtValidParent(ABW_Scroll_area, PtWidget);

  1. Получите зону Pt_ARG_AREA) виртуального холста, и используйте его член member как размер источника в контексте печати;

  1. Установите смещение контекста печати источника в:

PtWidgetOffset(PtValidParent(ABW_Scroll_area, PtWidget));

  1. Напечатайте виртуальный холст области прокрутки, вызвав

PpPrintWidget(pc, PtValidParent(ABW_Scroll_area, PtWidget), NULL, NULL, 0);

Соседние файлы в папке Литература_1