デバイス管理サーフェスを処理する
重要
Windows でプリンターとの通信手段として推奨されるのは、最新の印刷プラットフォームです。 プリンターデバイス開発におけるWindows 10および11での印刷体験をカスタマイズするために、MicrosoftのIPPインボックスクラスドライバーとPrint Support Apps (PSA)の使用を推奨します。
詳細については、最新の印刷プラットフォームに関する記事および「印刷サポート アプリの設計ガイド」を参照してください 。
Unidrv は、印刷ページイメージをレンダリングするときに、GDI で管理された描画サーフェスを使用します。 すべてのイメージはビットマップとしてレンダリングされます。 ベクトルを描画する機能など、このシナリオでは利用できない機能を持つデバイスの場合は、デバイス管理の描画サーフェスにカスタマイズされたドライバー サポートを提供できます。 デバイス管理サーフェスをサポートするには、次を実装するレンダリング プラグインを提供する必要があります。
Unidrv でサポートされているすべてのグラフィックス DDI 描画関数のフック関数のセット。 次の関数をフックする必要があります。
DrvAlphaBlendDrvBitBltDrvCopyBitsDrvDitherColorDrvFillPathDrvGradientFillDrvLineToDrvPlgBltDrvRealizeBrushDrvStretchBltDrvStretchBltROPDrvStrokeAndFillPathDrvStrokePathDrvTextOutDrvTransparentBlt
IPrintOemUni::EnableDriver メソッド。これは、グラフィックス DDI フック関数へのポインターを Unidrv に提供するために使用されます。
IPrintOemUni::D riverDMS メソッド。デバイスで管理されるサーフェスを使用することを Unidrv に通知し、定義されたフック関数のうち、どの関数をサーフェスに使用するかを指定します。
フック関数は、デバイス管理のサーフェス上に描画する場合、GDI の Eng 接頭辞が付いたサポート サービスをコールバックすることはできません。 ただし、一時的なビットマップ サーフェスを作成し、そのサーフェスのハンドルを Eng プレフィックス付きの描画関数に渡すことができます (「印刷ジョブのレンダリング」を参照)。
IPrintOemUni::D riverDMS メソッドは、印刷ジョブがレンダリングされるときに毎回呼び出されるため、レンダリング プラグインは、各ジョブのレンダリング サーフェスの種類 (GDI マネージドまたはデバイス管理) を指定できます。 ユーザー インターフェイスで選択可能なオプションに基づいてサーフェスの選択を行うには、ユーザー インターフェイス プラグインも提供する必要があります。
デバイスで管理されるサーフェス上のテキストの描画
レンダリング プラグインは、Unidrv の DrvTextOut 関数を (他のすべてのグラフィックス DDI 描画関数と共に) フックする必要があります。 デバイス管理サーフェスのテキストの作成には、次の 4 つの機能間の相互作用が含まれます。
Unidrv の DrvTextOut 関数
プラグインの DrvTextOut フック関数のレンダリング
Unidrv の IPrintOemDriverUni::DrvUniTextOut メソッド
プラグインの IPrintOemUni::TextOutAsBitmap メソッドのレンダリング
デバイス管理サーフェイスにテキストを表示する手順は次のとおりです。
GDI は Unidrv の DrvTextOut 関数を呼び出します。
Unidrv は、レンダリング プラグインの DrvTextOut フック関数を呼び出します。
フック関数は、テキストのブラシ、回転、クリップ領域を指定するコマンドをデバイスに送信します。
フック関数は、ダウンロードしたフォントを使用してテキストを出力する Unidrv の IPrintOemDriverUni::DrvUniTextOut メソッドを呼び出します。 このメソッドは、グリフベースのクリッピングも処理します。
IPrintOemDriverUni::DrvUniTextOut がダウンロード可能なフォントを使用できない場合 (フォントが使用できないか、回転しているため)、レンダリング プラグインの IPrintOemUni::TextOutAsBitmap メソッドを呼び出し、テキストをビットマップとして描画します。
IPrintOemDriverUni::DrvUniTextOut が返された後、DrvTextOut フック関数は、ベクター コマンド (サポートされている場合) を使用して、DrvTextOut 関数の prclExtra パラメーターで指定された四角形に基づいて下線と取り消し線を描画する必要があります。