Определение границ печати




'При написании процедуры печати столкнулся как-то я с проблемой:

'у любого принтера есть так называемые границы печати,т.е области 

'по краям , которые "лежат за границей досягаемости".

'Причем в зависимости от марки принтера и конкретной стороны листа значения

'колеблются в диапазоне от 4 до 13 мм. 

' Чтобы ваш отчет на разных принтерах выглядел одинаково,

'(в смысле размещения относительно краев листа),

'есть простой способ определить минимальные (собственные) поля принтера.

Private Const HORZSIZE = 4

Private Const VERTSIZE = 6

Private Const HORZRES = 8

Private Const VERTRES = 10

Private Const LOGPIXELSX = 88

Private Const LOGPIXELSY = 90

Private Const PHYSICALHEIGHT = 111

Private Const PHYSICALOFFSETX = 112

Private Const PHYSICALOFFSETY = 113

Private Const PHYSICALWIDTH = 110



Private Const DD As Single = 25.4

Private Const C_MARGIN = 1440 / DD

'точные значения  минимальных полей в мм из LoadInfo

Private Min_Margleft As Single

Private Min_MargUp As Single

Private Min_MargRigt As Single

Private Min_MargDown As Single

'получены из вашего диалога "page setup"(т.е. желаемые поля).

Private MM_Left As Long

Private MM_Rigt As Long

Private MM_Up As Long

Private MM_Down As Long



Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, _

    ByVal nIndex As Long) As Long

'**************************************************

Public Sub LoadInfo(nDC As Long)

Dim nDev As Long

Dim xOFSET, yOFSET, xWp, yHp, xDPI, _

    yDPI, xRES, yRES



nDev = nDC



xDPI = GetDeviceCaps(nDev, LOGPIXELSX) '600"X,Y Pixels/Logical Inch:"

yDPI = GetDeviceCaps(nDev, LOGPIXELSY) '600(разрешение)



xOFSET = GetDeviceCaps(nDev, PHYSICALOFFSETX) '130"Physical X/Y Margin"

yOFSET = GetDeviceCaps(nDev, PHYSICALOFFSETY) '150(отступы)



xWp = GetDeviceCaps(nDev, PHYSICALWIDTH) '4962

yHp = GetDeviceCaps(nDev, PHYSICALHEIGHT) '7014"Physical Height/Width"



xRES = GetDeviceCaps(nDev, HORZRES) '4676"X,Y Dimensions in pixels:"

yRES = GetDeviceCaps(nDev, VERTRES) '6744



'результат в миллиметрах

Min_Margleft = xOFSET / (xDPI / DD)

Min_MargUp = yOFSET / (yDPI / DD)

Min_MargRigt = (xWp - xOFSET - xRES) / (xDPI / DD)

Min_MargDown = (yHp - yOFSET - yRES) / (yDPI / DD)

'чтобы гарантировать "правильные" поля сами округлите ...

End Sub



'******************************************************

'как использовать-тo ?!



 LoadInfo Printer.hdc

 MarginLeft = 30 'в миллиметрах

 MarginRight = 10

 MarginTop = 20

 MarginBottom = 20 





'*******************************************************

Public Property Get MarginLeft() As Long

MarginLeft = MM_Left

End Property



'*******************************************************

Public Property Let MarginLeft(ByVal nMargin As Long)

'Dim newval As Single, mmval As Long

If nMargin < Min_Margleft Then

MM_Left = Min_Margleft

Else

MM_Left = nMargin

End If

m_MarginLeft = (MM_Left - Min_Margleft) * C_MARGIN

End Property

'для остальных полей аналогично!

' m_MarginLeft недостающее расстояние которое необходимо учесть

' в процедуре печати коих полно всяких разных ,потому здесь не привожу.



к оглавлению
Используются технологии uCoz