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

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

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

          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);

Yandex.RTB R-A-252273-3
Yandex.RTB R-A-252273-4