印刷ダイアログ表示とプリンタ名取得          <TOP>


印刷ダイアログボックスを表示、プリンタを選択し「印刷」をクリックした時そのプリンタ名を取得します。

PrintDlg 印刷ダイアログボックスを作成

DeleteObject 論理オブジェクトを削除し、全てのリソースを解放

MoveMemory メモリの指定領域をコピー

GlobalLock ヒープに確保されたメモリをロック

GlobalUnlock メモリブロックのロックを解除

GlobalFree メモリブロックのロックを解放

 

Declare Function Api_CreateDC& Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName$, ByVal lpDevName$, ByVal lpOutput$, ByVal lpInitData&)
等でのlpDevName$はプロパティで表示される"EPSON PX-G920"、"KONICA MINOLTA magicolor 2400W"などが必要になります。

例では、「印刷ダイアログ表示」をクリックするとデフォルトのプリンタにチェックが付いた印刷ダイアログが表示されます。

希望するプリンタを選択し、「印刷」ボタンをクリックするとlpDevName$で必要なプリンタ名が取得されます。(但し、32文字以上はカットされます。)

参照

角度のある文字列を印刷

 

'================================================================
'= 印刷ダイアログ表示とプリンタ名取得
'=    (PrintDlg.bas)
'================================================================
#include "Windows.bi"

#define PD_COLLATE &H10                 '入力時に「部単位で印刷」チェックボックスがセットされる
#define PD_DISABLEPRINTTOFILE &H80000   '「ファイルへ出力」チェックボックスを無効にする
#define PD_ENABLEPRINTHOOK &H1000       'lpfnHookで指定されたフック関数を有効にする
#define PD_ENABLEPRINTTEMPLATE &H4000   'hInstanceがlpPrintTemplateNameメンバで指定されたダイアログテンプレートを含むリソースのインスタンスで
#define PD_ENABLEPRINTTEMPLATEHANDLE &H10000 'hPrintTemplateメンバがロード済みのダイアログボックステンプレートを含むメモリブロ
#define PD_ENABLESETUPHOOK &H2000       'lpfnSetupHookで指定されたフック関数を有効にする
#define PD_ENABLESETUPTEMPLATE &H8000   'hInstanceおよびlpSetupTemplateNameで指定されたダイアログボックステンプレートを使用することを示す
#define PD_ENABLESETUPTEMPLATEHANDLE &H20000 'hSetupTemplateメンバがロード済みのダイアログボックステンプレートを含むメモリブロ
#define PD_HIDEPRINTTOFILE &H100000     '「ファイルへ出力」チェックボックスを隠す
#define PD_NONETWORKBUTTON &H200000     '「ネットワーク」ボタンを無効にする
#define PD_NOPAGENUMS &H8               '「ページ設定」ボタンと関連する編集コントロールを無効にする
#define PD_NOSELECTION &H4              '「選択した部分」ボタンを無効にする
#define PD_NOWARNING &H80               'デフォルトプリンタがない場合に、警告を表示しない
#define PD_PAGENUMS &H2                 '「ページ設定」ボタンが選択された状態であることを示す
#define PD_PRINTSETUP &H40              '「プリンタの設定」ダイアログボックスを表示する
#define PD_PRINTTOFILE &H20             '「ファイルへ出力」チェックボックスがチェック状態であることを示す
#define PD_RETURNDC &H100               'hDCにデバイスコンテキストを格納することを表す
#define PD_RETURNDEFAULT &H400          'ダイアログを表示せず、システム設定のデフォルトプリンタで初期化する
#define PD_RETURNIC &H200               'hDCに情報コンテキストを格納することを表す
#define PD_SELECTION &H1                '「選択した部分」ボタンが選択されていることを示す
#define PD_SHOWHELP &H800               '「ヘルプ」ボタンを表示する
#define PD_USEDEVMODECOPIES &H40000     'PD_USEDEVMODECOPIESANDCOLLATEと同じ
#define PD_USEDEVMODECOPIESANDCOLLATE &H40000 'プリンタドライバが複数部印刷をサポートしていない場合「部数」編集コントロールを無

Type PRINTDLG
    lStructSize    As Long              '構造体のサイズをバイト単位で指定
    hwndOwner      As Long              '親ウィンドウのハンドルを指定
    hDevMode       As Long              'DEVMODE構造体を含んでいるグローバルメモリオブジェクトのハンドルを指定
    hDevNames      As Long              'DEVNAMES構造体を含んだグローバルメモリオブジェクトのハンドルを指定
    hdc            As Long              'デバイスコンテキスト
    flags          As Long              '印刷ダイアログボックスを初期化するために使われるビットフラグのセットを指定
    nFromPage      As Integer           'スタートページの初期値
    nToPage        As Integer           '最後のページの初期値
    nMinPage       As Integer           'ページ範囲の最小値
    nMaxPage       As Integer           'ページエディットコントロールの最大値
    nCopies        As Integer           '印刷部数の初期値
    hInstance      As Long              'インスタンスハンドル
    lCustData      As Long              'フック関数に渡すアプリケーション定義のデータ
    lpfnPrintHook  As Long              'フックプロシージャのポインタ
    lpfnSetupHook  As Long              'フックプロシージャのポインタ
    lpPrintTemplateName As String * 32  'ダイアログボックステンプレートの名前
    lpSetupTemplateName As String * 32  'ダイアログボックステンプレートの名前
    hPrintTemplate As Long              'DEVNAMES構造体の文字列がデフォルトのプリンターかどうかを表す
    hSetupTemplate As Long              '
End Type

Type DEVNAMES
    wDriverOffset As Integer            'デバイスドライバのファイル名を表す文字列へのオフセットアドレス
    wDeviceOffset As Integer            'デバイスの名前を表す文字列へのオフセットアドレス
    wOutputOffset As Integer            '出力ポートのデバイス名をあらわす文字列へのオフセットアドレス
    wDefault      As Integer            '
    extra         As String * 100       '
End Type

Type DEVMODE
    dmDeviceName       As String * 32   'ドライバがサポートするデバイス名
    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 * 32   'フォーム名を指定
    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_PrintDlg& Lib "comdlg32" Alias "PrintDlgA" (lpPrintdlg As PRINTDLG)

' 論理オブジェクトを削除し、そのオブジェクトに関連付けられていたすべてのシステムリソースを解放
Declare Function Api_DeleteObject& Lib "gdi32" Alias "DeleteObject" (ByVal hObject&)

' メモリの指定領域をコピー
Declare Sub MoveMemory Lib "Kernel32" Alias "RtlMoveMemory" (Dest As Any, Source As Any, ByVal length&)

' ヒープに確保されたメモリをロック
Declare Function Api_GlobalLock& Lib "kernel32" Alias "GlobalLock" (ByVal hMem&)

' メモリブロックのロックを解除
Declare Function Api_GlobalUnlock& Lib "kernel32" Alias "GlobalUnlock" (ByVal hMem&)

' メモリブロックのロックを解放
Declare Function Api_GlobalFree& Lib "kernel32" Alias "GlobalFree" (ByVal hMem&)

Var Shared Text1 As Object
Var Shared Button1 As Object

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

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var hMemMode As Long
    Var pMemMode As Long
    Var hMemName As Long
    Var pMemName As Long
    Var pd As PRINTDLG
    Var dm As DEVMODE
    Var dn As DEVNAMES
    Var Ret As Long

    '印刷ダイアログを表示
    pd.hInstance = GethInst
    pd.hwndOwner = GethWnd
    pd.lStructSize = 66        'Len(pd)
    pd.hDevMode = hMemMode
    pd.hDevNames = hMemName
    pd.flags = PD_RETURNDC     'PD_DISABLEPRINTTOFILE Or PD_RETURNDC Or PD_ALLPAGES Or PD_PAGENUMS Or PD_USEDEVMODECOPIES
    pd.nFromPage = 1
    pd.nToPage = 15
    pd.nMinPage = 1
    pd.nMaxPage = 15

    Ret = Api_PrintDlg(pd)

    '「印刷」<> 0、「キャンセル」= 0
    If Ret = 0 Then
        Text1.SetWindowText "「キャンセル」が選択されました"
        Ret = Api_GlobalFree(pd.hDevMode)
        Ret = Api_GlobalFree(pd.hDevNames)
        Exit Sub
    End If

    pMemMode = Api_GlobalLock(pd.hDevMode)
    MoveMemory dm, ByVal pMemMode, Len(dm)
    Ret = Api_GlobalUnlock(pd.hDevMode)
    Ret = Api_GlobalFree(pd.hDevMode)

    pMemName = Api_GlobalLock(pd.hDevNames)
    MoveMemory dn, ByVal pMemName, Len(dn)
    Ret = Api_GlobalUnlock(pd.hDevNames)
    Ret = Api_GlobalFree(pd.hDevNames)

    Text1.SetWindowText "「" & Left$(dm.dmDeviceName, InStr(dm.dmDeviceName, Chr$(0)) - 1) & "」が選択されました"
    Ret = Api_DeleteObject(pd.hdc)
End Sub

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