プリンタの印刷方向を設定          <TOP>


プリンタの印刷方向を設定します。

OpenPrinter プリンタのオブジェクトをオープン

GetPrinter プリンタの詳細な情報を取得

MoveMemory ある位置から別の位置へメモリブロックを移動

SetPrinter プリンタの詳細な情報を設定

ClosePrinter プリンタのオブジェクトハンドルを解放

 

 

実行結果の確認

参考

プリンタの用紙方向を変える

'================================================================
'= プリンタの印刷方向を設定
'=    (DM_ORIENTATION.bas)
'================================================================
#include "Windows.bi"

Type PRINTER_DEFAULTS
    pDatatype     As Long
    pdm           As Long
    DesiredAccess As Long
End Type

#define STANDARD_RIGHTS_REQUIRED &HF0000 '標準的な権利を要求することを示す定数
#define PRINTER_ACCESS_ADMINISTER &H4    'プリンタアクセス権の管理者権限を示す定数の宣言
#define PRINTER_ACCESS_USE &H8           'プリンタアクセス権のユーザー権限を示す定数の宣言
#define PRINTER_ALL_ACCESS (&HF0000 or &H4 or &H8) '

#define CCHDEVICENAME 32                'デバイス名の長さを示す定数
#define CCHFORMNAME 32                  'フォーム名の長さを示す定数

Type DEVMODE
    dmDeviceName        As String * CCHDEVICENAME  'ドライバがサポートするデバイス名
    dmSpecVersion       As Integer      '構造体の基準になった初期化データ仕様のバージョン番号
    dmDriverVersion     As Integer      'プリンタドライバのバージョン番号
    dmSize              As Integer      'この構造体のサイズ(バイト単位)
    dmDriverExtra       As Integer      'この構造体に続くドライバ データのバイト数
    dmFields            As Long         '
    dmOrientation       As Integer      'DMORIENT_PORTRAIT(縦置き)、DMORIENT_LANDSCAPE(横置き)
    dmPaperSize         As Integer      '用紙サイズ
    dmPaperLength       As Integer      'dmPaperSizeメンバで指定した用紙の長さをオーバーライド
    dmPaperWidth        As Integer      'dmPaperSizeメンバで指定した用紙の幅をオーバーライド
    dmScale             As Integer      '印刷出力をスケーリングするときの、スケーリング係数
    dmCopies            As Integer      'デバイスが複数の部数に対応する場合、印刷する部数
    dmDefaultSource     As Integer      '予約済み(0)
    dmPrintQuality      As Integer      'プリンタの解像度(ドット/インチ)
    dmColor             As Integer      'カラープリンタの場合(DMCOLOR_COLOR・DMCOLOR_MONOCHROME)
    dmDuplex            As Integer      '両面印刷が可能なプリンタ(DMDUP_SIMPLEX・DMDUP_HORIZONTAL・DMDUP_VERTICAL)
    dmYResolution       As Integer      'プリンタのy方向の解像度(ドット/インチ)
    dmTTOption          As Integer      'TrueTypeフォントの印刷方法
    dmCollate           As Integer      '複数部数を印刷するときにページ順にそろえるかどうか
    dmFormName          As String * CCHFORMNAME  'フォーム名を指定
    dmUnusedPadding     As Integer      '使用しない
    dmBitsPerPixel      As Integer      'ディスプレイ デバイスの解像度をピクセルあたりのビット数で指定
    dmPelsWidth         As Long         '可視のデバイスの表面の幅をピクセル単位で指定
    dmPelsHeight        As Long         '可視のデバイスの表面の高さをピクセル単位で指定
    dmDisplayFlags      As Long         'デバイスのディスプレイ モードを指定
    dmDisplayFrequency  As Long         'ディスプレイデバイスのリフレッシュレート(垂直同期周波数)を1秒当たりのサイクル数(Hz)で指定
    dmICMMethod         As Long         '非ICMアプリケーションの場合に、ICMが使用可能かどうかを指定
    dmICMIntent         As Long         'カラーマッチング方法のデフォルトを指定
    dmMediaType         As Long         '印刷メディアのタイプを指定
    dmDitherType        As Long         'ディザリング方法を指定
    dmReserved1         As Long         '予約済み(0)
    dmReserved2         As Long         '予約済み(0)
    dmPanningWidth      As Long         'NT系(0)
    dmPanningHeight     As Long         'NT系(0)
End Type

#define DM_ORIENTATION &H1              '用紙の向きを指定
#define DMORIENT_PORTRAIT 1             '用紙縦置き
#define DMORIENT_LANDSCAPE 2            '用紙横置き

Type PRINTER_INFO_2
    pServerName         As Long
    pPrinterName        As Long
    pShareName          As Long
    pPortName           As Long
    pDriverName         As Long
    pComment            As Long
    pLocation           As Long
    pDevMode            As Long
    pSepFile            As Long
    pPrintProcessor     As Long
    pDatatype           As Long
    pParameters         As Long
    pSecurityDescriptor As Long
    Attributes          As Long
    Priority            As Long
    DefaultPriority     As Long
    StartTime           As Long
    UntilTime           As Long
    Status              As Long
    cJobs               As Long
    AveragePPM          As Long
End Type

' プリンタオブジェクトをオープン
Declare Function Api_OpenPrinter& Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName$, phPrinter&, pDefault As Any)

' プリンタの詳細な情報を取得
Declare Function Api_GetPrinter& Lib "winspool.drv" Alias "GetPrinterA" (ByVal hPrinter&, ByVal Level&, pPrinter As Any, ByVal cbBuf&, pcbNeeded&)

' ある位置から別の位置にメモリブロックを移動
Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length&)

' プリンタの詳細な情報を設定
Declare Function Api_SetPrinter& Lib "winspool.drv" Alias "SetPrinterA" (ByVal hPrinter&, ByVal Level&, pPrinter As Any, ByVal Command&)

' プリンタのオブジェクトハンドルを破棄
Declare Function Api_ClosePrinter& Lib "winspool.drv" AliAs "ClosePrinter" (ByVal hPrinter&)

Var Shared Text1 As Object
Var Shared Radio1 As Object
Var Shared Radio2 As Object
Var Shared Button1 As Object

Text1.Attach getDlgItem("Text1") : Text1.SetFontSize 14
Radio1.Attach getDlgItem("Radio1") : Radio1.SetFontSize 14
Radio2.Attach getDlgItem("Radio2") : Radio2.SetFontSize 14
Button1.Attach getDlgItem("Button1") : Button1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Function Index bdecl () As Integer
Function Index()
    Index = val(Mid$(GetDlgRadioSelect("Radio1"), 6)) -1
End Function

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var PrtDevName As String
    Var pd As PRINTER_DEFAULTS
    Var hPrinter As Long
    Var Level As Long
    Var Need As Long
    Var pi2 As PRINTER_INFO_2
    Var dm As DEVMODE
    Var Ret As Long

    'プリンタ名を指定
    PrtDevName = "EPSON PX-G920"    'Printer.DeviceName

    'プリンタアクセス権を指定
    pd.DesiredAccess = PRINTER_ALL_ACCESS

    'プリンタのオブジェクトハンドルを取得
    Ret = Api_OpenPrinter(PrtDevName, hPrinter, pd)

    '構造体のレベルを指定
    Level = 2

    'バッファに必要なサイズを取得
    Ret = Api_GetPrinter(hPrinter, Level, ByVal 0, 0, Need)

    'バッファを確保
    Var Buffer(Need - 1) As Byte

    '詳細なプリンタ情報を取得
    Ret = Api_GetPrinter(hPrinter, Level, Buffer(0), Need, Need)

    '取得した詳細なプリンタ情報を構造体へ移動
    MoveMemory pi2, Buffer(0), Len(pi2)

    '取得した詳細なプリンタデバイス情報を構造体へ移動
    MoveMemory dm, ByVal pi2.pDevMode, Len(dm)

    '印刷方向が指定できる場合
    If dm.dmFields And DM_ORIENTATION Then

        '印刷方向を指定
        If Index = 0 Then
            dm.dmOrientation = DMORIENT_PORTRAIT
        Else
            dm.dmOrientation = DMORIENT_LANDSCAPE
        End If

        '構造体を取得した詳細なプリンタデバイス情報へ移動
        MoveMemory ByVal pi2.pDevMode, dm, Len(dm)

        '詳細なプリンタ情報を書き戻し
        Ret = Api_SetPrinter(hPrinter, Level, pi2, 0)
    End If

    'プリンタオブジェクトをクローズ
    Ret = Api_ClosePrinter(hPrinter)
End Sub

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