2019年2月8日金曜日

印刷ダイアログで指定した枚数の二乗印刷されてしまう問題

PictureFan の印刷周りのコードを見直していて色々調べていたところ、MS のドキュメントに何やら知らないことが書いてあるのを見つけてしまいました。

PRINTDLGEXA structure

Starting with Windows Vista, when you call PrintDlg or PrintDlgEx with PD_RETURNDC set to TRUE and PD_USEDEVMODECOPIESANDCOLLATE set to FALSE, the PrintDlg or PrintDlgEx function sets the number of copies in the nCopies member of the PRINTDLG structure, and it sets the number of copies in the structure represented by the hDC member of the PRINTDLG structure.

When making calls to GDI, you must ignore the value of nCopies, consider the value as 1, and use the returned hDC to avoid printing duplicate copies.

いつの間にかそんな変更されても困るんですけど…。

というわけで、Vista 以降は PD_USEDEVMODECOPIESANDCOLLATE を付けようが付けまいが、 PD_RETURNDC を使っている場合は nCopies とか PD_COLLATE は無視して、1回だけ描画すればいいということですね(ですよね?)。

確かに同じものを複数枚印刷する場合には、アプリケーション側で同じデータを何度も転送するより、OS とかドライバとかハードウェアとかのもっと低いレイヤで扱った方が効率的にできるでしょう。
しかしいきなりこんな変更をされたら、既存のプログラムで二乗枚印刷されるようになってしまうと思うのですが、manifest で Vista 対応が宣言されているかで挙動が変わるのかも知れません。

現在の PictureFan (ver.0.36.0)には、この複数枚印刷しようとすると二乗枚印刷される不具合がありますので注意してください。
手元では既に修正していますが、他に大幅に手を入れてしまっているため、いつ公開できるかは未定です。
他にも不具合をいくつか発見しているので、なるべく早めに公開したいところではありますが。

2/25修正: 当初ボケて2倍と書いていましたが二乗でした。

0 件のコメント:

コメントを投稿