プリンタの情報(’14/11)


Win32APIにプリンタの設定ダイアログを出す関数としてPageSetupDlgというのがあ
り、試しにVC++でこれを表示させてみました。

        図1 VC++2013Expressによる設定daialog

(余白欄が淡色無効になっているのは、ただ単に、上記関数のパラメータである
PAGESETUPDLGという構造体のFlagsメンバーをPSD_DISIBLEMARGINSとしたか
らです。)
ちなみにWindows8.1付属のメモ帳で見ましたら下図のように若干異なっていまし
た。

        図2 Windows8.1付属のメモ帳の設定daialog

このPageSetupDlgのパラメータである前述のPAGESETUPDLG構造体にも印刷
dialogを表示するPrintDlg関数のパラメータであるPRINTDLG構造体にもメンバーと
して、HGLOBAL hDevModeとHGLOBAL hDevNamesというのがあり、それぞれ
DEVMODE構造体というのとDEVNAMES構造体というものと関連しているものです
ので、これらを見ればデフォルトのプリンタ情報がわかるだろうということで調べて
みました。永遠の素人初心者ゆえに戸惑ったりミスったりしましたが、概略がわか
りました。

        図3

上の三個はDEVNAMES構造体情報から求めたものです。
その下のものは、DEVMODE構造体情報から求めたものです。
これらは、このDEVMODE構造体のdmFiledメンバーにビットがたっているものの内
容を調べたものです(中身の説明は省略します)。

さて、本稿を起こした理由は、以上の説明のためではなくて、初心者素人の私に
は理解しがたいことがあったからです。
DEVMODE構造体に関するMSDNライブラリの説明によれば、dmFieldsメンバーは、
この構造体において初期化されているメンバーはビットがたっているとありますの
で、そこに記載のある定数にたいして、(dmFiedsメンバ) & (定数)でビットチェック
をし、TRUE(1)のものだけを抜き出したものです。

しかるに、調べてみると、そのビットがたっていない 、すなわち、
  (dmFiedsメンバ) & (定数)=0
となるメンバーでも中身が設定されているものがいくつかあることが判明 しました。
それは下記です。

        図4

xResolutionと書きましたが、メンバー正式名はdmPrintQualityです。
dmyResolutionメンバーが入っているとき、ここには水平方向分解能が入るとありま
したので、こう表現しただけです。

で、私がきょろきょろ状態なのは、MSDNライブラリの説明と違うじゃんということで
す。すなわち、
  dmFiledにビットがたっていないのに、実は設定されているものがある
ということです。Epsonのdriverの作り方なんでしょうか?

尚、DEVNAMES構造体はちょっと変わったやつで戸惑いました(^^;。
でも、冗長的ですね。プリンタ名はこのDEVNAMES構造体にもDEVMODE構造体
にも入るのですから(DEVMODEの方はdmDeviceNamesメンバーに入りますね)。


戻る