プログラムによる印刷
OLE には、永続ドキュメントを個別に識別する機能として GetClassFile、永続ドキュメントを対応するコードに読み込む機能として CoCreateInstance、QueryInterface(IID_IPersistFile)、QueryInterface(IID_IPersistStorage)、IPersistFile::Load、および IPersistStorage::Load がありました。 Active ドキュメント コンテインメント アーキテクチャでは、OLE 2.0 に組み込まれていなかった既存の OLE デザインに基づき、ドキュメント印刷機能を拡張するために、最も基本的な印刷インターフェイス IPrint が採用されています。このインターフェイスは通常、ドキュメントの永続状態を読み込むことができるオブジェクトならば、どのオブジェクトからも利用できます。 Active ドキュメントの各ビューでは 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 バインダーなどの Active ドキュメント コンテナーには便利な機能です。 IPrint::GetPageInfo を使用すると、SetInitialPageNum に渡していた開始ページ番号 (またはドキュメントの既定の開始ページ番号) とドキュメントのページ数を取得できます。これらの情報は、ページ情報を表示するときに便利です。
IPrint をサポートするオブジェクトは、次に示すようにレジストリの CLSID の下に "Printable" キーが格納されます。
HKEY_CLASSES_ROOT\CLSID\{...}\Printable
通常、IPrint は、IPersistFile または IPersistStorage をサポートするオブジェクトに実装します。 呼び出し元は、クラスの永続状態をプログラムで印刷できるかどうかをレジストリの "Printable" キーで確認します。 現在のバージョンでは、"Printable" キーは少なくとも IPrint インターフェイスをサポートしていることを示しています。今後は、QueryInterface を介して使用できる新しいインターフェイスが定義され、IPrint は基本的な印刷機能だけをサポートするようになる可能性もあります。
印刷処理中に、印刷を開始したクライアントまたはコンテナーで、印刷の継続や中止を制御することもできます。 たとえば、印刷ジョブを即座に停止する [印刷中止] コマンドをコンテナーでサポートできます。 この機能をサポートするには、印刷可能オブジェクトのクライアントで、次の 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 を返します。
ただし、IPrint::Print では、印刷には IContinueCallback::FContinue の代わりに IContinueCallback::FContinuePrint が使用されます。 どの印刷オブジェクトでも、印刷対象ページ数、現在印刷中のページ番号、および印刷状況を示す文字列を引数として、FContinuePrint を定期的に呼び出す必要があります。これにより、クライアントはこれらの情報をユーザーに表示できます ("5/19 ページ" など)。