APIを使った印刷(RoundRect) <TOP>
APIを使って印刷をします。
OpenPrinter プリンタオブジェクトをオープン
CreateDC 指定されたデバイスコンテキストを、指定された名前で作成
CreatePenIndirect LOGFONTを定義して論理ペンを作成
RoundRect 角の丸い矩形を描画
SelectObject 指定されたデバイスコンテキストのオブジェクトを選択
DeleteObject 論理オブジェクトを削除し、関連づけされた全てのリソースを解放
StartDoc 印刷ジョブの開始
StartPage プリンタドライバがデータを受け取る準備をさせる
EndPage 1ページ書き込み終了を通知
EndDoc 印刷ジョブの終了
DeleteDC 指定されたデバイスコンテキストを削除
GetDC デバイスコンテキストのハンドルを取得
ReleaseDC デバイスコンテキストの解放
左:フォーム上に描画した矩形を... 右:各数値を10倍して印刷した状態(適当に縮小しています)
例では、プリンタ名を明示的に指定しています。プリンタ名の取得については「プリンタの対応する用紙を取得」を参照してください。
'================================================================ '= APIを使った印刷 '= (PrintRoundRect.bas) '================================================================ #include "Windows.bi" Type DOCINFO cbSize As Long lpszDocName As Long lpszOutput As Long End Type Type PRINTER_DEFAULTS pDatatype As Long pDevMode As Long DesiredAccess As Long End Type Type POINTAPI x As Long y As Long End Type Type LOGPEN lopnStyle As Long lopnWidth As POINTAPI lopnColor As Long End Type ' プリンタオブジェクトをオープン Declare Function Api_OpenPrinter& Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName$, phPrinter&, pDefault As PRINTER_DEFAULTS) ' 指定されたデバイスのデバイスコンテキストを、指定された名前で作成 Declare Function Api_CreateDC& Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName$, ByVal lpDevName$, ByVal lpOutput$, ByVal lpInitData&) ' LOGPEN構造体を定義して論理ペンを作成 Declare Function Api_CreatePenIndirect& Lib "gdi32" Alias "CreatePenIndirect" (lpLogPen As LOGPEN) ' 角の丸い矩形を描画 Declare Function Api_RoundRect& Lib "gdi32" Alias "RoundRect" (ByVal hDC&, ByVal nLeftRect&, ByVal nTopRect&, ByVal nRightRect&, ByVal nBottomRect&, ByVal nWidth&, ByVal nHeight&) ' 指定されたデバイスコンテキストのオブジェクトを選択 Declare Function Api_SelectObject& Lib "gdi32" Alias "SelectObject" (ByVal hDC&, ByVal hObject&) ' 論理オブジェクトを削除し、そのオブジェクトに関連付けられていたすべてのシステムリソースを解放 Declare Function Api_DeleteObject& Lib "gdi32" Alias "DeleteObject" (ByVal hObject&) ' 印刷ジョブを開始 Declare Function Api_StartDoc& Lib "gdi32" Alias "StartDocA" (ByVal hDC&, lpdi As DOCINFO) ' プリンタドライバがデータを受け取る準備をさせる Declare Function Api_StartPage& Lib "gdi32" Alias "StartPage" (ByVal hDC&) ' 1ページ書き込みの終了を通知 Declare Function Api_EndPage& Lib "gdi32" Alias "EndPage" (ByVal hDC&) ' 印刷ジョブを終了 Declare Function Api_EndDoc& Lib "gdi32" Alias "EndDoc" (ByVal hDC&) ' 指定されたデバイスコンテキストを削除 Declare Function Api_DeleteDC& Lib "gdi32" Alias "DeleteDC" (ByVal hDC&) ' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得 Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&) ' デバイスコンテキストを解放 Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&) #define PS_SOLID 0 #define PRINTER_ACCESS_ADMINISTER &H4 'プリンタアクセス権の管理者権限を示す定数の宣言 #define PRINTER_ACCESS_USE &H8 'プリンタアクセス権のユーザー権限を示す定数の宣言 #define vbWhite &HFFFFFF '白のカラーコード #define vbBlack &H000000 '黒のカラーコード #define vbBlue &HFF0000 '青のカラーコード #define vbRed &H0000FF '赤のカラーコード #define vbNullString ByVal 0 '値0の文字列。値0を持つ文字列。空文字列ではない Var Shared lp As LOGPEN Var Shared pa As POINTAPI Var Shared hndPen As Long Var Shared oldPen As Long Var Shared x1 As Long Var Shared y1 As Long Var Shared x2 As Long Var Shared y2 As Long Var Shared x3 As Long Var Shared y3 As Long Var Shared w As Long Var Shared Button1 As Object Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14 '================================================================ '= フォームに描画 '================================================================ Declare Sub MainForm_MouseMove edecl () Sub MainForm_MouseMove() Var hDC As Long Var Ret As Long hDC = Api_GetDC(GethWnd) 'ペン太さ・色 w = 4 pa.x = w lp.lopnColor = vbRed lp.lopnStyle = PS_SOLID lp.lopnWidth = pa 'ペンオブジェクト作成 hndPen = Api_CreatePenIndirect(lp) 'プリンタデバイスコンテキストにペンオブジェクト選択 oldPen = Api_SelectObject(hDC, hndPen) '左上座標 x1 = 6 y1 = 3 '右下座標 x2 = 120 y2 = 90 'コーナー x3 = 20 y3 = 20 'プリンタデバイスコンテキストに角を丸めた長方形を描画 Ret = Api_RoundRect(hDC, x1, y1, x2, y2, x3, y3) 'ペン削除 Ret = Api_DeleteObject(hndPen) Ret = Api_ReleaseDC(GethWnd, hDC) End Sub '================================================================ '= 印刷 '================================================================ Declare Sub Button1_on edecl () Sub Button1_on() Var DevName As String Var di As DOCINFO Var pd As PRINTER_DEFAULTS Var prhDC As Long Var ex As Long Var Ret As Long ex = 10 '通常使うプリンタ 'プリンタ名の取得は、「プリンタの対応する用紙を取得」参照 DevName = "pdfFactory Pro" 'プリンタ初期化 pd.pDatatype = StrAdr(Chr$(0)) pd.pDevMode = 0 pd.DesiredAccess = PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE 'プリンタオープン Ret = Api_OpenPrinter(DevName, prhDC, pd) 'プリンタデバイスコンテキストを取得 prhDC = Api_CreateDC("WINSPOOL", DevName, vbNullString, 0) If prhDC = 0 Then GoTo *cleanup di.cbSize = Len(di) di.lpszOutput = StrAdr(Chr$(0)) '印刷プロセス開始 Ret = Api_StartDoc(prhDC, di) Ret = Api_StartPage(prhDC) 'ペン太さ・色 pa.x = w * ex lp.lopnColor = vbRed lp.lopnStyle = PS_SOLID lp.lopnWidth = pa 'ペンオブジェクト作成 hndPen = Api_CreatePenIndirect(lp) 'プリンタデバイスコンテキストにペンオブジェクト選択 oldPen = Api_SelectObject(prhDC, hndPen) 'プリンタデバイスコンテキストに角を丸めた長方形を描画 Ret = Api_RoundRect(prhDC, x1 * ex, y1 * ex, x2 * ex, y2 * ex, x3 * ex, y3 * ex) 'ペン削除 Ret = Api_DeleteObject(hndPen) '印刷プロセス終了 Ret = Api_EndPage(prhDC) If Ret >= 0 Then Ret = Api_EndDoc(prhDC) *cleanup If prhDC <> 0 Then Ret = Api_DeleteDC(prhDC) End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End