次の方法で共有


DEVMODEW 構造体

DEVMODEW 構造体は、Microsoft Windows SDK ドキュメントで説明されている DEVMODE 構造体の Unicode バージョンです。 (DEVMODEW の「W」サフィックスは「Wide」または Unicode 文字を表します)。アプリケーションはどちらの構造体も使用できますが、ドライバーは DEVMODE 構造体ではなく DEVMODEW 構造体を使用する必要があります。

パブリック メンバーとプライベート メンバー

DEVMODEW 構造体の定義されたメンバー (多くの場合、パブリック DEVMODEW メンバーと呼ばれます) の直後に、ドライバー定義メンバー (そのプライベート DEVMODEW メンバー) のセットを指定できます。 次の図は、パブリック セクション (実際の DEVMODEW 構造体自体) とプライベート セクションを示しています。

Diagram illustrating the public and private sections of the DEVMODEW structure.

通常、プライベート メンバーはプリンター ドライバーでのみ使用されます。 ドライバーは、dmDriverExtra メンバー内のこのプライベート領域のサイズ (バイト単位) を提供します。 ドライバー定義のプライベート メンバーは、ドライバーによって排他的に使用されます。

プリンター ドライバーの場合、DEVMODEW 構造体は、印刷ドキュメントのユーザーの選択を指定するために使用されます。 また、印刷する部数、用紙サイズ、その他の属性など、プリンターに対してこれらの選択肢の既定値を指定するためにも使用されます。 ディスプレイ デバイスの場合、DEVMODEW 構造体は、ピクセルあたりのビット数、ピクセル サイズ、表示頻度などの表示属性を指定します。

DEVMODEW 構造体の初期化

ディスプレイ ドライバーとプリンター ドライバーのどちらを使用するかに応じて、DEVMODEW 構造体は 2 つの異なる方法で初期化されます。

  • ディスプレイ ドライバー DEVMODEW 初期化

    ディスプレイ ドライバーの DrvGetModes エントリ ポイントは、DEVMODEW 構造体のすべてのメンバーを 0 に初期化します。 次いで DrvGetModes は、ディスプレイ ドライバー DLL の名前を dmDeviceName メンバーにコピーし、dmSpecVersion メンバーと dmDriverVersion メンバーに DEVMODEW 構造体のバージョンを入力し、ディスプレイ属性情報を適切なメンバーにコピーします。

  • プリンター ドライバー DEVMODEW 初期化

    アプリケーションが DocumentProperties(Microsoft Windows SDK ドキュメントで説明しているプリンター インターフェイス DLL 関数) または DrvDocumentPropertySheets(NT ベースのオペレーティング システム グラフィックス DDI) を呼び出すと、既定値を使用して DEVMODEW 構造体が作成されます。 その後、アプリケーションは任意のパブリック DEVMODEW メンバーを自由に変更できます。 変更後、アプリケーションは、変更されたメンバーをドライバーの内部 DEVMODEW 構造体のメンバーとマージするために、前に呼び出したのと同じ関数に対して 2 回目の呼び出しを行う必要があります。 一部の変更が正しく機能しない可能性があるため、2 回目の呼び出しが必要です。DEVMODEW 構造体を修正するには、プリンター ドライバーを呼び出す必要があります。 ドキュメントを印刷しようとするとき、アプリケーションはマージされた DEVMODEW 構造体を CreateDC (Microsoft Windows SDK ドキュメントで説明) に渡し、それを DrvEnablePDEV DDI に渡します。 その時点で、ドライバーのレンダリング DLL は DEVMODEW 構造体を検証し、必要に応じて、印刷ジョブを実行する前に修復を試みます。

DEVMODEW 構造体の使用

いくつもの API とグラフィックス DDI が、印刷、デバイス機能のクエリ、ユーザー インターフェイスの表示などの目的で DEVMODEW 構造体の情報を使用します。 たとえば、DrvConvertDevMode は、DEVMODEW 構造体をあるオペレーティング システムのバージョンから別のバージョンに変換する印刷スプーラー グラフィックス DDI です。 これは、プリンター ドライバーが別のオペレーティング システムのバージョンで実行されている別のコンピューターから DEVMODEW 構造体を取得する場合に必要な場合があります。

DEVMODEW 構造体の変更

アプリケーションとドライバーは、DEVMODEW 構造体を自由に要求し、そのパブリック 部分を直接変更できます。 ただし、プライベート DEVMODEW 構造体のメンバーを変更できるのはドライバーのみです。

プライベート DEVMODEW 構造体のメンバーを変更するには、ドライバーは最初にプライベート データの先頭のオフセットを決定する必要があります。 この構造体の先頭を指すポインターと構造体のパブリック部分のサイズを保持する dmSize メンバーを指定すると、プライベート部分の先頭が見つかります。 次の例は、プライベート セクションの先頭へのポインターを初期化する方法を示しています。 この例では、 pdm は DEVMODEW 構造体の先頭を指しています。

PVOID pvDriverData = (PVOID)  (((BYTE *) pdm) + (pdm -> dmSize));

プリンター ドライバー/ディスプレイ ドライバー DEVMODEW の違い

DEVMODEW 構造体のメンバーは、次の 3 つのカテゴリに分類されます。

  • プリンター ドライバーによってのみ使用されるメンバー

  • ディスプレイ ドライバーでのみ使用されるメンバー

  • プリンター ドライバーとディスプレイ ドライバーの両方で使用されるメンバー

次の表に、プリンター ドライバーでのみ使用されるいくつかのパブリック DEVMODEW メンバーを示します。

プリンター ドライバーでのみ使用 パーパス
dmScale 印刷用にイメージを拡大縮小する割合を指定します。
dmCopies 印刷部数を設定します。
dmColor カラー プリンターでカラー印刷とモノクロ印刷のどちらを行うかを指定します。
dmOrientation 用紙の向き (縦または横) を指定します。

次の表に、ディスプレイ ドライバーでのみ使用されるパブリック DEVMODEW メンバーを示します。

ディスプレイ ドライバーでのみ使用 パーパス
dmBitsPerPel ディスプレイ デバイスの色解像度をビット/ピクセルで指定します。
dmPelsWidth 表示されるデバイス サーフェイスの幅をピクセル単位で指定します。
dmPelsHeight 表示されるデバイス サーフェイスの高さをピクセル単位で指定します。
dmDisplayFlags ディスプレイ モード (カラーとモノクロ、インターレース、非インターレース) を指定します。
dmDisplayFrequency ディスプレイのリフレッシュ レートをヘルツ単位で指定します。

3 番目の表は、プリンターとディスプレイ ドライバーの両方で使用されるいくつかのパブリック DEVMODEW メンバーを示しています。

プリンターおよびディスプレイ ドライバーで使用 パーパス
dmDeviceName ディスプレイの場合は、ディスプレイ ドライバーの DLL を指定します。 プリンターの場合は、プリンターの "フレンドリ名" を指定します。
dmFields その後に使用されている DEVMODEW メンバーを識別するビット フラグを指定します。 たとえば、dmBitsPerPel メンバーに有効なデータが含まれている場合、DM_BITSPERPEL フラグが設定されます。
dmSize DEVMODEW 構造体のパブリック部分のサイズをバイト単位で指定します。
dmDriverExtra パブリック構造体メンバーに続くプライベート ドライバー データのバイト数を指定します。 ディスプレイ ドライバーの場合、通常は 0 です。