このメモの印刷をカスタマイズするプロセスについて説明します印刷プレビューおよびCViewとコールバック ルーチンとCPreviewViewのメンバー関数で使用されるコールバック ルーチンの目的について説明します。
問題
MFC の完全なソリューション提供のほとんどの印刷と印刷プレビュー必要があります。ほとんどの場合、少し追加のコードは、ビューの印刷およびプレビューすることが必要です。ただし、開発者は、一部の重要な努力を必要とする印刷を最適化する方法があり。、いくつかのアプリケーションが印刷プレビュー モードを特定のユーザー インターフェイス要素を追加する必要があります。
効率的な印刷
標準的な方法を使用して MFC アプリケーションを印刷する場合、Windows はメモリ内のメタファイルのすべてのグラフィカル デバイス インターフェイス (GDI) 出力呼び出しを指示します。EndPageが呼び出されると、Windows プリンターが 1 つのページを印刷する各物理的なバンドの 1 回のメタファイルを再生します。このレンダリング中に GDI は頻繁にそれが続行するかを決定するには、アボート プロシージャを照会します。通常、アボート プロシージャが印刷ダイアログ ボックスを使用して、印刷ジョブを中止するように、処理するメッセージをできます。
残念ながら、この印刷のプロセスを遅くことができます。印刷アプリケーションでは標準の技術を使用して達成することができますよりも高速にする必要がある。 場合は、手動によるバンド処理を実装する必要があります。
印刷バンド処理
OnPrint複数回 (バンド) 1 回ずつ呼び出されるように手動でバンドには、再、印刷ループを実装する必要があります。印刷ループは viewprnt.cpp のOnFilePrint関数で実装されています。あなたのCViewで-派生クラス、印刷コマンドを処理するためのメッセージ マップ エントリを印刷関数を呼び出すので、この関数をオーバー ロードします。OnFilePrintルーチンをコピーし、縞模様を実装するのには印刷ループを変更します。おそらくまた図面が印刷されるページのセクションを最適化することができますように、ラバー バンディング矩形の独自の印刷関数に渡す必要。
第二に、頻繁にバンドを描きながらQueryAbortを呼び出す必要があります。それ以外の場合、アボート プロシージャがないと呼ばれる取得され、ユーザーは印刷ジョブをキャンセルすることはできません。
特価: 印刷プレビュー;ユーザー インターフェイスを備えた電子用紙(&N)
印刷プレビュー、本質的には、表示には、プリンターのエミュレーションを有効にしようとします。既定では、完全に、ウィンドウ内の 1 つまたは 2 つのページを表示するには、メイン ウィンドウのクライアント領域が使用されます。ユーザーより詳細に見るためにページの領域を拡大することです。追加のサポートでは、ユーザーも、プレビュー モードでドキュメントを編集できる場合があります。
印刷プレビューのカスタマイズ
このメモにのみ印刷プレビューの変更の 1 つの側面でお得な情報: 追加の UI をプレビュー モード。このような変更は、この議論の範囲外の他の変更は可能ですが。
簡単に、UI、プレビュー モードに追加するプロセスのこと:
OnFilePrintPreview
これは印刷プレビューのコマンド ハンドラーです。既定の実装であります。:
void CView::OnFilePrintPreview(){特価;//派生クラスでは、特別なウィンドウをここで処理を実装します。//取り外しフレーム閉じる場合ウィンドウを確認してください。・これでフレームを作成する必要がありますありません。この機能よりも長生きする必要があります。CPrintPreviewState ※ pState 新しい CPrintPreviewState; =if (!。DoPrintPreview (AFX_IDD_PREVIEW_TOOLBAR、このRUNTIME_CLASS(CPreviewView)、pState)){//逆に派生クラスでは、特別なウィンドウ処理//ここでプレビュー失敗事例をTRACE0 (「エラー: DoPrintPreview が失敗しました");AfxMessageBox(AFX_IDP_COMMAND_FAILURE);pState を削除;//プレビューの失敗を初期化するには、/状態を今すぐ削除}}(&N)
DoPrintPreviewアプリケーションのメイン ウィンドウが表示されます。コントロール バー、ステータス バーなど、pState gt で指定することによって保持される;dwStatesのメンバー (個々 のコントロール バー AFX_CONTROLBAR_MASKで (AFX_IDW_MYBAR) のこのビット マスクとビットです)。ウィンドウ pState - >nIDMainPaneは自動的に非表示し、reshown は、ウィンドウ。DoPrintPreviewは、[プレビューの標準の UI で、ボタン バーを作成します。特別なウィンドウ処理が必要な場合などをDoPrintPreviewする前に行う必要があります、他のウィンドウを表示または非表示すると呼ばれる。
印刷プレビューを終了すると、既定では、コントロール バーにその元の状態と、メイン ウィンドウが表示に戻ります。特別な処理が必要な場合は、それのオーバーライドで行う必要がありますEndPrintPreview 。DoPrintPreviewが失敗した場合は、特別な処理も提供します。
DoPrintPreview が呼び出される:
注特価;別のビュー、またはビュー クラスの印刷サポートが必要な場合は、そのオブジェクトへのポインターを 2 番目のパラメーターとして渡される必要があります。(&N)。
EndPrintPreview
これは、印刷プレビュー モードを終了すると呼ばれます。多くの場合最終印刷プレビューで表示されたドキュメントのページに移動することをお勧めします。EndPrintPreviewは、アプリケーションの機会です。PInfo gt;m_nCurPageメンバー最終ページ (左 2 つのページが表示された場合)、表示あり、ポインターはページで、ユーザー興味があったにヒントアプリケーションのビューの構造はフレームワークには、あなたの選択のポイントに移動するコードを提供する必要があります。(&G)。
CView::EndPrintPreviewを呼び出す前にほとんどのアクションを実行する必要があります。この呼び出しはDoPrintPreviewの効果を反転し、pView、pDC、および pInfo 削除します。
//ここで、さらにクリーンアップを行う必要があります。CView::EndPrintPreview (pDC、pInfo、ポイント、pView)
CWinApp::OnFilePrintSetup
これは、プリンターの設定メニュー項目を割り当てる必要があります。ほとんどの場合、実装をオーバーライドする必要はありません。
ページ名称
別の問題がページ番号付けの順序です。簡単なワード プロセッサ アプリケーションの場合、これは難しい問題です。ほとんどのシステムで印刷プレビュー印刷された各ページがドキュメント内の 1 つのページに対応するいると仮定します。
一般的なソリューションを提供しようとするで、あるいくつかのことを考慮します。CAD システムを想像します。ユーザーいくつかの E サイズ シート カバーを描画しています。E サイズの (またはより小さな縮小) プロッター、ページ番号が簡単な場合と同様に。しかし、レーザー プリンター、16 A サイズのページ 1 枚の用紙、印刷何印刷プレビュー「ページ」考慮は?
導入の段落を示すように、印刷プレビュー、プリンターのように動作します。したがって、ユーザー何が選択されている特定のプリンタの参照できます。どのようなイメージの各ページに印刷が決まりますビューです。
ページ記述文字列、 CPrintInfo構造体を 1 つ数ページ (「ページ 1」または「ページ 1-2」) として表現できる場合、ユーザーにページ番号を表示する手段を提供します。この文字列は、 CPreviewView::OnDisplayPageNumberの既定の実装で使用されます。別のディスプレイが必要な場合は、1 つ、たとえば、「Sheet1、セクション A、B」を提供するこのの仮想関数をオーバーライド可能性があります。
番号順テクニカル ノート|nbsp;カテゴリ別テクニカル ノート(&N)