15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


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

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.