Re[7]: ハードコピー


[コメントツリー表示を見る] [発言時刻順表示を見る]

Posted by ao on 2001/03/07 16:39:05

In Reply to: Re[6]: ハードコピー Posted by ともや on 2001/03/07 13:13:11


    > できれば、PictureBoxは使いたくないんです
    > なぜかというと、本当はAccessで使いたいんです
    > で・・
    > AccessならFormの印刷でできるはずなんですが
    > FormにListViewを使用すると、印刷が正しくできないんで
    > DLLとかでサポートしたいんです

    サンプルがどんなものかはチェックしていませんが、
    クリップボード経由でALT+PrintScreenキーを利用しています。
    関数で作成していますが、DLL、EXEにも簡単にできるかと思います。
    前提としてAPIの利用宣言が必要です。

    'API利用宣言
    Public Declare Sub keybd_event Lib "user32" ( _
    ByVal bVk As Byte, _
    ByVal bScan As Byte, _
    ByVal dwFlags As Long, _
    ByVal dwExtraInfo As Long)


    '関数本体
    Public Function cfintPrtScr() As Integer

    Const strProcName = "cfintPrtScr"
    On Error GoTo Err_Rtn

    Dim PictureRatio! '縦横比率
    Dim PicHeight! '画像幅
    Dim PicWidth! '画像高さ
    Dim PrnHeight! 'プリンタ幅
    Dim PrnWidth! 'プリンタ高さ

    'マウスポインタを砂時計にする
    Screen.MousePointer = vbArrowHourglass

    '====================================================================
    '画像の取得:仮想キーコードをWindowsに渡してCripBoardに貼り付ける
    '====================================================================
    'クリップボードの初期化
    Clipboard.Clear
    ' [Alt]キーを押す
    keybd_event VK_LMENU, _
    0, _
    KEYEVENTF_EXTENDEDKEY, _
    0
    ' [PrintScreen]キーを押す
    keybd_event VK_SNAPSHOT, _
    0, _
    KEYEVENTF_EXTENDEDKEY, _
    0
    DoEvents
    ' [PrintScreen]キーを離す
    keybd_event VK_SNAPSHOT, _
    0, _
    KEYEVENTF_EXTENDEDKEY Or _
    KEYEVENTF_KEYUP, _
    0
    ' [Alt]キーを離す
    keybd_event VK_LMENU, _
    0, _
    KEYEVENTF_EXTENDEDKEY Or _
    KEYEVENTF_KEYUP, _
    0

    '====================================================================
    '印刷前処理 (印字方向、縮尺率の設定)
    '====================================================================
    intClipW = Clipboard.GetData().Width '取得した画像の幅
    intClipH = Clipboard.GetData().Height ' 〃 高さ

    PictureRatio! = intClipW / intClipH

    '印刷方向の設定
    '画像が横長のとき
    If PictureRatio! >= 1 Then
    Printer.Orientation = vbPRORLandscape '横印刷
    '画像が縦長のとき
    Else
    Printer.Orientation = vbPRORPortrait '縦印刷
    End If

    '単位をあわせる
    PrnWidth! = Printer.ScaleX(Printer.ScaleWidth, _
    Printer.ScaleMode, _
    vbHimetric)
    PrnHeight! = Printer.ScaleY(Printer.ScaleHeight, _
    Printer.ScaleMode, _
    vbHimetric)

    '画像が印刷範囲外の場合縮尺率を算出して小さい方を採用する
    If (intClipW > PrnWidth!) Or (intClipH > PrnHeight!) Then
    dblPrZoomW = (PrnWidth! / intClipW)
    dblPrZoomH = (PrnHeight! / intClipH)
    ' ZOOMに対応していないPRINTERがあるので自力で縮尺
    If dblPrZoomW > dblPrZoomH Then
    PrnWidth! = Int(intClipW * dblPrZoomH)
    PrnHeight! = Int(intClipH * dblPrZoomH)
    Else
    PrnWidth! = Int(intClipW * dblPrZoomW)
    PrnHeight! = Int(intClipH * dblPrZoomW)
    End If
    End If

    '単位を元に戻す
    PrnWidth! = Printer.ScaleX(PrnWidth!, vbHimetric, Printer.ScaleMode)
    PrnHeight! = Printer.ScaleY(PrnHeight!, vbHimetric, Printer.ScaleMode)

    '====================================================================
    '印刷処理
    '====================================================================
    Printer.PaintPicture Clipboard.GetData(), 0, 0, PrnWidth!, PrnHeight!

    '印刷を終了し、制御を印刷デバイスやスプーラに渡す
    Printer.EndDoc
    DoEvents

    'マウスポインタをデフォルトにする
    Screen.MousePointer = vbDefault

    cfintPrtScr = 0


    Exit Function


    '====================================================================
    'エラー処理:プリンタエラーは無視
    '====================================================================
    Err_Rtn:
    On Error Resume Next '印刷JOBがない場合にエラーで落ちない為
    cfintPrtScr = -1
    '印刷できない場合にOSからエラーが出るためJOBを消す
    Printer.KillDoc
    Screen.MousePointer = vbDefault
    Err = 0
    Exit Function
    End Function


記事スレッド一覧