Как определить края (отступы) печати
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.