プリンタの用紙方向を変える <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