プリンタの水平・垂直マージンを取得          <TOP>


GetDeviceCaps デバイス固有の情報を取得
EnumPrinters 使用可能なプリンタ・プリントサーバーなどを列挙
MoveMemory メモリブロックを別の領域に移動
CreateDC 指定されたデバイスのデバイスコンテキストを、指定された名前で作成
DeleteDC 指定されたデバイスコンテキストを削除
 

選択したプリンタの水平・垂直マージンを取得しています。

 

'================================================================
'= プリンタの水平・垂直マージンを取得
'=    (PhysicalOffset.bas)
'================================================================
#include "Windows.bi"

Type PRINTER_INFO_5
    pPrinterName As Long
    pPortName    As Long
    Attributes   As Long
    DeviceNotSelectedTimeOut As Long
    TransmissionRetryTimeOut As Long
End Type

' デバイス固有の情報を取得
Declare Function Api_GetDeviceCaps& Lib "gdi32" Alias "GetDeviceCaps" (ByVal hDC&, ByVal nIndex&)

' 使用可能なプリンタ・プリントサーバーなどを列挙する
Declare Function Api_EnumPrinters& Lib "winspool.drv" Alias "EnumPrintersA" (ByVal Flags& , ByVal Name$ , ByVal Level& , pPrinterEnum As Any , ByVal cbBuf& , pcbNeeded& , pcReturned& )

' メモリブロックを別の領域に移動する
Declare Sub Api_MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length&)

' 指定されたデバイスのデバイスコンテキストを、指定された名前で作成
Declare Function Api_CreateDC& Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName$, lpDeviceName As Any, lpOutput As Any, ByVal lpInitData As Any)

' 指定されたデバイスコンテキストを削除
Declare Function Api_DeleteDC& Lib "gdi32" Alias "DeleteDC" (ByVal hDC&)

#define PRINTER_ENUM_NAME &H8           'Nameで指定されたプリンタを列挙
#define MAX_DEVICENAME 64               '
#define PHYSICALHEIGHT 111              '物理的高さ(単位ピクセル)
#define PHYSICALOFFSETX 112             '実際に印刷可能なX方向のマージン
#define PHYSICALOFFSETY 113             '実際に印刷可能なY方向のマージン
#define PHYSICALWIDTH 110               '物理的幅(単位ピクセル)
#define LOGPIXELSX 88                   '画面(プリンタ)の幅のピクセル数(Pixel/inch)
#define LOGPIXELSY 90                   '画面(プリンタ)の高さのピクセル数(Pixel/inch)

Var Shared Text(3) As Object
Var Shared Combo1 As Object
Var Shared Button1 As Object

For i = 0 To 3
    Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i + 1))) : Text(i).SetFontSize 14
Next i
Combo1.Attach GetDlgItem("Combo1") : Combo1.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

Var Shared PrinterName As String

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Var PrintServer As String
    Var Need As Long
    Var Returned As Long
    Var Level As Long
    Var CT As Long
    Var Ret As Long

    'ローカルプリンタから検索
    PrintServer = ""

    'PRINTER_INFO_5構造体を受け取る
    Level = 5

    'バッファに必要なバイト数を調べる
    Ret = Api_EnumPrinters(PRINTER_ENUM_NAME, PrintServer, Level, Chr$(0), 0, Need, Returned)
    If Need = 0 Then End

    '全プリンタ情報を得る
    Var Buffer(Need - 1) As byte
    Ret = Api_EnumPrinters(PRINTER_ENUM_NAME, PrintServer, Level, Buffer(0), Need, Need, Returned)

    '構造体リストの準備
    Var pi5(Returned-1) As PRINTER_INFO_5

    For CT = 0 To Returned - 1

        'バッファから構造体1つ分を抜き取る
        Api_MoveMemory pi5(CT), Buffer(CT * Len(pi5(CT))), Len(pi5(CT))

        'プリンタ名を得る
        PrinterName = String$(MAX_DEVICENAME, Chr$(0))
        Api_MoveMemory PrinterName, ByVal pi5(CT).pPrinterName, Len(PrinterName)
        PrinterName = Left$(PrinterName, InStr(1, PrinterName, Chr$(0)) - 1)
        Combo1.AddString PrinterName
    Next
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var hDC As Long
    Var PhWidth   As Long
    Var PhHeight  As Long
    Var PhOffsetX As Long
    Var PhOffsetY As Long

    PrinterName = Combo1.GetWindowText
    hDC = Api_CreateDC(ByVal 0, PrinterName, 0, 0)

    '幅
    PhWidth = Api_GetDeviceCaps(hDC, PHYSICALWIDTH) / Api_GetDeviceCaps(hDC, LOGPIXELSX) * 25.4

    '高さ
    PhHeight = Api_GetDeviceCaps(hDC, PHYSICALHEIGHT) / Api_GetDeviceCaps(hDC, LOGPIXELSY) * 25.4

    '水平マージン
    PhOffsetX = Api_GetDeviceCaps(hDC, PHYSICALOFFSETX) / Api_GetDeviceCaps(hDC, LOGPIXELSX) * 25.4

    '垂直マージン
    PhOffsetY = Api_GetDeviceCaps(hDC, PHYSICALOFFSETY) / Api_GetDeviceCaps(hDC, LOGPIXELSY) * 25.4

    '幅高さを表示
    Text(2).SetWindowText "(" & Trim$(Str$(Clng(PhWidth))) & "mm" & ", " & Trim$(Str$(Clng(PhHeight))) & "mm" & ")"

    'マージンを表示
    Text(3).SetWindowText "(" & Trim$(Str$(Clng(PhOffsetX))) & "mm" & ", " & Trim$(Str$(Clng(PhOffsetY))) & "mm" & ")"

    'デバイスコンテキストを削除
    Ret = Api_DeleteDC(hDC)
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End