プリンターの印刷余白を取得
                                                         玄関へお回り下さい。
プリンターの印刷余白及び用紙サイズを取得               (200)
   Option Explicit   'SampleNo=200 WindowsXP VB6.0(SP5) 2002.09.02

'ディバイスに関する情報を取得する(908)
Private Declare Function GetDeviceCaps Lib "gdi32" _
  (ByVal hdc As Long, ByVal nIndex As Long) As Long

Private Const HORZRES = 8      '実際のスクリーンの幅(実印刷領域)
Private Const VERTRES = 10     '実際のスクリーンの高さ
Private Const PHYSICALWIDTH = 110  '物理的幅(実用紙サイズ)
Private Const PHYSICALHEIGHT = 111 '物理的高さ
Private Const PHYSICALOFFSETX = 112 '印刷可能な左方向のマージン
Private Const PHYSICALOFFSETY = 113 '印刷可能な上方向のマージン

Private Sub Command1_Click()
  Dim LeftMargin As Long, TopMargin  As Long
  Dim RightMargin As Long, BottomMargin As Long
  Dim PhysHeight As Long, PhysWidth  As Long
  With Printer
    'マージンをピクセル単位で取得しそれをmmに変換
    LeftMargin = .ScaleX(GetDeviceCaps(.hdc, PHYSICALOFFSETX), _
                      vbPixels, vbMillimeters)
    TopMargin = .ScaleY(GetDeviceCaps(.hdc, PHYSICALOFFSETY), _
                      vbPixels, vbMillimeters)
    PhysWidth = .ScaleX(GetDeviceCaps(.hdc, PHYSICALWIDTH), _
                      vbPixels, vbMillimeters)
    PhysHeight = .ScaleY(GetDeviceCaps(.hdc, PHYSICALHEIGHT), _
                      vbPixels, vbMillimeters)
    '用紙サイズから印刷可能領域を差引きマージンを求める
    RightMargin = PhysWidth - (.ScaleX(GetDeviceCaps(.hdc, HORZRES), _
                  vbPixels, vbMillimeters) + LeftMargin)
    BottomMargin = PhysHeight - (.ScaleY(GetDeviceCaps(.hdc, VERTRES), _
                  vbPixels, vbMillimeters) + TopMargin)
  End With
  Label1.Caption = "プリンター用紙印刷余白(左) : " & LeftMargin & " mm"
  Label2.Caption = "プリンター用紙印刷余白(上) : " & TopMargin & " mm"
  Label3.Caption = "プリンター用紙印刷余白(右) : " & RightMargin & " mm"
  Label4.Caption = "プリンター用紙印刷余白(下) : " & BottomMargin & " mm"
  Label5.Caption = "プリンター用紙サイズ(幅)   : " & PhysWidth & " mm"
  Label6.Caption = "プリンター用紙サイズ(高さ) : " & PhysHeight & " mm"
End Sub

プリンターにより、印刷開始位置が違うので位置を揃える必要があるような場合、あらかじめ開始
位置(余白)を取得して、その分を考慮しておくとプリンターによる印刷位置のずれが防止できます。
当初APIのリファレンスにPHYSICALOFFSETX は X方向のマージン と書かれていたので、左右
のマージン(左マージン と 右マージン)が同じとカン違いしておりました。
Starfish
さんに教えて頂き、機種により違う事を知り、下余白・右余白もそれぞれ取得するよう
に変更しました。 MSDNにHPにも掲載されていました。
 http://support.microsoft.com/default.aspx?scid=http://www.microsoft.com/ japan/support/kb/articles/406/0/53.asp  

        





2003/02/27