プログラムによる印刷
OLE には、永続的なドキュメント (GetClassFile
) を一意に識別し、関連付けられているコード (CoCreateInstance
、QueryInterface(IID_IPersistFile)
、QueryInterface(IID_IPersistStorage)
、IPersistFile::Load
、および IPersistStorage::Load
) にそれらを読み込む機能が備わっています。 ドキュメントの印刷をさらに有効にするために、アクティブなドキュメントの格納 (もともと OLE 2.0 には同梱されていない既存の OLE デザインを使用) では、基本標準の印刷インターフェイス IPrint
が導入されています。これは、ドキュメントの種類の永続的な状態を読み込める任意のオブジェクトを通じて一般提供されます。 アクティブなドキュメントの各ビューは、必要に応じて IPrint
インターフェイスをサポートし、これらの機能を提供できます。
インターフェイスは IPrint
次のように定義されます。
interface IPrint : IUnknown
{
HRESULT SetInitialPageNum([in] LONG nFirstPage);
HRESULT GetPageInfo(
[out] LONG *pnFirstPage,
[out] LONG *pcPages);
HRESULT Print(
[in] DWORD grfFlags,
[in,out] DVTARGETDEVICE **pptd,
[in,out] PAGESET ** ppPageSet,
[in,out] STGMEDIUM **ppstgmOptions,
[in] IContinueCallback* pCallback,
[in] LONG nFirstPage,
[out] LONG *pcPagesPrinted,
[out] LONG *pnPageLast);
};
クライアントとコンテナーは、単に IPrint::Print
を使用して、ドキュメントが読み込まれたら、印刷コントロール フラグ、ターゲット デバイス、印刷するページ、追加のオプションを指定して、ドキュメント自体を印刷するように指示します。 クライアントは、IContinueCallback
インターフェイスを使用して印刷の継続を制御することもできます (下記参照)。
さらに、 IPrint::SetInitialPageNum
では、ページにシームレスに番号を付け、一連のドキュメントを 1 つのドキュメントとして印刷する機能がサポートされています。これは、Office Binder などのアクティブなドキュメント コンテナーにとって、明らかな利点です。 IPrint::GetPageInfo
は、呼び出し元が以前に SetInitialPageNum
に渡された開始ページ数 (またはドキュメントの内部の既定開始ページ数) とドキュメント内のページ数を取得できるようにすることで、改ページ情報を簡単に表示できます。
IPrint
をサポートするオブジェクトは、オブジェクトの CLSID の下に格納されている「印刷可能」キーを使用して、レジストリでマークされます。
HKEY_CLASSES_ROOT\CLSID\{...}\Printable
IPrint
は通常、IPersistFile
または IPersistStorage
をサポートする同じオブジェクトに実装されます。 呼び出し元は、レジストリで「印刷可能」キーを探し、一部のクラスの永続的な状態をプログラムで出力できるかを確認します。 現在、「印刷可能」は、少なくとも IPrint
に対するサポートを示します。ただし、今後、他のインターフェイスが定義される可能性があり、IPrint
がサポートの基本レベルを単に示す場合に QueryInterface
を介して使用できるようになる可能性があります。
印刷手順の間に、印刷を開始したクライアントまたはコンテナーが印刷を続行するかどうかを制御する必要が生じる場合があります。 たとえば、コンテナーで、可能な限り早急に印刷ジョブを終了する必要がある "Stop Print" コマンドがサポートされている場合があります。 この機能をサポートするために、印刷可能なオブジェクトのクライアントは、IContinueCallback
インターフェイスを使用して小規模な通知シンク オブジェクトを実装できます。
interface IContinueCallback : IUnknown
{
HRESULT FContinue(void);
HRESULT FContinuePrinting(
[in] LONG cPagesPrinted,
[in] LONG nCurrentPage,
[in] LPOLESTR pszPrintStatus);
};
このインターフェイスは、Win32 API のさまざまな継続プロシージャ (印刷の AbortProc
やメタファイル列挙型の EnumMetafileProc
など) に代わる汎用継続コールバック関数として役立つように設計されています。 このため、このインターフェイス設計は、時間のかかるさまざまなプロセスで役立ちます。
最も一般的なケースでは、IContinueCallback::FContinue
関数は時間を要するプロセスによって定期的に呼び出されます。 シンク オブジェクトは。操作を続行する場合は S_OK を返し、可能な限り早急に手順を停止するには S_FALSE を返します。
ただし、FContinue
は IPrint::Print
のコンテキストでは使用されず、印刷では IContinueCallback::FContinuePrint
外使用されます。 印刷オブジェクトは、印刷が完了したページの数、印刷されるページの数、およびクライアントがユーザーに表示する可能性がある印刷状態を記述する追加の文字列 (5/19 ページなど) を渡して、FContinuePrinting
を定期的に呼び出す必要があります。