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. |