Как определить края (отступы) печати
Windows Software Development Kit (SDK) не предоставляет функции
для вычисления краёв печати напрямую. Приложение
может вычислить данную информацию при помощи
вызова GetDeviceCaps(). В этой статье обсуждаются
эти функции, а так же приводятся фрагменты кода в
качестве иллюстраций.
Приложение может определить отступы печати
следующим образом:
Вычисление левого и верхнего отступа
- Определите верхний левый угол печатаемой
области, вызвав GetDeviceCaps() с параметрами
PHYSICALOFFSETX и PHYSICALOFFSETY. Например:
// Инициализируем нашу структуру pt
pt.x = 0; pt.y = 0;
// Поместим в неё левый верхний угол печатаемой области
pt.x = GetDeviceCaps(hPrnDC, PHYSICALOFFSETX);
pt.y = GetDeviceCaps(hPrnDC, PHYSICALOFFSETY);
- Определим количество пикселей, требуемых для
желаемого отступа (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
Вычисление нижнего и правого отступов
- Получаем общий размер физической страницы (включая
печатаемую и непечатаемую области) вызвав GetDeviceCaps()
с параметрами PHYSICALWIDTH и PHYSICALHEIGHT в Windows NT.
- Определяем количество пикселей, требуемых для
желаемых отступов справа и снизу, вызывая GetDeviceCaps
с флагами LOGPIXELSX и LOGPIXELSY.
- Вычисляем размер печатаемой области при помощи 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.
|