Определение
границ печати
'При написании процедуры печати столкнулся как-то я с проблемой:
'у любого принтера есть так называемые границы печати,т.е области
'по краям , которые "лежат за границей досягаемости".
'Причем в зависимости от марки принтера и конкретной стороны листа значения
'колеблются в диапазоне от 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 недостающее расстояние которое необходимо учесть
' в процедуре печати коих полно всяких разных ,потому здесь не привожу.
|