C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 120 を表示中)
■72103 / )  Re[1]: プリンタ設定の保持方法
□投稿者/ Jitta (142回)-(2014/05/16(Fri) 22:17:35)
No72074 (トラウザー さん) に返信

 プリンタの印刷設定は、DEVMODE 構造体にあります。
http://msdn.microsoft.com/en-us/library/windows/desktop/dd183565.aspx

ここをよく読んでいただくと、「Contains the number of bytes of private driver-data that follow this structure.」と書かれているところに気がつくと思います。ここに書かれている構造体の後ろに、ドライバ(メーカーではない)独自のデータがあります。このデータを扱うためには、それぞれのメーカに仕様を公開していただくしかありません。
しかし、独自データも含めた DEVMODE 構造体を保存しておき、印刷前に設定してやれば、その設定で印刷できます。

 やり方は、まずは準備です。
1番目に、プリンタ フォルダを開いて、印刷したいプリンタの印刷設定を設定します。
2番目に、PrintDocument.DefaultPageSettings.CopyToHdevmode メソッドで、DEVMODE 構造体をコピーします。
http://msdn.microsoft.com/ja-jp/library/system.drawing.printing.pagesettings.copytohdevmode.aspx
3番目に、コピーした DEVMODE 構造体を保存します。
保存するサイズは、dmSize + dmDriverExtra です。
dmSize にアクセスするためには、先頭から WCHAR * CCHDEVICENAME + WORD + WORD サイズ分、読み飛ばします。
CCHDEVICENAME は、WinGDI.h で 32 と定義されています。
dmColor ~ dmCollate で short が5つあるのですが、dmCollate と dmFormName の間にギャップがありません。
dNF で定義するときは、ここに注意が必要です。
Pinvoke.net で公開されている定義では、dmFormName 以降がずれます。
# 2バイト境界にすればいいと思うのだけど、エラーになって設定できなかった。

 使用時には、
3で保存した DEVMODE 構造体を呼び出し、
PrintDocument.DefaultPageSettings.SetHdevmode メソッドで設定します。
http://msdn.microsoft.com/ja-jp/library/system.drawing.printing.pagesettings.sethdevmode.aspx

 ただし、Windows Vista 以降のプリンタ ドライバには、V3 ドライバと V4 ドライバがあります。
V3 ドライバであれば、上記方法で、基本的に大丈夫です(C 言語アプリで、複数のメーカのプリンタに対して実績有り)。
V4 ドライバの場合は分かりません。

 どちらのドライバかを見るには、プリント サーバのプロパティを開き、
ドライバ タブで、目的のプリンタを選択して、プロパティ ボタンをクリックします。
エクスプローラで、ドライバ パスにあるドライバ ファイルのプロパティを開きます。
ファイル バージョンが 0.3.0.0 なら、V3 ドライバです。


> エクセルの場合はファイルのシート毎に設定が残っていたりするのですが

 残っていません。
プリンタを選択したときに、そのプリンタの印刷設定を、すべてのシートに適用します。
印刷ダイアログを出し、他のプリンタを選択して、印刷ダイアログを閉じずにプリンタ フォルダから印刷設定を開いて、変更します。
そして、エクセルの印刷ダイアログに戻り、プリンタを選択し直して印刷すれば、すべてのシートに同じ印刷設定が適用されます。

返信 編集キー/


管理者用

- Child Tree -