プリンタの水平・垂直マージンを取得 <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