印刷プレビューのアーキテクチャ
この記事では、MFC フレームワークで印刷プレビュー機能がどのように実装されているかを説明します。 取り上げるトピックは次のとおりです。
印刷プレビューは、デバイス上にイメージを直接描画するのではなく、画面を使用してプリンターをシミュレートする必要があるため、画面表示および印刷とは多少異なります。 これに対応するために、Microsoft Foundation Class ライブラリでは、CPreviewDC
という名前の、CDC クラスから派生した特殊な (ドキュメント化されていない) クラスが定義されています。 すべての CDC
オブジェクトには、2 つのデバイス コンテキストが含まれていますが、通常、それらは同じです。 CPreviewDC
オブジェクトでは、これらが異なります。1 つ目はシミュレートされるプリンターを表し、2 つ目は出力が実際に表示される画面を表します。
印刷プレビューのプロセス
ユーザーが [ファイル] メニューの [印刷プレビュー] コマンドを選択すると、フレームワークによって CPreviewDC
オブジェクトが作成されます。 アプリケーションがプリンター デバイス コンテキストの特性を設定する操作を実行するたびに、フレームワークも画面デバイス コンテキストに対して同様の操作を実行します。 たとえば、アプリケーションが印刷用のフォントを選択した場合、フレームワークはプリンターのフォントをシミュレートする画面表示のフォントを選択します。 アプリケーションがプリンターに出力を送信するたびに、フレームワークは代わりに画面に出力を送信します。
印刷プレビューと印刷では、それぞれがドキュメントのページを描画する順番も異なります。 印刷中、フレームワークは、特定範囲のページのレンダリングが完了するまで、印刷ループを続行します。 印刷プレビュー中は、いつでも 1 ページまたは 2 ページが表示され、その後、アプリケーションは待機します。ユーザーが応答するまで、それ以上のページは表示されません。 印刷プレビュー中、アプリケーションは通常の画面表示中と同様に、WM_PAINT メッセージにも応答する必要があります。
CView:: OnPreparePrinting 関数は、印刷ジョブの開始時に呼び出されるのと同様に、プレビュー モードが開始されたときに呼び出されます。 関数に渡される CPrintInfo 構造体には、印刷プレビュー操作の特定の性質を調整するために値を設定できるいくつかのメンバーが含まれています。 たとえば、m_nNumPreviewPages メンバーを設定して、ドキュメントを 1 ページ モードと 2 ページ モードのどちらでプレビューするかを指定できます。
印刷プレビューの変更
印刷プレビューの動作と外観は、さまざまな方法で簡単に変更できます。 たとえば、次のことができます。
ドキュメントの任意のページに簡単にアクセスできるように、印刷プレビュー ウィンドウにスクロール バーが表示されるようにします。
現在のページで表示を開始し、印刷プレビューでドキュメント内のユーザーの位置が保持されるようにします。
印刷プレビューと印刷に対して異なる初期化が実行されるようにします。
印刷プレビューで、ページ番号が独自の形式で表示されるようにします。
ドキュメントの長さがわかっていて、適切な値を指定して SetMaxPage
を呼び出す場合、フレームワークは印刷中と同じようにプレビュー モードでもこの情報を使用できます。 フレームワークがドキュメントの長さを認識すると、プレビュー ウィンドウにスクロール バーが表示されるため、ユーザーはプレビュー モードでドキュメントのページを前後に移動できます。 ドキュメントの長さを設定しなかった場合、フレームワークはスクロール ボックスを現在の位置を示すように配置できないため、スクロール バーは追加されません。 この場合、ユーザーはプレビュー ウィンドウのコントロール バーにある [次のページ] ボタンと [前のページ] ボタンを使用して、ドキュメントのページを移動する必要があります。
通常の印刷では CPrintInfo
の m_nCurPage メンバーに値を割り当てることはないとしても、印刷プレビューでは割り当てると便利な場合があります。 通常の印刷時には、このメンバーはフレームワークからビュー クラスに情報を伝達します。 これが、どのページを印刷するかをフレームワークがビューに伝えるしくみです。
これに対し、印刷プレビュー モードを開始すると、m_nCurPage メンバーは逆方向に、つまりビューからフレームワークに、情報を伝達します。 フレームワークは、このメンバーの値を使用して、どのページを最初にプレビューするかを決定します。 このメンバーの既定値は 1 であるため、初めにドキュメントの最初のページが表示されます。 OnPreparePrinting
をオーバーライドして、[印刷プレビュー] コマンドが呼び出されたときに表示されるページの番号をこのメンバーに設定できます。 こうすることで、アプリケーションは通常の表示モードから印刷プレビュー モードに移行するときに、ユーザーの現在の位置を維持します。
場合によっては、OnPreparePrinting
が呼び出されるのが印刷ジョブのためか印刷プレビューのためかに応じて、異なる初期化を実行させたいことがあります。 これを判断するには、CPrintInfo
構造体の m_bPreview メンバー変数を調べます。 このメンバーは、印刷プレビューが呼び出された場合、TRUE に設定されます。
CPrintInfo
構造体には、m_strPageDesc という名前のメンバーも含まれています。このメンバーは、単一ページ モードと複数ページ モードで画面の下部に表示される文字列を書式設定するために使用されます。 既定では、これらの文字列は "ページ n" と "ページ n - m" の形式になりますが、OnPreparePrinting
内から m_strPageDesc を変更して、より複雑な文字列に設定できます。 詳細については、MFC リファレンスの「CPrintInfo 構造体」を参照してください。