none
StretchBltについて

    質問

  • ビットマップファイルを印刷するプログラムを自前で作成しております.

    ビットマップを用紙サイズに合わせるために,StretchBlt()を利用していますが,あるプリンタで印刷しようとすると戻り値がFALSEとなってしまいます.

    プリンタはセキュリティプリンタ(IDカード等をかざして印刷する複合機)です(関係あるかは分かりませんが,SmartSESAME SecurePrintというツールで複合機の管理を行っています).

    簡単な流れとしては,

      StartDoc()

      StartPage()

      StretchBlt()

      EndPage()

      EndDoc()

    としています.

    StatDoc()の時点で,プリンタキューの状態が「一時停止ースプール中」となっていたため,SetPrinter()や,SetJob()にて一時停止状態を解除しても,うまくいきません.プリンタ自体もでStretchBlt()をサポートしているようです(GetDeviceCapsで確認).

    何か処理が不足しているのかなど,アドバイスを頂ければ幸いです.

         

    2018年3月28日 2:53

すべての返信

  • StartDoc()の前にプリンタDCを作成していると思うのですが、それを含めて、

    (1)戻り値の監視(エラーの有無)。
    (2)エラーの場合、GetLastError()をやって見る。

    を、まずやって見るべきだと考えます。

    2018年3月28日 4:06
  • > プリンタ自体もでStretchBlt()をサポートしているようです(GetDeviceCapsで確認).
    確認ですけど、GetDeviceCaps( RASTERCAPS ) API コールで、RC_STRETCHBLT がセットされてくることは間違いないんですよね?
    また「戻り値がFALSEとなってしまいます」というのは、StretchBlt() だけなんですよね?
    つまり  StartDoc(),  StartPage() 等ではエラーは発生していないという認識で間違いありませんか?
    上記私からの確認事項がすべて Yes なら、プリンタ毎に結果が異なるとのことですので、プリンタ デバイス。。。。というかプリンタ ドライバ側問題の可能性が考えられます。
    なので本筋で言えば、プリンタ ドライバ側で対処すべき問題だと思います。
    それでもアプリ側での回避策を追求するのであれば。。。。

    > StatDoc()の時点で,プリンタキューの状態が「一時停止ースプール中」となっていたため,
    > SetPrinter()や,SetJob()にて一時停止状態を解除しても,うまくいきません.
    印刷できないプリンタの方では、毎回この状態になるのでしょうか?
    だとしたなら、StretchBlt() コール以前に問題が起きているのでは?
    まずは最初にエラーが発生するのがどこなのか、きちんと確認する必要があると思います。

    > ビットマップを用紙サイズに合わせるために,
    > StretchBlt()を利用していますが,
    > あるプリンタで印刷しようとすると戻り値がFALSEとなってしまいます.

    StretchBlt() API コールでのみ FALSE となるのであれば、正常に印刷できるプリンタと本問題が発生するプリンタで、StretchBlt() での Stretch Mode に差異が無いか確認してみては?
    (異なってたら、印刷できてる Stretch Mode に合わせて試してみる。)
    ---------------------------------------------
    GetStretchBltMode function
    https://msdn.microsoft.com/ja-jp/library/windows/desktop/dd144926(v=vs.85).aspx

    SetStretchBltMode function
    https://msdn.microsoft.com/ja-jp/library/windows/desktop/dd145089(v=vs.85).aspx
    ---------------------------------------------
    2018年3月28日 6:19
  • >ビットマップを用紙サイズに合わせるために,StretchBlt()を利用していますが,あるプリンタで印刷しようとすると

    >戻り値がFALSEとなってしまいます.

    最近の(2000年以降)プリンタードライバーではビットマップをまじめに処理しないものが見受けられます。

    >プリンタ自体もでStretchBlt()をサポートしているようです(GetDeviceCapsで確認).

    情報が不足しています。RC_BITBLIT で調べたのですか?RC_BITMAP64 の結果は調べましたか?

    RC_STRETCHBLT で調べたのですか?

    真面目に対応していないものには、能力があると GetDeviceCaps() で返事しておきながら大きなビットマップは処理しない

    ものがありました。

    良い方法として、DDB ではなく DIB か DIBSection かを使うことをお薦めします

    2018年3月28日 7:08
  • ご回答ありがとうございます.

    戻り値を監視して,エラーが発生しているか否か,エラーの場合にどのようなエラーなのかを調べてみたいと思います.

    2018年3月29日 8:32
  • ご回答ありがとうございます.

    StretchBlt以前にエラーがないか,またStretch Modeの確認を実施してみます.

    2018年3月29日 8:34
  • ご回答ありがとうございます.

    GetDeviceCaps()ではRC_STRETCHBLTの結果を調べました.RC_BITMAP64については調べていないので,追加で調べるようにしてみます.

    2018年3月29日 8:37