次の方法で共有


印刷プレビューのアーキテクチャ

更新 : 2007 年 11 月

ここでは、MFC フレームワークの印刷プレビュー機能がどのように実装されるかについて説明します。ここでは、次の内容について説明します。

  • 印刷プレビューの処理

  • 印刷プレビューの変更

印刷プレビューは、デバイス上に直接イメージを描画するのではなく、画面を使用してプリンタをシミュレートするものであるため、画面表示と印刷とはいくらか異なります。この問題に対応するために、MFC (Microsoft Foundation Class) ライブラリには、CDC クラス から派生した CPreviewDC という特殊な (非公開の) クラスが定義されています。すべての CDC オブジェクトには 2 つのデバイス コンテキストがありますが、この 2 つは通常同じものです。ただし、CPreviewDC オブジェクトの場合は異なり、1 つはシミュレートされたプリンタを表し、もう 1 つは出力結果が表示される画面を表します。

印刷プレビューの処理

[ファイル] メニューの [印刷プレビュー] を選択すると、フレームワークは CPreviewDC オブジェクトを作成します。アプリケーションが、プリンタ デバイス コンテキストの特性を設定すると、フレームワークによって、画面デバイス コンテキストも同じように設定されます。たとえば、アプリケーションで印刷用のフォントが選択された場合、フレームワークではプリンタ フォントをシミュレートする画面表示用のフォントが選択されます。アプリケーションで出力がプリンタに送られると、フレームワークでは出力が画面に送られます。

また、印刷プレビューでは、ドキュメントの各ページを描画する順番も印刷とは異なります。印刷では、特定範囲のページが描画されるまで、フレームワークによって印刷ループが継続されます。印刷プレビューでは、1 ページまたは 2 ページが表示されてから待機状態に入り、ユーザーが応答するまで新しいページは表示されません。また、印刷プレビュー時には、アプリケーションは、通常の画面表示の場合と同じく WM_PAINT メッセージに応答する必要があります。

プレビュー モードに入ると、印刷ジョブの開始時と同じように、CView::OnPreparePrinting 関数が呼び出されます。関数に渡された CPrintInfo 構造体 構造体にはいくつかのメンバが含まれます。このメンバでは、印刷プレビュー操作に関する特性を調整するための値を指定できます。たとえば、m_nNumPreviewPages メンバを設定すると、ドキュメントを 1 ページ モードでプレビューするか、2 ページ モードでプレビューするかを指定できます。

印刷プレビューの変更

印刷プレビューの動作および外観は、さまざまな方法で簡単に変更できます。たとえば、次のように変更できます。

  • 印刷プレビュー ウィンドウにスクロール バーを表示することで、ドキュメントの任意のページに簡単にアクセスできるようにします。

  • 現在のページから表示を開始することで、印刷プレビューで、ドキュメントのユーザーの位置が保持されるようにします。

  • 印刷と印刷プレビューで異なる初期化処理を実行されるようにします。

  • ユーザー独自の形式で、印刷プレビュー画面にページ番号が表示されるようにします。

ドキュメントの長さの値を指定して、SetMaxPage を呼び出すと、印刷時と同じようにプレビュー モードでもその情報を使用できます。フレームワークは、ドキュメントの長さがわかると、プレビュー ウィンドウにスクロール バーが表示されます。そのため、プレビュー モードでもページ間をスクロール バーで移動できるようになります。ドキュメントの長さを指定していない場合は、フレームワークでは、現在の位置を示すスクロール ボックスを配置できないため、スクロール バーは追加されません。この場合、プレビュー ウィンドウのコントロール バーにある [次ページ] ボタンおよび [前ページ] ボタンをクリックして、ドキュメントの表示ページを変更します。

印刷プレビューでは、CPrintInfom_nCurPage メンバに値を割り当てることもできます。これは、通常の印刷では実行しない操作です。通常の印刷処理中は、このメンバがフレームワークからビュー クラスに情報を通知します。フレームワークからビューにどのページを印刷するかが指示されます。

これに対して、印刷プレビュー モードが開始されると、m_nCurPage メンバは逆向きに、つまりビューからフレームワークに情報を通知します。フレームワークでは、どのページを最初にプレビューするのかをこのメンバの値によって決めます。このメンバの既定値は 1 です。したがって、ドキュメントの先頭ページが最初に表示されることになります。OnPreparePrinting をオーバーライドすると、[印刷プレビュー] をクリックした時に表示されているページ番号をメンバに指定できます。つまり、アプリケーションでは、標準的な表示モードから印刷プレビューモードに移行する時に、ユーザーの現在の位置を保持します。

印刷ジョブ用に呼び出すか、印刷プレビュー用に呼び出すかによって、OnPreparePrinting 関数の初期化処理が異なる場合があります。これは、CPrintInfo 構造体の m_bPreview メンバ変数を検証することで決めることができます。印刷プレビューが呼び出された場合は、メンバは TRUE に設定されます。

また、CPrintInfo 構造体の m_strPageDesc メンバでは、単一ページ モードおよび複数ページ モードで画面の下部に表示される文字列の書式を設定できます。既定では、この文字列は "ページ n" および "ページ n - m" という形式になっていますが、OnPreparePrinting 関数で m_strPageDesc を変更してより精密な形式にできます。詳細については、『MFC リファレンス』の「CPrintInfo 構造体」を参照してください。

参照

参照

印刷および印刷プレビュー

印刷

CView クラス

CDC クラス