テクニカル ノート 30: 印刷と印刷プレビューのカスタマイズ
[!メモ]
次のテクニカル ノートは、最初にオンライン ドキュメントの一部とされてから更新されていません。結果として、一部のプロシージャおよびトピックが最新でないか、不正になります。最新の情報について、オンライン ドキュメントのキーワードで関係のあるトピックを検索することをお勧めします。
ここでは、印刷や印刷プレビュー カスタマイズするプロセスについて説明し、 CView で使用されるコールバックのルーチンのオブジェクトと CPreviewViewのコールバックのルーチンやメンバー関数について説明します。
問題
MFC は、ほとんどの印刷や印刷プレビューのための完全なソリューションを提供します。ほとんどの場合、小さいコードを追加し、印刷プレビュー機能できるビューを持つ必要があります。ただし、印刷を最適化する開発者のための、多大な労力を必要とする場合、アプリケーションは印刷プレビュー モードに固有のユーザー インターフェイス要素を追加する必要があります方法があります。
効率的な印刷
MFC アプリケーションが標準の方法を使用して印刷すると、ウィンドウはメモリ内メタファイルにすべてのグラフィック デバイス インターフェイス (GDI) の出力の呼び出しを指示します。EndPage が呼び出されると、ウィンドウはプリンターは、 1 ページを印刷するように要求する各物理バンドのメタファイルを一度します。この描画中に、 GDI は、必要な続行するかどうかを判断にアボート プロシージャを呼び出します。通常、アボート プロシージャは、ユーザーが印刷ダイアログを使用して印刷ジョブを中止するにメッセージが処理されるようにします。
ただし、これは印刷プロセスが低下する可能性があります。標準手法を使用して実行できる、より高速アプリケーションの印刷が必要がある場合は、手動バンドを実行します。
印刷バンド
OnPrint が複数回ページごとに呼び出されます。手動でバンドを使用して、実装について印刷ループ、こうした (一度バンド 1 人に)。印刷ループは viewprnt.cpp の OnFilePrint 関数で実行されます。CView- 印刷コマンドを処理するメッセージ マップ エントリが print 関数をダイヤルするようにその派生クラス、この関数をオーバーロードします。OnFilePrint ルーチンをコピーし、実装のバンドに印刷ループを変更します。印刷するページのセクションに基づいて描画を最適化することも、印刷の関数にバンドの四角形を渡す場合。
2 番目にバンドを描画するときに、頻繁に QueryAbort をダイヤルします。それ以外の場合は、アボート プロシージャは呼び出されず、ユーザーは印刷ジョブを取り消すことはできません。
印刷プレビュー: ユーザー インターフェイスを持つエレクトロニックのフォーム
印刷プレビュー、主に、プリンターのエミュレーションに表示を切り替える試みます。既定では、メイン ウィンドウのクライアント領域がペイン内のページを十分に表示するために使用されます。ユーザーが詳しく表示するページの領域にズーム インします。追加サポートによって、ユーザーがプレビュー モード ドキュメントを編集する権限を持っている場合があります。
印刷プレビューのカスタマイズ
ここでは、変更の印刷プレビューの 1 種類の側でのみ処理: プレビュー モードに UI を追加します。ほかの変更は有効ですが、このような変更はこの説明の範囲外にあります。
UI をプレビュー モードに追加するには
CPreviewViewからビュー クラスを派生します。
目的の UI の辺のコマンド ハンドラーを追加します。
表示するビジュアルな部分を追加する場合は、 OnDraw をオーバーライドし、 **CPreviewView::OnDraw.**を呼び出した後に描画を実行します。
OnFilePrintPreview
これは、印刷プレビュー用のコマンド ハンドラーです。既定の実装は次のとおりです:
void CView::OnFilePrintPreview()
{
// In derived classes, implement special window handling here
// Be sure to Unhook Frame Window close if hooked.
// must not create this on the frame. Must outlive this function
CPrintPreviewState* pState = new CPrintPreviewState;
if (!DoPrintPreview(AFX_IDD_PREVIEW_TOOLBAR, this,
RUNTIME_CLASS(CPreviewView), pState))
{
// In derived classes, reverse special window handling
// here for Preview failure case
TRACE0("Error: DoPrintPreview failed");
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
delete pState; // preview failed to initialize,
// delete State now
}
}
DoPrintPreview 、アプリケーションのメイン ペインを非表示にします。コントロール バー、ステータス バーなどの pState-> のdwStates のメンバーでプロパティを指定することによって、使用できます (これはビット マスクであり、個々のコントロールのバーのビットは AFX_CONTROLBAR_MASK(AFX_IDW_MYBAR)によって定義されます)。ペインの pState->nIDMainPane は自動的に reshown 非表示にするウィンドウです。DoPrintPreview は、標準プレビュー UI のボタンのバーを作成します。他のペインを非表示にしたりすることを示すために特別のペインの処理は必要に応じて、などです DoPrintPreview が呼び出される前に。
印刷プレビューが終了すると、既定では、可視に元の状態、およびメイン ペインにコントロール バーを返します。特別な処理が必要な場合は、 **EndPrintPreview.**のオーバーライドにする必要があります。DoPrintPreview が失敗した場合は、特別な処理を提供します。
DoPrintPreview はで呼び出されます:
プレビュー ツールバーのダイアログ テンプレートのリソース id。
印刷プレビューの印刷を実行するビューへのポインター。
プレビュー ビュー クラスのランタイム クラス。これは DoPrintPreview で動的に作成されます。
CPrintPreviewState のポインター。アプリケーションが管理する詳細に状態が必要な場合は CPrintPreviewState の構造体 (または派生構造)を作成できないことに帯に注意してください。DoPrintPreview は、モードレスであり、 EndPrintPreview が呼び出されるまで、この構造は存続する必要があります。
[!メモ]
別のビューまたはビュー クラスがサポートを印刷するために必要な場合は、そのオブジェクトへのポインターは 2 番目のパラメーターとして渡す必要があります。
EndPrintPreview
これが印刷プレビュー モードを終了するために呼び出されます。多くの場合、印刷プレビューに最後に表示されるドキュメントのページに移動することを推奨します。EndPrintPreview を使用するアプリケーションのことです。pInfo-> のm_nCurPage のメンバーは、 2 ページが表示される最後に (左端)表示、ポインターはに関連するページのユーザーに必要なツール ヒントですページです。アプリケーションのビューの構造はフレームワークに不明であるため、選択したポイントに移動するコードを記述します。
CView::EndPrintPreviewを呼び出す前に、ほとんどの操作を実行する必要があります。この呼び出しは DoPrintPreview の効果を元に戻し、 pView、 pDC と pInfo を削除します。
// Any further cleanup should be done here.
CView::EndPrintPreview(pDC, pInfo, point, pView);
CWinApp::OnFilePrintSetup
これは、印刷設定のメニュー項目にマップする必要があります。ほとんどの場合、実装をオーバーライドする必要はありません。
ページの専用語
別の問題はページ数と順序の場合です。単純なワード プロセッサの種類のアプリケーションの場合、これは単純な問題です。ほとんどの印刷プレビューのシステムは各ページが印刷ドキュメントの 1 ページに対応すると仮定します。
汎用ソリューションを提供することで考慮する必要があるいくつかの点があります。CAD システムとします。ユーザーは複数の E サイズのシートをカバーする描画があります。E サイズ (または小さいの、スケーリング)プロッターで、ページ番号は、単純なケースとしてあります。ただし、シートごとのサイズ 16 のページを印刷するレーザー プリンターで印刷プレビューは、を 「ページ」と解釈しますか。
入門用の段落の状態として、印刷プレビューはプリンターのように動作します。したがって、ユーザーが選択した特定のプリンターから表示される内容が表示されます。これにより、イメージは各ページで出力されるかを決定するビューがあります。
CPrintInfo の構造のページの説明文字列には、ユーザーがページごとに 1 回の数として表すことができるページ番号を表示する方法を示します (「1 " ページには」)。この文字列は CPreviewView::OnDisplayPageNumberの既定の実装によって使用されます。別のディスプレイが必要な場合は、 1 のときは、たとえば、 「Sheet1 のセクション 12 A の C」を使用する場合は、この仮想関数をオーバーライドする場合があります。