プリンタの印刷方向を設定 <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