Как определить края (отступы) печати

Windows Software Development Kit (SDK) не предоставляет функции для вычисления краёв печати напрямую. Приложение может вычислить данную информацию при помощи вызова GetDeviceCaps(). В этой статье обсуждаются эти функции, а так же приводятся фрагменты кода в качестве иллюстраций.

Приложение может определить отступы печати следующим образом:

Вычисление левого и верхнего отступа

  1. Определите верхний левый угол печатаемой области, вызвав GetDeviceCaps() с параметрами PHYSICALOFFSETX и PHYSICALOFFSETY. Например:
     // Инициализируем нашу структуру pt
    pt.x = 0; pt.y = 0;

    // Поместим в неё левый верхний угол печатаемой области
    pt.x = GetDeviceCaps(hPrnDC, PHYSICALOFFSETX);
    pt.y = GetDeviceCaps(hPrnDC, PHYSICALOFFSETY);


  2. Определим количество пикселей, требуемых для желаемого отступа (x и y смещения) вызвав GetDeviceCaps() с флагами LOGPIXELSX и LOGPIXELSY.
     // Выясняем, смещение, чтобы слелать левый и верхний отступы для
    // вывода на принтер. Обратите внимание на использование макроса
    // "max". Возможно, может возникнеть вопрос о значениях отступов
    // которые нельза задать для данного принтера. Например, HP
    // LaserJet имеет непечатаемую область 0.25" поэтому значение
    // 0.1" не получится.

    xOffset = max (0, GetDeviceCaps (hPrnDC, LOGPIXELSX) *
    nInchesWeWant - pt.x);

    yOffset = max (0, GetDeviceCaps (hPrnDC, LOGPIXELSY) *
    nInchesWeWant - pt.y);

    // При выполнении печати, можно либо смещать на вышеприведённые
    // значения либо вызвать SetViewportOrg(), чтобы установить точку
    // (0,0) смещения отступа, который Вы вычислили.

    SetViewportOrg (hPrnDC, xOffset, yOffset);
    all other output here


Вычисление нижнего и правого отступов

  1. Получаем общий размер физической страницы (включая печатаемую и непечатаемую области) вызвав GetDeviceCaps() с параметрами PHYSICALWIDTH и PHYSICALHEIGHT в Windows NT.

  2. Определяем количество пикселей, требуемых для желаемых отступов справа и снизу, вызывая GetDeviceCaps с флагами LOGPIXELSX и LOGPIXELSY.

  3. Вычисляем размер печатаемой области при помощи GetDeviceCaps() с флагами HORZRES и VERTRES. Следующий фрагмент кода иллюстрирует шаги с a по c:
     // Получаем размер печатаемой области
    pt.x = GetDeviceCaps(hPrnDC, PHYSICALWIDTH);
    pt.y = GetDeviceCaps(hPrnDC, PHYSICALHEIGHT);

    xOffsetOfRightMargin = xOffset +
    GetDeviceCaps (hPrnDC, HORZRES) -
    pt.x -
    GetDeviceCaps (hPrnDC, LOGPIXELSX) *
    wInchesWeWant;

    yOffsetOfBottomMargin = yOffset +
    GetDeviceCaps (hPrnDC, VERTRES) -
    pt.y -
    GetDeviceCaps (hPrnDC, LOGPIXELSY) *
    wInchesWeWant;


ЗАМЕЧАНИЕ: Теперь можно отсекать весь вывод прямоугольником, ограниченным xOffset, yOffset, xOffsetOfRightMargin, и yOffsetOfBottomMargin.

 
« Предыдущая статья   Следующая статья »