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


OpenPrinter プリンタオブジェクトをオープン
ClosePrinter プリンタオブジェクトを閉じる
DocumentProperties 特定のプリンタのプリンタ初期化情報を取得または変更
ResetDC 指定された情報を使って、指定されたプリンタやプロッタのデバイスコンテキストを更新
CreateDC 指定されたデバイスのデバイスコンテキストを、指定された名前で作成
DeleteDC 指定されたデバイスコンテキストを削除
TextOut 文字を描画
StartDoc 印刷ジョブを開始
StartPage プリンタドライバがデータを受け取る準備をさせる
EndDoc 印刷ジョブを終了
EndPage 1ページ書き込みの終了を通知
CopyMemory ある位置から別の位置にメモリブロックを移動
EnumPrinters 使用可能なプリンタ・プリントサーバーなどを列挙

 

二つの画像は同期しておりません。
 

 

参考

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

 

'================================================================
'= プリンタの用紙方向を変える
'=     (ResetDC.bas)
'================================================================
#include "Windows.bi"

#define CCHDEVICENAME 32                'デバイス名の長さを示す定数
#define CCHFORMNAME 32                  'フォーム名の長さを示す定数
#define DM_MODIFY 8
#define DM_IN_BUFFER 8                  'pDevModeInputのdmFildsで指定した設定値をダイアログの初期値に使う(DM_MODIFY)
#define DM_COPY 2
#define DM_OUT_BUFFER 2                 'pDevModeOutputに現在のプリンタの設定値をコピー(DM_COPY)

#define DMORIENT_PORTRAIT 1             '用紙を縦置
#define DMORIENT_LANDSCAPE 2            '用紙を横置

#define DMBIN_LOWER 2                   '下用紙トレイ
#define DMBIN_UPPER 1                   '上用紙フィーダ

#define DM_ORIENTATION &H1              '用紙の向きを指定
#define DM_DEFAULTSOURCE &H200

#define PRINTER_ENUM_DEFAULT &H1        'デフォルトのプリンタに関する情報を列挙
#define PRINTER_ENUM_LOCAL &H2          'Nameの設定を無視して、ローカルプリンタを列挙
#define PRINTER_ENUM_NAME &H8           'Nameで指定されたプリンタを列挙
#define PRINTER_ENUM_SHARED &H20        '共有属性を持つプリンタを列挙
#define MAX_DEVICENAME 64

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

Type DOCINFO
    cbSize      As Long
    lpszDocName As Long
    lpszOutput  As Long
End Type

Type DEVMODE
    dmDeviceName(CCHDEVICENAME - 1) As Byte 'ドライバがサポートするデバイス名
    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(CCHFORMNAME - 1) As Byte 'フォーム名を指定
    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

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

' プリンタオブジェクトを閉じる
Declare Function Api_ClosePrinter& Lib "winspool.drv" Alias "ClosePrinter" (ByVal hPrinter&)

' 特定のプリンタのプリンタ初期化情報を取得または変更
Declare Function Api_DocumentProperties& Lib "winspool.drv" Alias "DocumentPropertiesA" (ByVal hWnd&, ByVal hPrinter&, ByVal pDeviceName$, dmOutput As Any, dmInput As Any, ByVal fMode&)

' 指定された情報を使って、指定されたプリンタやプロッタのデバイスコンテキストを更新
Declare Function Api_ResetDC& Lib "gdi32" Alias "ResetDCA" (ByVal hDC&, lpInitData As Any)

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

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

' 文字を描画
Declare Function Api_TextOut& Lib "gdi32" Alias "TextOutA" (ByVal hDC&, ByVal nXStart&, ByVal nYStart&, ByVal lpString$, ByVal cbString&)

' 印刷ジョブを開始
Declare Function Api_StartDoc& Lib "gdi32" Alias "StartDocA" (ByVal hDC&, lpdi As DOCINFO)

' プリンタドライバがデータを受け取る準備をさせる
Declare Function Api_StartPage& Lib "gdi32" Alias "StartPage" (ByVal hDC&)

' 印刷ジョブを終了
Declare Function Api_EndDoc& Lib "gdi32" Alias "EndDoc" (ByVal hDC&)

' 1ページ書き込みの終了を通知
Declare Function Api_EndPage& Lib "gdi32" Alias "EndPage" (ByVal hDC&)

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

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

Var Shared Combo1 As Object
Var Shared Button1 As Object

Combo1.Attach GetDlgItem("Combo1") : Combo1.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

Var Shared PrinterName As String

'================================================================
'=
'================================================================
Declare Function ResetPrinterDC(PrinterName As String, hPrtDc As Long, PaperSource As Long, PaperOrient As Long) As Integer
Function ResetPrinterDC(PrinterName As String, hPrtDc As Long, PaperSource As Long, PaperOrient As Long) As Integer
    Var nSize As Long
    Var dm As DEVMODE
    Var hPrinter As Long
    Var Ret As Long

    If Api_OpenPrinter(PrinterName, hPrinter, 0) Then
        nSize = Api_DocumentProperties(GethWnd, hPrinter, PrinterName, 0, 0, 0)

        Var aDevMode(nSize)

        nSize = Api_DocumentProperties(GethWnd, hPrinter, PrinterName, aDevMode(0), 0, DM_OUT_BUFFER)

        CopyMemory dm, aDevMode(0), Len(dm)

        dm.dmDefaultSource = PaperSource
        dm.dmOrientation = PaperOrient
        dm.dmFields = dm.dmFields Or DM_DEFAULTSOURCE Or DM_ORIENTATION

        CopyMemory aDevMode(0), dm, Len(dm)
        nSize = Api_DocumentProperties(GethWnd, hPrinter, PrinterName, aDevMode(0), aDevMode(0), DM_IN_BUFFER Or DM_OUT_BUFFER)

        nSize = Api_ResetDC(hPrtDc, aDevMode(0))

        Ret = Api_ClosePrinter(hPrinter)
        ResetPrinterDC = -1
    Else
        ResetPrinterDC = 0
    End If
End Function

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Var PrintServer As String
    Var Needed 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, Needed, Returned)
    If Needed = 0 Then End

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

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

    For CT = 0 To Returned - 1

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

        'プリンタ名を得る
        PrinterName = String$(MAX_DEVICENAME, Chr$(0))
        CopyMemory PrinterName, ByVal PI_5(CT).pPrinterName, Len(PrinterName)
        PrinterName = KLeft$(PrinterName, KInStr(1, PrinterName, Chr$(0)) - 1)

        Combo1.AddString PrinterName
    Next
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var di As DOCINFO
    Var hPrtDc As Long
    Var txt As String
    Var Ret As Long

    PrinterName = Combo1.GetText(Combo1.GetCursel)
    txt = "F-Basic Programming Tips"

    hPrtDc = Api_CreateDC("winspool", PrinterName, 0, 0)
    di.cbSize = Len(di)
    di.lpszDocName = StrAdr("F-Basic Test Document" & Chr$(0))

    '横置きで印刷
    Ret = ResetPrinterDC(PrinterName, hPrtDc, DMBIN_UPPER, DMORIENT_LANDSCAPE)
    Ret = Api_StartDoc(hPrtDc, di)
    Ret = Api_StartPage(hPrtDc)
    Ret = Api_TextOut(hPrtDc, 100, 100, txt, Len(txt))
    Ret = Api_EndPage(hPrtDc)

    '縦置きで印刷
    Ret = ResetPrinterDC(PrinterName, hPrtDc, DMBIN_UPPER, DMORIENT_PORTRAIT) 
    Ret = Api_StartPage(hPrtDc)
    Ret = Api_TextOut(hPrtDc, 100, 100, txt, Len(txt))
    Ret = Api_EndPage(hPrtDc)
    Ret = Api_EndDoc(hPrtDc)

    Ret = Api_DeleteDC(hPrtDc)
End Sub

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